如何通过接口指针

时间:2017-04-21 11:39:02

标签: delphi pointers methods interface direct3d9

我有一个指向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;

0 个答案:

没有答案