本文章记录分析进程线程管理器在windows系统引导的阶段0中的初始化工作。主要是PsInitSystem函数。
进入后首先判定是引导过程的哪个阶段:
下面来看一下PspInitPhase0的整个流程, 刚开始都是一些初始化工作, 这些工作中需要提一嘴的是对进程线程以及模块加载卸载监控的回调的初始化,熟悉反游戏外挂的人肯定对这几个接口非常熟悉。
核心是从这里开始, 创建了进程对象:
接下来创建了线程以及作业对象:
调用ExCreateHandleTable来创造一个进程句柄表, 即CID句柄表。由于这个函数会使得该表位于之前创建的全局内核句柄表链表上, 而这个CID表示属于进程拥有的。
所以调用ExRemoveHandleTable把该表从全局内核句柄表链表上摘除
接下去初始化了一个工作队列中PsReaperWorkItem类型的回调函数PspReaper, 该函数主要用于当线程结束时释放各类资源:
- 释放线程的内核栈
- 释放进程的CreateDelete锁
- 解引用进程
- 解引用自身
当前进程名设置为Idle进程,并通过调用PspCreateProcess创建了第一个进程, system进程。关于PspCreateProcess的分析留到之后,我们这里把关注点放在在引导过程中进线程管理器的初始化。现在只需要知道到这里系统中真正的第一个进程已经跑起来了就是system进程
这里调用了PsCreateSystemThread在当前的Idle进程中创建了一个线程,该线程就是阶段1的初始化函数Phase1Initialization
稍稍进去看看就会发现里面实际上调用了Phase1InitializationDiscard函数, 且传入参数Context就是之前填充的LOADER_PARAMETER_BLOCK结构体
(完)