我正在编写一个DLL,该DLL通过更改注入(inject)过程的VMT中所需的指针来挂钩某些D3D功能。算法是这样的:

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

  • 它在应用程序中运行完全正常,在该应用程序中,我初始化D3D,启动绘图循环,然后启动挂钩过程,但是它无法从DLL中运行-出于某种原因,它在尝试创建带有最后一个错误代码的虚拟设备时会崩溃= 126(“D3D * .dll正确加载,但找不到指定的模块”)。

    我知道同一时间只能启动一个D3DDevice,但是在我的测试应用中,我可以创建1个以上的D3DDevice-只有1个作品,但是我仍然可以抓取VMT。

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

    最佳答案

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

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

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

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

    10-06 06:57