ATL Thunk机制的一个例子

转自:http://blog.csdn.net/tttyd/article/details/4562233

//涂远东 2009 09 17 深圳
//声明函数类型。
typedef void (*TESTFUN)(void*);
//定义修改代码的结构。
#pragma pack(push,1)
struct Thunk
{
	DWORD   m_mov;          // 修改参数指令
	DWORD   m_this;         //修改后的参数
	BYTE    m_jmp;		// jmp TESTFUN,跳转指令。
	DWORD   m_relproc;	// relative jmp,相对跳转的位置。
	//初始化跳转代码。
	void Init(TESTFUN pFun, void* pThis)
	{
		//设置参数指令
		m_mov = 0x042444C7;  //C7 44 24 0C
		//设置修改后的参数
		m_this = PtrToUlong(pThis);

		//设置跳转指针。
		m_jmp = 0xe9;
		
		//设置跳转的相对地址。
		m_relproc = (int)pFun - ((int)this+sizeof(Thunk));
		//把CPU里的缓冲数据写到主内存。
		FlushInstructionCache(GetCurrentProcess(),
			this, sizeof(Thunk));
	}
};
#pragma pack(pop)
//测试动态修改内存里的指令数据。
class CTest
{
public:
	//保存动态修改代码的内存。
	Thunk m_Thunk;
	//真实运行的函数。
	static void TestFun(void* p)
	{
		CTest* pTest = (CTest*)p;
		pTest->Print();
	}
	void Print()
	{
		printf("这里仅仅是一个测试/n TestFun函数的参数被修改了/n");
	}
};

int main(int argc, char* argv[])
{
	//如下调用这个类:
	//测试运行。
	CTest Test;
	Test.m_Thunk.Init(Test.TestFun,&Test);
	TESTFUN pTestFun = (TESTFUN)&(Test.m_Thunk);
	char* psz = "test";
	pTestFun((void*)psz); 
	return 0;
}


你可能感兴趣的:(c,struct,测试,Class,byte)