通用 Thunk
http://tech.ddvip.com 2008年05月25日 社区交流
内容摘要:这篇文章提出了一种基于Thunk技术,让一个成员函数成为一个回调函数的通用方法。文章主要讨论原理,同时也提供了一份实现和示例。
我们也不能修改返回地址,使它跨过“ADD ESP,N”的指令,因为这条指令并不总是紧接着CALL指令(调用caller 的CALL指令)
(比如 返回类型是double的情况)
一个可能的实现是在某个地方保存ESP,在被调用者返回后将它传送回ESP。
让我们来看看第1个实现:
ThisToCdecl 36.h1、我们将ESP保存到old_esp中。
#define __THIS_TO__CDECL_CODES()
/* MOV DWORD PTR [old_esp],ESP */
CONST CODE_FIRST(word,MOV_ESP_TO,0x2589)
CONST CODE(dword_ptr,pold_esp,&old_esp)
/* POP ECX */
CONST CODE(byte,POP_ECX,0x59)
/* MOV DWORD PTR [old_return],ECX */
CONST CODE(word,MOV_POLD_R,0x0D89)
CONST CODE(dword_ptr,p_old_return,&old_return)
/* MOV ECX,this */
CONST CODE(byte,MOV_ECX,0xB9)
CODE(dword_ptr,m_this,0)
/* CALL memFunc */
CONST CODE(byte,CALL,0xE8)
CODE(dword,m_memFunc,0)
/* MOV ESP,old_esp */
CONST CODE(byte,MOV_ESP,0xBC)
CONST CODE(dword,old_esp,0)
/* MOV DWORD PTR [ESP],old_retrun */
CONST CODE(word,MOV_P,0x04C7)
CONST CODE(byte,_ESP,0x24)
CONST CODE(dword,old_return,0)
/* RET */
CONST CODE(byte,RET,0xC3)
来源:vckbase 作者:OwnWaterloo 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……