pau*_*543 6 c++ windows multithreading detours
我有一些关于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;
}
Run Code Online (Sandbox Code Playgroud)
多么尴尬:我忘记了源代码可用!
DetourUpdateThread默默地忽略当前线程的登记.否则,给定的线程被挂起.我想知道为什么所有代码示例都要登记当前的线程!这回答了前两个问题.
关于第3个问题:我找到了另一个绕行库,试图通过执行以下操作来挂起所有线程:
获取所有线程的快照
循环快照并挂起我们尚未挂起的线程.
如果线程被挂起,那么返回1(我们仍然跟踪我们已暂停的线程).如果没有线程被暂停,那么我们就完成了.
我认为假设如果我们可以循环遍历所有线程并且它们都已经被挂起(即从我们拍摄快照之前),那么就不会再创建线程了.虽然不太确定CreateRemoteThread!
编辑:Re:CreateRemoteThread.
"进程中只有一个线程可以一次进入DLL初始化或分离例程." CreateRemoteThread"导致调用进程中每个DLL的入口点". http://msdn.microsoft.com/en-us/library/ms682437%28VS.85%29.aspx
如果您处于DllMain函数中,则新线程无法开始执行(只要新线程尚未导致调用进程中每个DLL的入口点).因此,如果您在DllMain函数中应用绕行,您可能只是在创建新远程线程的竞争条件并且在重写的目标/ trampoline函数中具有其指令指针时是安全的.
谢谢,
保罗
归档时间: |
|
查看次数: |
2599 次 |
最近记录: |