【问题标题】:D3D->CreateDevice() fails inside an injected DLLD3D->CreateDevice() 在注入的 DLL 中失败
【发布时间】:2012-08-08 22:00:42
【问题描述】:

我正在编写一个 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 运行相同的代码有什么区别?

【问题讨论】:

    标签: c++ dll code-injection direct3d


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这里没有针对这个特定问题的其他帖子,我在网上找不到它。我无法发表评论,我想添加我的进度,所以如果我无法解决它,下一个人可以在他尝试搜索之前找到其他人的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多