Code:
DWORD *hookVFunc(DWORD *vtable, int index, DWORD *newFunction)
{
DWORD dwOldProt, *oldFunc;
VirtualProtect(&vtable[index], 4, PAGE_EXECUTE_READWRITE, &dwOldProt);
oldFunc=(DWORD*)vtable[index];
vtable[index]=(DWORD)newFunction;
VirtualProtect(&vtable[index], 4, dwOldProt, &dwOldProt);
return oldFunc;
}
A bit of a mess, but it works
Example usage:
Code:
UINT (__stdcall *oGetAdapterCount)(void);
UINT __stdcall xGetAdapterCount(void)
{
MessageBox(0, L"hooked", L"hook", MB_OK);
return oGetAdapterCount();
}
int main()
{
HANDLE hDll = LoadLibrary(L"d3d9.dll");
IDirect3D9 *pD9 = Direct3DCreate9(D3D_SDK_VERSION);
//the index of GetAdapterCount is 4
oGetAdapterCount = (UINT (__stdcall *)(void))hookVFunc(*(DWORD**)pD9, 4, (DWORD*)&xGetAdapterCount);
pD9->GetAdapterCount();
system("pause");
return 1;
}
Have fun?
~ Hell