實(shí)現(xiàn)Window Proc Thunk:
就好像水泵一樣,我們的系統(tǒng)也需要一個(gè)泵——消息泵,也就是前面圖上的Message Driver。這個(gè)Driver的可以依靠一個(gè)Window Proc Thunk來(lái)截獲窗口消息,那么我們得先實(shí)現(xiàn)一個(gè)Window Proc Thunk。
這里我選擇的方法是拿現(xiàn)成的代碼來(lái)用,微軟ATL框架中提供有thunk的實(shí)現(xiàn),我將其提取出來(lái)稍加修改就能為我們所用了。
以下是其實(shí)現(xiàn)的一點(diǎ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就是第一個(gè)參數(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將動(dòng)態(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)
下載測(cè)試工程源碼

作者: Evil.Ghost 發(fā)表于 2011-04-03 13:55 原文鏈接
評(píng)論: 0 查看評(píng)論 發(fā)表評(píng)論
最新新聞:
· 蘋果iPad 2通過(guò)3C認(rèn)證 最晚5月國(guó)內(nèi)上市(2011-04-10 09:18)
· 盲目依賴iPhone等工具導(dǎo)航 英國(guó)驢友迷路多(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)航:博客園首頁(yè) 我的園子 新聞 閃存 小組 博問(wèn) 知識(shí)庫(kù)