PoEdu培训 Windows班 第二十四课 Windows 线程(五) 线程启动到死亡
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第二十四课 Windows 线程(五) 线程启动到死亡

文章类别: 培训笔记 0 评论

Windows 线程(五) 线程启动到死亡

线程启动

当我们进程中的某一个线程调用CreateThread

  1. 创建一个线程的内核对象

    • 使用计数

      • 启动后使用计数为2
    • 暂停计数, 它是 UINT(unsigned int) 类型

      • 一个线程可以被暂停多次
      • 值为0时, 线程才会运行
      • 其他的值, 线程都是暂停状态
      • 启动后暂停计数为1
    • 退出代码

      • 启动后退出代码为STILL_ACTIVE
    • 信号状态

      • 启动后是FALSE
    • 线程上下文(CONTEXT)

      • 启动后为 NULL
  2. 创建线程的空间

    • 该空间在进程的内存空间中
    • 栈的第一个值是 lpParam
    • 栈的第二个值是 lpfnAddr
  3. 填充线程上下文(CONTEXT结构体)

    • 它是一个结构体
    • 位于WinNT.h
    • 保存的是线程上一次运行时CPU的寄存器的值
    • EIP(IP)指令寄存器 指向 RtlUserThreadStart

      • RtlUserThreadStart函数未公开, 不能直接调用
      • 它在 ntdll.dll 中, 未导出
      • VOID RtlUserThreadStart(lpParam, lpfnAddr);
    • ESP(SP)栈寄存器 指向 lpfnAddr
  4. 检查CreateThread中的标志位

    • 如果dwCreationFlags参数是CREATE_SUSPENDED则暂停
    • 如果不是, 则暂停计数减一
  5. 交由CPU调度

    • 线程交由CPU执行

      • 将CONTEXT加载入CPU寄存器(线程切换)
  6. 执行.......

线程结束

当进入RtlUserThreadStart函数后

  1. 设置SEH结构化异常
  2. 调用线程函数, 传递 lpParam
  3. 等待线程函数返回
  4. 返回后, 调用ExitThread, 并设置线程函数返回值

未完待续...

如有错误,请提出指正!谢谢.

回复