hur.cn - 华软网

 热门搜索

弱弱弱请教下 怎么取COM界面函数表的函数地址?

  作者:未知    来源:网络    更新时间:2011/6/12

引用 26 楼 lactoferrin 的回复:
HRESULT (__stdcall *_CreateDevice)(
IDirect3D9*ThisPointer
  UINT Adapter,
  D3DDEVTYPE DeviceType,
  HWND hFocusWindow,
  DWORD BehaviorFlags,
  D3DPRESENT_PARAMETERS * pPresentationParameters,
  IDirect3DDevice9 ** ppReturnedDeviceInterface
  )=(HRESULT (__stdcall*)(IDirect3D9*ThisPointer
  UINT Adapter,
  D3DDEVTYPE DeviceType,
  HWND hFocusWindow,
  DWORD BehaviorFlags,
  D3DPRESENT_PARAMETERS * pPresentationParameters,
  IDirect3DDevice9 ** ppReturnedDeviceInterface))GetProcAddress(hD3D9,"CreateDevice");
这是完全不行的
CreateDevice不是导出函数,而是以COM界面函数表提供的


比如说 我要取CreateDevice函数地址 怎么取呢 

我看了一篇文章:
http://blog.csdn.net/shenmingda/archive/2011/02/22/6200352.aspx
里面有说到
C++">pD3d9=Direct3DCreate9(SDKVersion); 
            pCreateDevice=(void*)*(DWORD*)(*(DWORD*)pD3d9+0x40); //获取CreateDevice 的地址
//CreateDevice地址是pD3d9+0x40的来的
//这个0x40是怎么来的呢
//因为我要找其他函数的地址


---华软 网友回答---
DECLARE_INTERFACE_(IDirect3D9, IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;

    /*** IDirect3D9 methods ***/
    STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;
    STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;
    STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;
    STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;
    STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;
    STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
    STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;
    STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;
    STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;
    STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;
    STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;
    STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;
    STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;
    STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
    
    #ifdef D3D_DEBUG_INFO
    LPCWSTR Version;
    #endif
};
pD3d9指向的是一个函数表的指针,这个指针指向的地方是一列函数地址
函数地址就按照上面的排放
---华软网友回复---
引用 1 楼 lactoferrin 的回复:
DECLARE_INTERFACE_(IDirect3D9, IUnknown)
{
  /*** IUnknown methods ***/
  STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
  STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  STDMETHOD_(ULO……

哈哈 列宁同志你来啦

每个函数的间距是多少啊 比如说 上面的CreateDevice上一个函数是GetAdapterMonitor
是 pD3d9+多少呢 怎么计算的啊
---华软网友回复---
你说一个指针多大
---华软网友回复---
不准确,你说地址有多宽
---华软网友回复---
难道下一个是加四上一个是减四? O_O" 
---华软网友回复---
64位的就+8-8
---华软网友回复---
引用 6 楼 lactoferrin 的回复:
64位的就+8-8
 那我就是对的啦 哈哈

我是之前学汇编神经过敏了说是4的 一个DWORD是4字节
---华软网友回复---
你应该用sizeof(void*)
---华软网友回复---
引用 8 楼 lactoferrin 的回复:
你应该用sizeof(void*)

为什么用sizeof(void*)呀
---华软网友回复---
马甲?
sizeof(void*)是地址的大小,32位就是4,64位就是8,有通用性
---华软网友回复---
引用 10 楼 lactoferrin 的回复:
马甲?
sizeof(void*)是地址的大小,32位就是4,64位就是8,有通用性

呵呵  这是我之前用的电脑里的密码记录没清除

多谢咯
---华软网友回复---
那就是同一个人
---华软网友回复---
引用 12 楼 lactoferrin 的回复:
那就是同一个人

是啊 可以这样理解

我在A楼里用电脑A 电脑A里面登陆了 本ID(objectwak)

前几天搬去B楼了 那就要换电脑啦 换了电脑B  忘记了 本ID(objectwak)的密码 所以申请了 dengchaozhu 这ID

这帖子是我下午在 B楼用电脑B IDdengchaozhu 发的帖子 然后有事离开了一直用手机回帖 现在来到了 A楼 所以用 本ID(objectwak) 回帖啦  

呵呵 理解不
---华软网友回复---
款爷,一个人霸两个楼
---华软网友回复---
引用 14 楼 lactoferrin 的回复:
款爷,一个人霸两个楼





呵呵 多谢啦
---华软网友回复---
引用 10 楼 lactoferrin 的回复:
马甲?
sizeof(void*)是地址的大小,32位就是4,64位就是8,有通用性


不对啊
IDirect3DDevice9的指针 指向的函数表:

C++">   STDMETHOD(Reset)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters) PURE;
    STDMETHOD(Present)(THIS_ CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) PURE;


C++">HRESULT MyCreateDevice(......)
{
   IDirect3DDevice9* Device =*ppReturnedDeviceInterface; //获取了指针
    ////////////
    pPresent=(void*)*(DWORD*)(*(DWORD*)Device+0x44); //得到Present地址  DetourTransactionBegin(); //Hook Present
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pPresent,MyPresent);
DetourTransactionCommit();   //HOOK Present 函数时成功的
    ///////////
     pReset=(void*)*(DWORD*)(*(DWORD*)Device+0x40); //想得到Reset的地址 可是不对啊
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pReset,MyReset);  //Hook Reset
DetourTransactionCommit();
//End MyCreateDevice

HRESULT __stdcall MyReset(IDirect3D9*ThisPointer,D3DPRESENT_PARAMETERS* pPresentationParameters)
{
MessageBox(0,"HookReset Success",0,0);  //没弹出....
return 0;
}
}

