Windows 线程(五) 线程启动到死亡
线程启动
当我们进程中的某一个线程调用CreateThread后
创建一个线程的内核对象
使用计数
- 启动后使用计数为
2
- 启动后使用计数为
暂停计数, 它是 UINT(unsigned int) 类型
- 一个线程可以被暂停多次
- 值为
0时, 线程才会运行 - 其他的值, 线程都是暂停状态
- 启动后暂停计数为
1
退出代码
- 启动后退出代码为
STILL_ACTIVE
- 启动后退出代码为
信号状态
- 启动后是
FALSE
- 启动后是
线程上下文(CONTEXT)
- 启动后为 NULL
创建线程的
栈空间- 该空间在进程的内存空间中
- 栈的第一个值是 lpParam
- 栈的第二个值是 lpfnAddr
填充线程上下文(CONTEXT结构体)
- 它是一个结构体
- 位于WinNT.h
- 保存的是
线程上一次运行时CPU的寄存器的值 EIP(IP)指令寄存器指向RtlUserThreadStart- RtlUserThreadStart函数未公开, 不能直接调用
- 它在 ntdll.dll 中, 未导出
- VOID RtlUserThreadStart(lpParam, lpfnAddr);
ESP(SP)栈寄存器指向lpfnAddr
检查CreateThread中的标志位
- 如果
dwCreationFlags参数是CREATE_SUSPENDED则暂停 - 如果不是, 则
暂停计数减一
- 如果
交由CPU调度
线程交由CPU执行
- 将CONTEXT加载入CPU寄存器(线程切换)
- 执行.......
线程结束
当进入RtlUserThreadStart函数后
- 设置SEH结构化异常
- 调用线程函数, 传递 lpParam
- 等待
线程函数返回 - 返回后, 调用
ExitThread, 并设置线程函数返回值
未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-06-20 at 01:03 pm