#include "stdafx.h"
template<typename AT>
inline AT DynBaseAddress(AT address)
{
return (ptrdiff_t)GetModuleHandle(nullptr) - 0x400000 + address;
}
template<typename Func, typename AT>
inline void ReadCall(AT address, Func& func)
{
union member_cast
{
intptr_t addr;
Func funcPtr;
} cast;
static_assert(sizeof(cast.addr) == sizeof(cast.funcPtr), "member_cast failure!");
cast.addr = (intptr_t)address + 5 + *(int*)((intptr_t)address + 1);
func = cast.funcPtr;
}
template<typename AT, typename Func>
inline void MemoryInjectHook(AT address, Func hook)
{
union member_cast
{
intptr_t addr;
Func funcPtr;
} cast;
static_assert(sizeof(cast.addr) == sizeof(cast.funcPtr), "member_cast failure!");
cast.funcPtr = hook;
*(int*)((intptr_t)address + 1) = static_cast<int>(cast.addr - (intptr_t)address - 5);
}
static LARGE_INTEGER FrameTime;
__declspec(safebuffers)int GetTimeSinceLastFrame()
{
LARGE_INTEGER curTime;
QueryPerformanceCounter(&curTime);
return int(curTime.QuadPart - FrameTime.QuadPart);
}
static int(*RsEventHandler)(int, void*);
int NewFrameRender(int nEvent, void* pParam)
{
QueryPerformanceCounter(&FrameTime);
return RsEventHandler(nEvent, pParam);
}
class TestFrameShit
{
public:
TestFrameShit()
{
ReadCall(0x6004A2, RsEventHandler);
MemoryInjectHook(0x6004A2, NewFrameRender);
MemoryInjectHook(0x600449, GetTimeSinceLastFrame);
}
} lol;