我必须在游戏中进行一些内存读取和一些注射。但是,为了避免竞争条件,我需要将ASM代码注入到endscene中。
在此之前,我使用了以下代码:
uint D3D9_Device;
D3D9_Device = Memory.Read<uint>(Memory.BaseAddress + Direct3D9__Device);
D3D9_Device = Memory.Read<uint>(D3D9_Device + Direct3D9__Device__OffsetA);
D3D9_Device = Memory.Read<uint>(D3D9_Device);
D3D9_Device = Memory.Read<uint>(D3D9_Device + Direct3D9__Device__OffsetB);访问Dx9设备,并使用反向偏移查找endscene。
然而,在Windows7中,directx 11是强制的,这意味着读取失败并给出一个空对象。
你知道当DirectX 11正在使用的时候,我该如何在游戏的结束场景中执行一个钩子吗?
发布于 2010-12-02 19:10:06
您应该将GetProcAddress和对D3DCreate的调用挂起,捕获设备指针并从那里挂起VFTable。我不知道你是如何“反转”COM vftable偏移量的(这些偏移量是由如何构建的COM dll预定义的,你只需要对DX头文件中定义的虚方法进行计数,从0开始,然后乘以sizeof(INT_PTR)得到偏移量),但你读取它们的方式看起来也是错误的(你已经有了太多的间接地址)。
试着看看像MSDetours这样的东西,它有一个关于COM对象挂钩的例子。你也可以给this question一个通读
https://stackoverflow.com/questions/4332248
复制相似问题