当调用CreateThread函数后,线程内核对象的使用计数初始化为2,暂停计数被初始化为1,退出代码被设为STILL_ACTIVE(0x103),并且对象被设为未触发状态。
一旦创建线程内核对象,系统便分配内存,供线程堆栈使用。此内存是从进程地址空间内分配的,线程没有自己的地址空间。然后系统将CreateThread函数传入的pvParam参数值放入堆栈最上端,紧接着它下方是pfnStartAddr参数的值。
每个线程都有自己的一组cpu寄存器,称为线程上下文。其反应线程上一次执行时的cpu寄存器状态。cpu寄存器状态保存在一个CONTEXT结构中,CONTEXT结构本身保存在线程内核对象中。
当线程内核对象初始化的时候,CONTEXT结构中的堆栈指针寄存器被设为pfnStartAddr在线程堆栈中的地址。而指令指针寄存器被设为RtlUserThreadStart函数(此函数是NTDLL.dll导出的)的地址。
当初始化完成后,系统会检查CREATE_SUSPENDED标识是否已被传给CreateThread函数,如果没有传递,系统将线程的挂起技术递减至0;随后,线程就可以调度给一个处理器去执行了。然后,系统在实际的cpu寄存器中加载上一次在线程context中保存的值。现在,线程可以在其进程的地址空间中执行代码并处理数据了。
RtlUserThreadStart函数是线程的实际开始执行的函数。新线程执行RtlUserThreadStart函数时,将发生:
1.设置一个结构化异常处理帧(SEH)。P159