LONG DetourUpdateThread(HANDLE hThread);
Ich habe gelesen an anderer Stelle, dass diese Funktion den Thread tatsächlich anhält, bis die Transaktion abgeschlossen ist. Das scheint seltsam, da die meisten Beispielcodes Folgendes aufruft:
DetourUpdateThread(GetCurrentThread());
Wie auch immer, anscheinend „registriert“ diese Funktion Threads, sodass Wenn die Transaktion festgeschrieben wird (und die Umwege gemacht werden), werden ihre Anweisungszeiger geändert, wenn sie „innerhalb des umgeschriebenen Codes entweder in der Zielfunktion oder der Trampolinfunktion“ liegen.
Meine Fragen sind :
Wenn die Transaktion festgeschrieben wird, befindet sich der Anweisungszeiger des aktuellen Threads innerhalb der DetourTransactionCommit-Funktion? Wenn ja, warum sollten wir uns dann die Mühe machen, ihn zur Aktualisierung anzumelden?
Außerdem, wenn die eingetragenen Threads angehalten sind, wie kann der aktuelle Thread dann weiter ausgeführt werden (vorausgesetzt, dass die meisten Beispielcodes DetourUpdateThread(GetCurrentThread ());)?
Könnten Sie abschließend alle Threads für den aktuellen Prozess anhalten und so Race Conditions vermeiden (wenn man bedenkt, dass Threads jederzeit erstellt und zerstört werden könnten)? Vielleicht geschieht dies zu Beginn der Transaktion? Dies würde es uns ermöglichen, Threads sicherer aufzuzählen (da es weniger wahrscheinlich erscheint, dass neue Threads erstellt werden könnten), obwohl was ist mit CreateRemoteThread()?
Zu Referenzzwecken finden Sie hier einen Auszug aus dem einfaches Beispiel:
Code: Select all
// 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;
}