我對Microsoft Detours圖書館有幾個簡單的問題。我已經使用過它(成功),但我只是想過這個功能:Microsoft Detours - DetourUpdateThread?
LONG DetourUpdateThread(HANDLE hThread);
我在別處讀到這個函數實際上會掛起線程直到事務完成。這似乎很奇怪,因爲大多數示例代碼調用:
DetourUpdateThread(GetCurrentThread());無論如何,顯然這個函數「登記」了線程,以便當事務提交(和繞行)時,如果它們位於目標函數或蹦牀函數的重寫代碼內,它們的指令指針就會被修改「。
我的問題是:
當事務提交時,是當前線程的指令指針將成爲DetourTransactionCommit函數內?如果是這樣,我們爲什麼要打擾它更新?另外,如果入伍線程被掛起,當前線程如何繼續執行(假定大多數示例代碼調用DetourUpdateThread(GetCurrentThread());)?
最後,您可以暫停當前進程的所有線程,避免競爭條件(考慮到線程可能隨時被創建和銷燬)?也許這是在交易開始時完成的?這將允許我們更安全地枚舉線程(因爲看起來不太可能創建新線程),但CreateRemoteThread()如何?
感謝,
保羅
僅供參考,下面是摘錄從簡單的示例:
// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function. The Sleep target function is referred to
// through the TrueSleep target pointer.
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
if (dwReason == DLL_PROCESS_ATTACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueSleep, TimedSleep);
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)TrueSleep, TimedSleep);
DetourTransactionCommit();
}
return TRUE;
}
感謝分享! – Danra 2012-08-01 11:30:23