gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:21 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

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

关于c++ - D3D->CreateDevice() 在注入(inject)的 DLL 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com