2012-03-31 10 views
3

SetCooperativeLevel 함수를 DirectDraw 개체에 연결하려고합니다. 내 목표는이 질문에 하나 비슷하지만 API Hook on a COM object function? 유일한 문제는 IDirectDraw의 정확한 오프셋을 모른다는 것입니다. SetCooperativeLevel에 대한 vtable. 어쨌든 <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을 상속 받았으며 이미 세 가지 메소드가 나열되어 있습니다. IDL에서는 그렇지 않습니다. –

답변

2

내 질문에 답하기 : vtable은 인터페이스 함수가 ​​선언 된 순서와 똑같은 순서로 배치됩니다.

+0

예. 기본적으로 두 가지를 알아야합니다. 실제 순서는 선언의 순서 (상속 된 인터페이스 esp. IUnknown 포함)이며 특정 호출로 바이너리를 작성하고 중단 점을 설정하고 디스 어셈블리 및 빠른 조회로 전환 할 수 있습니다. 인덱스가 특정 메소드에 대해 생성 된 컴파일러를 확인합니다. –