我有一个指向IDirect3DDevice9接口的指针,包含119个方法(包括3个标准版),在d3d9.dll中实现:
我需要在接口的方法EndScene()和Present()上相对于库的开头(DLL指针)获取我的Delphi代码偏移量(以字节为单位)。
var:
g_pD3DDevice: IDirect3DDevice9;
ProcAddr: Pointer;
hD3D9: HMODULE;
Present9 : DWORD;
EndScene9: DWORD;
implemenation:
hD3D9 := LoadLibrary('d3d9');
ProcAddr := GetProcAddress(hD3D9, 'Direct3DCreate9');
...
pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, TargetHandle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);
我想,在VMT中,Present()方法是数字17(从0开始),而EndScene()是42,因为它是在库头文件中写的。
但我认为计算偏移量不是一个好主意:
Present9 := DWORD(g_pD3DDevice) + (17 * 4) - DWORD(hD3D9);
EndScene9 := DWORD(g_pD3DDevice) + (42 * 4) - DWORD(hD3D9);
我通过将DLL加载到外部进程来为Direct3D创建一个钩子注入器。我想知道Present()方法在进程中的偏移量,以进行拦截
请告诉我们,如何实现解决方案的最佳做法是什么?
UDP 30/04/2017:
我在docwiki.embarcadero.com中找到了另一个解决方案:
function GetPresentMethodPointer(const IntRef: IInterface): Pointer; assembler;
asm
mov eax, [IntRef]
add eax, vmtoffset IDirect3DDevice9.Present
mov eax, [eax]
end;