我遵循了本教程:DirectX 9.0通过C++注射挂钩。因此,程序在进程启动时创建一个远程线程,注入我的钩子,调用它的DllMain并钩住Direct3D9Create函数。绕行蹦床是用于Direct3DCreate9挂钩。对整个Direct3D接口和设备接口进行封装。当游戏调用Direct3D9Create时,它应该调用我的钩子函数而不是原始函数。这就是问题所在,因为游戏从不调用钩子函数。但是,当我从dll中调用Direct3DCreate时,就会调用钩式函数。这是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,因此在Direct3DCreate完成后不能调用DllMain。我尝试从dll手动调用CreateDevice函数,并且它也被正确地重定向,但是游戏本身从来没有进行调用。如果不首先将CreateDevice函数调用重定向到我的dll上,游戏怎么会启动呢?我试过几个dx9游戏,都是一样的。我遗漏了什么?
发布于 2013-11-29 15:40:18
我猜你是想为你的游戏做屏幕捕捉。如果您想要生成一个稳定的代码(不仅仅是为了学习目的),请使用Direct3DHook而不是处理API挂钩。
编辑:
要获得更多的控制,请使用EasyHook。Direct3DHook在幕后使用EasyHook,除非您只是玩API挂钩.
发布于 2013-11-29 16:52:18
一些猜测。
https://stackoverflow.com/questions/20274754
复制相似问题