---华软网友回复---
你没算错?
---华软网友回复---
引用 17 楼 lactoferrin 的回复:
你没算错?

....应该没算错吧

   STDMETHOD(Reset)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters) PURE;
    STDMETHOD(Present)(THIS_ CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) PURE;


是应该-4啊 +4 、-4、+8、-8 都试过了。。。 不过+ - 8 程序崩溃
---华软网友回复---
你有没有调用reset
---华软网友回复---
对不起 ...列宁同志
我真的没有想到....

我下次会注意了
---华软网友回复---
引用 19 楼 lactoferrin 的回复:
你有没有调用reset

我把 Release 看成Reset了 d3d我只看了几篇基础 呵呵
---华软网友回复---
引用 19 楼 lactoferrin 的回复:
你有没有调用reset

错不了了
	
        pRelease=(void*)*(DWORD*)(*(DWORD*)pD3d9+0xc); //0xc就是十进制的12 错不了啦
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pRelease,MyRelease);
DetourTransactionCommit();

HRESULT  __stdcall MyRelease(IDirect3D9*ThisPointer) 
{
MessageBox(0,"HookRelease Success",0,0);
return 0; //不知道为什么程序会崩溃...
 }

---华软网友回复---
你不调用原来的函数?
---华软网友回复---
引用 23 楼 lactoferrin 的回复:
你不调用原来的函数?

测试下看他弹不弹啊 他不弹就崩溃了
我的帮助文档里没有 Release函数的定义

我想应该也是 HRESULT  返回值或者是d3d9.h里的 ULONG 我都试过了
---华软网友回复---
Release的偏移是12?
---华软网友回复---
是啊
IDirect3DDevice9  and  IDirect3D9 都是12 十六进制0xc
---华软网友回复---
你怎么算的
---华软网友回复---
DECLARE_INTERFACE_(IDirect3D9, IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;

    /*** IDirect3D9 methods ***/
    STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;
    STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;
    STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;
    STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;
    STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;
    STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
    STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;
    STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;
    STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;
    STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;
    STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;
    STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;
    STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;
    STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
    
    #ifdef D3D_DEBUG_INFO
    LPCWSTR Version;
    #endif
};


最后一个CreateDevice 是0x40
pCreateDevice=(void*)*(DWORD*)(*(DWORD*)pD3d9+0x40); //CreateDevice 的地址
 十进制的64 一步步退回来算的啦
---华软网友回复---
QueryInterface是0
AddRef是4
Release是8
---华软网友回复---
你肯定数错了
---华软网友回复---
引用 29 楼 lactoferrin 的回复:
QueryInterface是0
AddRef是4
Release是8

我就是觉得有个差殊
---华软网友回复---
快沉下去 不要让人看了额
---华软网友回复---
  class="deleted_message"> 该回复于2011-06-13 10:36:08被版主删除        
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。