我按照这个教程:DirectX 9.0 Hooking via Injection via C++。因此,程序在启动过程中创建一个远程线程,注入我的钩子,调用它的DllMain并挂钩Direct3D9Create函数。 Detour Trampoline用于Direct3DCreate9挂钩。整个Direct3D接口和设备接口被封装。当游戏调用Direct3D9Create时,它应该调用我的挂钩函数而不是原来的。这是问题,因为游戏永远不会调用挂钩函数。但是,当我从dll中调用Direct3DCreate时,挂钩函数被调用。这是DllMain中:包装dx9接口和挂钩功能
...
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
HookHandle = hModule;
HookAPI();
lpReserved;
//LPDIRECT3D9 pD3d9 = Direct3DCreate9(D3D_SDK_VERSION);//if I uncomment this line, hooked function is called
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
UnhookAPI();
lpReserved;
OutputDebugString(pszMessage);
}
return TRUE;
}
...
这是包装的构造实现:
Direct3D9Wrapper::Direct3D9Wrapper(LPDIRECT3D9 pDirect3D)
{
IDirect3DDevice9 * device = (IDirect3DDevice9 *)this;
Direct3D9 = pDirect3D;
}
DLL是在游戏运行时注入的,所以Direct3DCreate不能的DllMain完成后调用。我试图从dll手动调用CreateDevice函数,并且它也被正确地重定向,但是游戏本身从不会进行调用。如何在没有将CreateDevice函数调用首先重定向到我的dll的情况下甚至可以启动游戏?我尝试了几个DX9游戏,而且都是一样的。我错过了什么?