首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包装dx9接口和挂钩函数

包装dx9接口和挂钩函数
EN

Stack Overflow用户
提问于 2013-11-28 21:07:42
回答 2查看 1.5K关注 0票数 0

我遵循了本教程:DirectX 9.0通过C++注射挂钩。因此,程序在进程启动时创建一个远程线程,注入我的钩子,调用它的DllMain并钩住Direct3D9Create函数。绕行蹦床是用于Direct3DCreate9挂钩。对整个Direct3D接口和设备接口进行封装。当游戏调用Direct3D9Create时,它应该调用我的钩子函数而不是原始函数。这就是问题所在,因为游戏从不调用钩子函数。但是,当我从dll中调用Direct3DCreate时,就会调用钩式函数。这是DllMain:

代码语言:javascript
复制
...
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; 
}
...

这是包装器构造器实现:

代码语言:javascript
复制
Direct3D9Wrapper::Direct3D9Wrapper(LPDIRECT3D9 pDirect3D) 
{       
    IDirect3DDevice9 * device = (IDirect3DDevice9 *)this;
    Direct3D9 = pDirect3D; 
}

在游戏运行时注入Dll,因此在Direct3DCreate完成后不能调用DllMain。我尝试从dll手动调用CreateDevice函数,并且它也被正确地重定向,但是游戏本身从来没有进行调用。如果不首先将CreateDevice函数调用重定向到我的dll上,游戏怎么会启动呢?我试过几个dx9游戏,都是一样的。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-29 15:40:18

我猜你是想为你的游戏做屏幕捕捉。如果您想要生成一个稳定的代码(不仅仅是为了学习目的),请使用Direct3DHook而不是处理API挂钩。

编辑:

要获得更多的控制,请使用EasyHook。Direct3DHook在幕后使用EasyHook,除非您只是玩API挂钩.

票数 1
EN

Stack Overflow用户

发布于 2013-11-29 16:52:18

一些猜测。

  • 您没有处理GetProcAddress()和LoadLibrary()变体的挂钩
  • 在加载和挂起模块时,您根本没有迭代加载的模块。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20274754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档