2

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

  1. 获取一个虚拟窗口句柄。
  2. 初始化一个虚拟 D3D 对象,创建一个 D3D 设备。
  3. 获取所需的偏移量(VMT - D3D 基地址)。
  4. 销毁 D3D 对象和窗口句柄。
  5. 获取注入进程的 D3D*.dll 基础。
  6. 构造实际的 VMT 指针(偏移量 + 基数)。
  7. 在进程堆中搜索它们。
  8. 如果找到 - 将指针更改为我自己的。

它在应用程序中完全正常工作,我在其中初始化 D3D,启动绘图循环,然后触发挂钩过程,但它不能从 DLL 工作 - 由于某种原因,它在尝试使用最后一个错误代码创建虚拟设备时崩溃= 126(“找不到指定的模块”,尽管 D3D*.dll 加载正确)。

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

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

4

1 回答 1

0

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

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

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

问题发生在我身上,因为我从 DllMain 调用 CreateDevice(),根据Dll 最佳实践,禁止调用任何可能有线程相互交叉的函数,这将导致死锁,这就是这里发生的情况。解决方案是在此处遵循此答案。

于 2014-04-16T10:38:27.350 回答