我已经按照本教程:DirectX 9.0 Hooking via Injection via C++ 。因此,程序在启动过程中创建一个远程线程,注入我的钩子,调用它的DllMain并挂钩Direct3D9Create函数。 Detour Trampoline用于Direct3DCreate9挂钩。整个Direct3D接口和设备接口被包装。当游戏调用Direct3D9Create时,它应该调用我的钩子函数而不是原始函数。这是问题,因为游戏从不调用钩子函数。但是当我从dll中调用Direct3DCreate时,会调用hooked函数。这是DllMain:
...
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,因此在DllMain完成后无法调用Direct3DCreate。我试图从dll手动调用CreateDevice函数,它也被正确重定向,但游戏本身从不进行调用。如果没有首先将CreateDevice函数调用重定向到我的dll,游戏怎么能开始?我尝试了几个dx9游戏,它们都是一样的。我错过了什么?
答案 0 :(得分:1)
我猜你试图为你的游戏制作屏幕截图。 如果您想制作一个稳定的代码(不仅仅是为了学习目的),请使用Direct3DHook而不是处理API挂钩。
修改强>
要获得更多控制权,请使用EasyHook。 Direct3DHook在幕后使用EasyHook,除非您只是玩API挂钩......
答案 1 :(得分:0)
一些猜测。