windows核心编程之线程补充

来源:互联网 发布:税务师含金量知乎 编辑:程序博客网 时间:2024/05/18 00:05

我们来看下着张结构图
CreateThread函数创建内核对象
这里写图片描述
SP:堆栈指针寄存器
IP:指令指针寄存器(这里待会做详细讲解)
其他CPU寄存器:存放其他若干数据的寄存器
使用次数:至少为1,若打开了线程内核对象,则使用计数会加1
暂停计数:若创建线程的时候使用了CREATE_SUSPEND,则计数从1开始,每次使用SuspendThread都会时暂停计数加1,如果暂停计数为2,那么你就需要使用ResumeThread两次,让暂停计数变为0,才能让该线程处于可调度状态,这样,系统才会为该线程分类CPU时间片
退出代码:用来表明线程是活跃状态还是退出状态
已通知:这个标志一般用于等待函数,比如waitforsingleobject

大多数东西我已经说过,今天要说的是IP指针,你以为这个IP指针存放的是线程函数的地址吗,不是,它存放的是一个BaseThreadStart(未文档化)函数的指针(给这个函数传值的方法时压栈),然后把CreateThread的pvParam参数写入线程的栈中,然后把CreateThread的pfnStartAddr的线程函数地址写入栈中(PS:其实这也是绝大多数函数传递参数的方法)

也就是说,所有的线程(主线程除外)都是从BaseThreadStart开始执行的,主线程的真正的起始执行函数也不是它本身,也是类似于BaseThreadStart的函数
伪代码

void BaseThreadStart(PTHREAD_STRAT_ROUTINE pfnStartAddr,PVOID pvParam){    __try    {        ExitThread((pfnStartAddr)(pvParam));    }    __except(UnhandledExceptionFilter(GetExceptionInformation()))    {        ExitProcess(GetExceptionCode());    }}

ExitThread函数等待线程函数返回
这个函数主要是创建了一个结构化异常处理帧,可以对任何情况进行默认处理,同时,保证发生异常时,退出运行(ExitProcess)