Microsoft Detours Library についていくつか簡単な質問があります。以前に(成功して)使用したことがありますが、この機能について考えただけです:
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;
}