我正在编写一个 DLL,它通过更改注入进程的 VMT 中所需的指针来挂钩某些 D3D 函数。算法是这样的:
- 获取一个虚拟窗口句柄。
- 初始化一个虚拟 D3D 对象,创建一个 D3D 设备。
- 获取所需的偏移量(VMT - D3D 基地址)。
- 销毁 D3D 对象和窗口句柄。
- 获取注入进程的 D3D*.dll 基础。
- 构造实际的 VMT 指针(偏移量 + 基数)。
- 在进程堆中搜索它们。
- 如果找到 - 将指针更改为我自己的。
它在应用程序中完全正常工作,我在其中初始化 D3D,启动绘图循环,然后触发挂钩过程,但它不能从 DLL 工作 - 由于某种原因,它在尝试使用最后一个错误代码创建虚拟设备时崩溃= 126(“找不到指定的模块”,尽管 D3D*.dll 加载正确)。
我知道同时只能启动一个 D3DDevice,但在我的测试应用程序中,我可以创建更多的 1 - 只有 1 个作品,但我仍然可以获取 VMT。
所以,问题是 - 从 EXE 和 DLL 运行相同的代码有什么区别?