實現(xiàn)Window Proc Thunk:
就好像水泵一樣,我們的系統(tǒng)也需要一個泵——消息泵,也就是前面圖上的Message Driver。這個Driver的可以依靠一個Window Proc Thunk來截獲窗口消息,那么我們得先實現(xiàn)一個Window Proc Thunk。
這里我選擇的方法是拿現(xiàn)成的代碼來用,微軟ATL框架中提供有thunk的實現(xiàn),我將其提取出來稍加修改就能為我們所用了。
以下是其實現(xiàn)的一點代碼片段:
void* __stdcall AllocStdCallThunk(void);
void __stdcall FreeStdCallThunk(void*);
#pragma pack(push, 1)
class StdCallThunk_{
DWORD mov_; // mov dword ptr [esp+0x4], this_ (esp+0x4就是第一個參數(shù))
DWORD this_; //
BYTE jmp_; // jmp proc
DWORD relproc_; // relative jmp
public:
bool Init(DWORD_PTR proc, void* pThis)
{
mov_ = 0x042444C7; //C7 44 24 0C
this_ = PtrToUlong(pThis);
jmp_ = 0xe9;
relproc_ = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(StdCallThunk_)));
// 用自身更新指令緩存
return ::FlushInstructionCache(::GetCurrentProcess(), this, sizeof(StdCallThunk_)) ? true : false;
}
// 某些thunk將動態(tài)的為代碼分配內(nèi)存
void* GetCodeAddress()
{
return this;
}
void* operator new(size_t)
{
return AllocStdCallThunk();
}
void operator delete(void* pThunk)
{
FreeStdCallThunk(pThunk);
}
};
#pragma pack(pop)
下載測試工程源碼

作者: Evil.Ghost 發(fā)表于 2011-04-03 13:55 原文鏈接
評論: 0 查看評論 發(fā)表評論
最新新聞:
· 蘋果iPad 2通過3C認(rèn)證 最晚5月國內(nèi)上市(2011-04-10 09:18)
· 盲目依賴iPhone等工具導(dǎo)航 英國驢友迷路多(2011-04-10 09:14)
· 趣談:想擔(dān)任CEO的話,最好是去蘋果工作,其次是微軟,再才是Google(2011-04-10 08:26)
· 騰訊將建立新數(shù)據(jù)中心,規(guī)模為蘋果的兩倍(2011-04-10 08:25)
· 輕量化的微型博客Tumblr(2011-04-10 08:03)
編輯推薦:非戰(zhàn)之罪,從永中Office談起
網(wǎng)站導(dǎo)航:博客園首頁 我的園子 新聞 閃存 小組 博問 知識庫