D3D-> CreateDevice()在注入的DLL中失败

时间:2012-08-12 10:03:22

标签: c++ dll code-injection direct3d

我正在编写一个DLL,它通过更改注入进程的VMT中的所需指针来挂钩某些D3D函数。 algorythm就像:

  1. 获取虚拟窗口句柄。
  2. 创建一个dummmy D3D对象,创建一个D3D设备。
  3. 获取所需的偏移量(VMT - D3D基地址)。
  4. 销毁D3D对象和窗口句柄。
  5. 获取注入过程的D3D * .dll基础。
  6. 构造实际的VMT指针(偏移量+基数)。
  7. 在流程堆中搜索它们。
  8. 如果找到 - 将指针更改为我自己的指示。
  9. 它在应用程序中工作得很好,我初始化D3D,启动绘图循环然后触发挂钩程序,但它不能从DLL工作 - 由于某种原因它在尝试创建虚拟设备时崩溃最后一个错误代码= 126(“无法找到指定的模块”,但D3D * .dll正确加载。)

    我知道在同一时刻只能有一个D3DDevice,但在我的测试应用程序中,我可以创建更多的1 - 只有1个作品,但我仍然可以抓住VMT。

    所以,问题是 - 从EXE和DLL运行相同的代码有什么区别?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我认为可能是我们需要使用创建第一个(主线程)的相同线程创建设备。

我在创建设备时尝试了所有不同的参数组合。我尝试了不同的DX9应用程序/游戏。

我发现主线程假设不正确。我更新了DX示例的代码并添加了我自己的代码以在辅助线程上运行,并且它没有任何问题。我还有一些想法,我会尝试。并更新回来

问题发生在我身上,因为我是从DllMain调用CreateDevice(),根据Dll Best Practices禁止调用任何可能有线程交叉的函数,这将导致死锁,这是什么发生在这里。解决方案是follow this answer here.