Windows进程数据结构及创建流程

数据结构

每个Windows进程都表现为一个executive进程(EPROCESS)结构,除了包括很多进程相关的属性外,还包括一些指针。比如,每个进程都有一个或多个线程,每个线程都是executive线程(ETHREAD)结构。

EPROCESS 和大多数与其相关的数据结构存在于系统的地址空间中,有一个例外是进程的环境块PEB(process environment block ),存在于进程的地址空间中(用于被用户模式的代码访问)。另外,进程的有些数据结构用于内存管理,比如working set列表,只有在当前进程上下文才有效,因为它们存储在进程特有的系统空间内。

每个执行Win32程序的进程,Win32子系统进程(Csrss.exe)维护一个叫做CSR_PROCESS的并行的结构。最后,内核模式部分的Win32子系统(Win32k.sys)维护每个进程的数据结构,W32PROCESS。W32PROCESS结构在线程第一次调用Windows USER函数或GDI函数时创建。

下图是进程和线程数据结构的简化图表:

Windows进程数据结构及创建流程_第1张图片

下图是EPROCESS 的结构.

Windows进程数据结构及创建流程_第2张图片

类似于内核API和组件划分成独立两部分并且分层成模块的方式,进程的数据结构也差不多的设计。

下图是PEB的数据结构:

Windows进程数据结构及创建流程_第3张图片

下图是CSR_PROCESS的数据结构:

Windows进程数据结构及创建流程_第4张图片


进程的创建流程

因为Windows是多环境子系统架构,创建一个executive进程对象与创建子系统进程是分开的。下面总结了CreateProcess()函数的几个主要步骤,每个步骤的可能是由CreateProcess()函数自己操作的,也可能是NtCreateProcess()函数或者它在内核模式下的辅助函数。当应用程序调用CreateProcess,CreateProcessAsUser,CreateProcessWithTokenW,CreateProcessWithLogonW等系统函数时,Windows子系统进程就被创建了。下面是具体步骤:
  1. 验证参数,将Windows子系统标记和选项转换成native对应的部分。
  2. 打开 进程中要被执行的image文件(.exe)。
  3. 创建Windows executive进程对象。
  4. 创建初始化线程(栈,上下文,Windows executive线程对象)。
  5. 初始化进程。
  6. 开始执行初始化线程。
  7. 完成地址空间的初始化,开始执行程序。
Windows进程数据结构及创建流程_第5张图片



你可能感兴趣的:(Windows,内核原理)