HRESULT APIENTRY hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
if (!bInit)
InitializeD3D(pDevice);
if (bInit && pDevice)
{
stCoordinates coords = GetPlayerCoordinates();
char buffer[128];
sprintf_s(buffer, "X: %.2f, Y: %.2f, Z: %.2f", coords.fX, coords.fY, coords.fZ);
DrawText(buffer, 10, 10, D3DCOLOR_ARGB(255, 255, 255, 255));
}
return oEndScene ? oEndScene(pDevice) : D3D_OK;
}
DWORD WINAPI HookThread(LPVOID lpParam)
{
//D3D
while (!pDevice)
{
pDevice = *(LPDIRECT3DDEVICE9*)0xC97C28;
Sleep(100);
}
DWORD* pVTable = *(DWORD**)pDevice;
DWORD oldProtect;
VirtualProtect(&pVTable[42], sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldProtect);
oEndScene = (HRESULT(APIENTRY*)(LPDIRECT3DDEVICE9))pVTable[42];
pVTable[42] = (DWORD)hkEndScene;
VirtualProtect(&pVTable[42], sizeof(DWORD), oldProtect, &oldProtect);
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
// pCoordinates = (stCoordinates*) ТУТ АДРЕС;
CreateThread(NULL, 0, HookThread, NULL, 0, NULL);
}
return TRUE;
}