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

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

这里没有针对这个特定问题的其他帖子,我在网上找不到它。我无法发表评论,我想添加我的进度,所以如果我无法解决它,下一个人可以在他尝试搜索之前找到其他人的位置。

以上是关于D3D->CreateDevice() 在注入的 DLL 中失败的主要内容,如果未能解决你的问题,请参考以下文章

D3D创建窗口

多次复制 Windows 桌面

DirectX9 CreateDevice 在 C 中失败,但在 C++ 中成功

D3D 线列 小样例

D3D 点列练习

使用 org.bluez.Adapter.CreateDevice 连接到 BT LE 设备失败并出现 org.bluez.Error.Failed:操作取消错误