关于如何识别进程的主线程,存在很多疑问。一个常见的答案是没有“主”线程,所有线程都是等效的。
这是一个不正确且高度理论化的答案。线程窗口中的调试器可以以某种方式区分主线程和其他线程。我想知道,在 DLL 加载时(在 WinMain 之前),调试器是如何做到的。最终,我想得到这个线程的ID。
调试器可以显示哪个线程(如果有)源自 EXE 的入口点。这个入口点不是WinMain
,因为你的编译器需要入口点来设置它的运行时。该运行时调用您的
WinMain
。在DLL加载时(即
DllMain
)你的代码在Loader Lock下运行,此时你几乎无能为力。但是对
DLL_PROCESS_ATTACH
的调用专门发生在第一个线程上。因此,您无需执行任何操作即可找到该线程。您可以安全地使用
TlsAlloc
标记此线程以供将来使用。您也可以安全地调用
GetCurrentThreadId
,因为这是一个
kernel32
函数,它已经在
DllMain
之前加载了。