gpt4 book ai didi

c++ - 包装 dx9 接口(interface)和 Hook 函数

转载 作者:行者123 更新时间:2023-11-28 07:15:36 25 4
gpt4 key购买 nike

我已遵循本教程:DirectX 9.0 Hooking via Injection via C++ .因此,程序在启动时在进程中创建一个远程线程,注入(inject)我的钩子(Hook),调用它的 DllMain 并 Hook Direct3D9Create 函数。 Detour Trampoline 用于 Direct3DCreate9 Hook 。包装了整个 Direct3D 接口(interface)和设备接口(interface)。当游戏调用 Direct3D9Create 时,它​​应该调用我的钩子(Hook)函数而不是原来的函数。这是问题所在,因为游戏从不调用 Hook 函数。但是当我从 dll 中调用 Direct3DCreate 时,会调用 Hook 函数。这是 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 在游戏运行时注入(inject),因此在 DllMain 完成后无法调用 Direct3DCreate。我试图从 dll 手动调用 CreateDevice 函数,它也被正确重定向,但游戏本身从未进行调用。如果不先将 CreateDevice 函数调用重定向到我的 dll,怎么可能开始游戏呢?我试了几个dx9的游戏,都是一样的。我错过了什么?

最佳答案

我猜你想为你的游戏做屏幕截图。如果你想做一个稳定的代码(不仅仅是为了学习目的),请使用 Direct3DHook而不是处理 API Hook 。

编辑:

更多控制使用EasyHook . Direct3DHook 在幕后使用 EasyHook,除非您只是玩 API Hooking...

关于c++ - 包装 dx9 接口(interface)和 Hook 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20274754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com