2012-03-31 71 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