2012-08-12 38 views
2

我正在写入一个DLL,它通过在注入的进程的VMT中更改所需的指针来挂接某些D3D函数。该算法类似于:D3D-> CreateDevice()在注入的DLL中失败

  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运行相同的代码有什么区别?

回答

0

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

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

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

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

+0

这里没有其他的帖子来解决这个问题,我在网上找不到它。我无法发表评论,我想补充我的进展,所以如果我无法解决它,下一个人可以找到他之前的其他人试图搜索的地方。 – 2014-04-17 10:47:48