2012-03-31 75 views
3

我试图挂钩DirectDraw对象中的SetCooperativeLevel函数。我的目标非常类似于这个问题中的问题API Hook on a COM object function?但是唯一的问题是我不知道SetCooperativeLevelIDirectDraw的虚拟表中的确切偏移量。无论如何,从<ddraw.h>或以编程方式收集这个?在COM接口的Vtable中查找特定函数的索引

这里是IDirectDraw的接口声明,但我不确定它如何对应于vtable。

DECLARE_INTERFACE_(IDirectDraw, IUnknown) 
{ 
    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; 
    STDMETHOD_(ULONG,AddRef) (THIS) PURE; 
    STDMETHOD_(ULONG,Release) (THIS) PURE; 
    STDMETHOD(Compact)(THIS) PURE; 
    STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR *) PURE; 
    STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR *) PURE; 
    STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *) PURE; 
    STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR *) PURE; 
    STDMETHOD(EnumDisplayModes)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK) PURE; 
    STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK) PURE; 
    STDMETHOD(FlipToGDISurface)(THIS) PURE; 
    STDMETHOD(GetCaps)(THIS_ LPDDCAPS, LPDDCAPS) PURE; 
    STDMETHOD(GetDisplayMode)(THIS_ LPDDSURFACEDESC) PURE; 
    STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD, LPDWORD) PURE; 
    STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE; 
    STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE; 
    STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE; 
    STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL) PURE; 
    STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE; 
    STDMETHOD(RestoreDisplayMode)(THIS) PURE; 
    STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE; // I'm trying to hook this 
    STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD) PURE; 
    STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE) PURE; 
}; 
+1

只计数,从0开始。所以对于32位代码是20 * 4,对于64位代码是20 * 8。留意继承的接口。这一个只继承了IUnknown,并且已经列出了3种方法。在IDL中不是典型的。 – 2012-04-01 06:58:14

回答

2

回答我的问题:V表是完全相同的顺序接口函数声明布局。

+0

是的,基本上你需要知道两件事情 - 实际的顺序是声明的顺序(包括继承的接口尤其是IUnknown),你可以用特定的调用建立一个二进制文件,设置一个断点,切换到反汇编并快速查找索引检查为特定方法生成的编译器。 – 2012-04-01 16:56:03