0

我正在运行一个简单的 Windows 控制台应用程序:- 当控件位于 main 时,我转储了堆栈--

_ 我的主线程堆栈:

5840    0   Main Thread Main Thread Normal


console.exe!wmain(int argc=1, wchar_t * * argv=0x006831a0)

console.exe!__tmainCRTStartup()  

console.exe!wmainCRTStartup()

kernel32.dll!@BaseThreadInitThunk@12()

ntdll.dll!___RtlUserThreadStart@8()

ntdll.dll!__RtlUserThreadStart@8()  

__

以上很好,为什么我在启动时看到这个??:

3740    0   Worker Thread   Win32 Thread Normal

堆:

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwDelayExecution@8()
ntdll.dll!__LdrpInitialize@8()
ntdll.dll!_LdrInitializeThunk@8()
4

1 回答 1

1

LdrInitializeThunk 是设置新线程的方法。我确实用 VS2008 创建了一个普通的 Win32 控制台应用程序(没有 MFC、ATL)并且只得到一个线程。只有当我附加一个调试器时,我才会得到第二个,因为调试器会注入一个线程来启用进程的调试。进程启动在本书中详细介绍了这里,没有提到需要第二个线程。异步过程调用APC也不应受到责备。也许您的调用堆栈是在未加载所有符号的情况下创建的,并且您错误地怀疑调试器帮助程序线程是应用程序中的隐藏线程。当您在没有调试器的情况下使用进程资源管理器查看进程时,您应该只看到一个线程。

阶段 6:在新流程的上下文中执行流程初始化

KiInitializeContextThread,由KeInitializeThread调用,构建线程的初始上下文和线程的内核栈。新线程开始运行内核模式线程启动例程 KiThreadStartup。(有关导致此问题的线程启动步骤的更详细描述,请参阅“CreateThread 流程”部分。) KiThreadStartup 例程执行以下步骤:

  1. 将 IRQL 级别从 DPC/调度级别降低到 APC(异步过程调用)级别。

  2. 启用工作集扩展。

  3. 将用户模式 ​​APC 排队到新线程以执行 Ntdll.dll 内的用户模式线程启动例程 LdrInitializeThunk。

于 2011-02-13T14:24:38.477 回答