sanxcoo

做一个耐得住寂寞的人
posts - 1, comments - 8, trackbacks - 0, articles - 0

2010年4月1日

在网上查了一些资料,做了一个Thunk模板,能够正确调用成员函数。但是在做取成员函数地址操作时比较麻烦,需要用到汇编。
//取成员函数地址
DWORD_PTR off = 0;
_asm
{
   mov eax, Class::MemFunc
   mov DWORD PTR [off], eax
}
每指定一个成员函数作为一个回调函数就要做如上操作。本想将Class和MemFunc作为两个参数定义一个宏包含汇编语言部分,
但不知道怎样编写汇编部分。如果有知道怎么编写的,希望能不吝赐教^_^

// Thunk 具体实现
#pragma pack( push, 1 )
struct Thunk_struct
{
 BYTE  op_movecx;  // as operation "mov" in asm
 DWORD_PTR val_ecx;
 BYTE  op_call;  // as operation "jmp" in asm
 DWORD_PTR val_address;
};
#pragma pack( pop )

template < class TCallback, class TClass >
class Thunk
{
public:
 TCallback MemFuncToCallback( TClass* pObject, DWORD_PTR pMemFuncAddress )
 {
  // 0xB9是“mov ecx, 数值”的机器码
  m_thunk.op_movecx = 0xB9;
  // 将对象指针pObject赋值给ecx
  m_thunk.val_ecx = (DWORD_PTR)pObject;
  // 0xE9是“jmp 相对地址”的机器码
  m_thunk.op_call = 0xE9;
  // 利用成员函数的具体地址pMemFuncAddress计算jmp的相对地址
  m_thunk.val_address = pMemFuncAddress - ((DWORD_PTR)(&m_thunk.val_address) + sizeof(DWORD_PTR));

  return (TCallback)&m_thunk;
 };

protected:
 Thunk_struct m_thunk;
};

posted @ 2010-04-01 14:25 Sanxcoo 阅读(1105) | 评论 (8)编辑 收藏