【问题标题】:Find index of particular function in COM Interface's Vtable在 COM 接口的 Vtable 中查找特定函数的索引
【发布时间】:2012-03-31 19:25:34
【问题描述】:

我正在尝试在 DirectDraw 对象中挂钩 SetCooperativeLevel 函数。我的目标与这个问题API Hook on a COM object function? 中的目标非常相似,但唯一的问题是我不知道IDirectDrawSetCooperativeLevel 的vtable 中的确切偏移量。有没有可能从<ddraw.h> 或以编程方式收集这个?

这是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;
};

【问题讨论】:

  • 就数,从0开始。所以32位代码是20 * 4,64位代码是20 * 8。注意继承的接口。这个只继承了 IUnknown 并且已经列出了它的 3 个方法。在 IDL 中不是典型的。

标签: c++ com vtable directdraw


【解决方案1】:

回答我自己的问题:vtable 的布局与接口函数的声明顺序完全相同。

【讨论】:

  • 是的,基本上你需要知道两件事——实际的顺序是声明的顺序(包括继承的接口,尤其是 IUnknown),你可以用特定的调用构建二进制文件,设置断点,切换反汇编和快速查找索引,检查编译器为特定方法生成的内容。
猜你喜欢
  • 2016-04-25
  • 1970-01-01
  • 2023-04-02
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2015-03-16
  • 2018-11-22
相关资源
最近更新 更多