调试进入createc文件中的PsCreateProcess函数,在此函数中才开始执行创建进程的各项操作。
(5)调试PspCreateProcessE
viro
me
t函数的步骤如下:
1)在PsCreateProcess函数中找到调用PspCreateProcessE
viro
me
t函数的代码行(createc文件的第163行),并在此行添加一个断点。
2)按F5继续调试,到此断点处中断。3)按F11调试进入PspCreateProcessE
viro
me
t函数。由于PspCreateProcessE
viro
me
t函数的主要功能是创建进程控制块并初始化其中的部分信息,所以在此函数的开始,定义了一个进程控制块的指针变量NewProcess。在此函数中查找到创建进程控制块的代码行(createc文件的第418行)
(5)按照下面的步骤调试进程控制块的创建过程:
1)在调用ObCreateObject函数的代码行(createc文件的第418行)添加一个断点。2)按F5继续调试,到此断点处中断。3)按F10执行此函数后中断。4)此时为了查看进程控制块中的信息,将表达式NewProcess添加到“监视”窗口中。
5)将鼠标移动到“监视”窗口中此表达式的“值”属性上,会弹出一个临时窗口,在临时窗口中会按照进程控制块的结构显示各个成员变量的值(可以参考PROCESS结构体的定义)。由于只是新建了进程控制块,还没有初始化其中成员变量,所以值都为0。
7
f(6)接下来调试初始化进程控制块中各个成员变量的过程:
1)首先创建进程的地址空间,即4G虚拟地址空间。在代码行(createc文件的第437行)NewProcessPasMmCreateProcessAddressSpace添加一个断点。
2)按F5继续调试,到此断点处中断。3)按F10执行此行代码后中断。4)在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4G虚拟地址空间。
5)使用F10一步步调试PspCreateProcessE
viro
me
t函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视”窗口中NewProcess表达式的值,观察进程控制块中哪些成员变量是被哪些代码初始化的,哪些成员变量还没有被初始化。
(1)
(2)8
f(3)(5)(7)(9)
(4)
(6)
(8)
(10)9
f(11)6)当从PspCreateProcessE
viro
me
t函数返回到PsCreateProcess函数后,停止按F10。此时“监
视”窗口中已经不能再显示表达式NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。
7)接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。当调试到PsCreateProcess函数的最后一行代码时,查看r