每个线程都有自己的一组CPU寄存器,称为线程的上下文。线程的这组CPU寄存器保存在一个CONTEXT结构中。CONTEXT结构本身则包含在线程的内核对象中。
指令指针和堆栈指针寄存器是线程的上下文中两个最重要的寄存器。记住,线程总是在进程的上下文中运行的。因此这些地址都是用于标识拥有线程的进程地址空间的内存。当线程的内核对象被初始化时,CONTEXT结构的堆栈指针寄存器被设置为线程堆栈上用来放置pfnStartAddr的地址。指令指针寄存器被置为BaseThreadStart的函数的地址。
void BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr,PVOID pvParam)
{
__try
{
ExitThread((pfnStartAddr)(pvParam));
}
__except(UnhandledExceptionFilter(GetExceptionInformation()))
{
ExitProcess(GetExceptionCode());
}
}
当新线程执行BaseThreadStart函数的时候
1、在线程函数中建立一个结构化异常处理(SEH)帧,这样,在线程执行时产生的任何异常情况都会得到系统的默认处理
2、系统调用线程函数的时候,并将你传递给CreateThread函数的pvParam参数传给它
3、当线程函数返回的时候,BaseThreadStart调用ExitThread,并将线程函数的返回值传递给它。该线程内核对象的使用计数被递减,线程停止执行。
4、如果该线程产生一个没有处理的异常条件,由BaseThreadStart函数建立的SEH帧将负责处理该异常条件。通常情况下,这意味着向用户显示一个消息框,并且在用户撤销