6.5.4. 进程与线程

6.5.4.1. 进程

进程(Process)是一个应用程序运行的实例,包含以下一些基本组件:私有虚拟地址、可执行体程序、被操作系统分配的一份资源句柄(Handles)列表、访问控制令牌(Token)、进程标识号一个或多个线程。

访问控制令牌是用以唯一的标识所有者及其所属组以及和该进程相关联的特权(Privilege)信息。

进程创建步骤分为七步:

  • 转换并校验参数和标记

  • 打开可执行映像文件(.exe)

  • 创建Windows执行体进程对象

  • 创建初始线程(栈,上下文和 执行体线程对象等)

  • 通知Windows子系统初始化了一个进程

  • 开始运行初始线程。(除非进程创建的时候被挂起)

  • 在新进程和线程的上下文空间中,完成地址空间的初始化( 比如加载必需的DLL文件)并开始执行程序

6.5.4.2. 线程

线程(Thread)是CPU调度执行的基本单元,其包含CPU状态、两个栈、线程本地存储(TLS)、线程标识号和访问控制令牌(Access Token)。

线程的两个栈分别用于内核模式和用户模式。线程本地存储(TLS)包含一个私有存储空间,用来保存子系统、运行时库以及DLL文件等。

访问控制令牌(Access Token),用以唯一的标识所有者及其所属组以及和该线程相关联的特权(Privilege)信息

进程创建的主要过程:

  • 转换并校验参数和标记

  • 打开可执行映像文件(.exe)

  • 创建Windows执行体进程对象

  • 创建初始线程(栈,上下文和 执行体线程对象等)

  • 通知Windows子系统初始化 了一个进程

  • 开始运行初始线程(除非进程创建的时候被挂起)

  • 在新进程和线程的上下文空间中,完成地址空间的初始化( 比如加载必需的DLL文件)并开始执行程序

6.5.4.3. 数据结构

  • 每个Windows进程都是由一个执行体进程(EPROCESS)块来表示,包含与进程有关的属性及其他的相关数据结构(一个或者多个线程)。线程由执行体线程(ETHREAD) 块来表示。

  • EPROCESS块和相关的数据结构位于系统地址空间中,不过PEB (进程环境块)和TEB(线程环境块)则位于进程地址空间中