WINDOWS
启动和关机内幕
--Microsoft Windows Internals Fourth Edition
的读书笔记第5章
适合版本WINDOWS 2000版本以后
WINDOWS
的启动流程
第一:NTLDR的作用过程
1
.首先机器POST----
à
BIOS-
à
MBR--
à
BOOT SECTOR-
à
os
的引导程序 WINDOWS的引导程序是NTLDR注意这个文件其实是个可执行文件,这里机器主要做的工作是:CPU从16的实模式到32的保护模式,启用CPU的页机制,如果磁盘是SCSI,则加载Ntbootdd.sys来访问磁盘,否则用INT13来访问。这里假如机器没找到Ntldr这个文件,在FAT文件系统下,机器显示"BOOT: Couldn't find NTLDRP",而在NTFS下显示"NTLDR is missing"(这个没有具体实验过,是书上这么说的)
2
.NTLDR装载后就先CLS屏幕,首先检查根目录下有没有合法的Hiberfil.sys,这个文件的作用是机器休眠的时候把内存中的所有信息保存到hiberfil.sys这个文件中,这个文件的大小始终和系统的物理内存大小一致。如果希望回收这个空间,请打开“控制面板”下的“电源管理”,选择“休眠”选项卡,去掉“启用休眠”这一复选项的选中标记,系统会自动消除hiberfil.sys文件。如果有就快速启动到上次机器休眠的状态。
3
.接着处理Boot.ini,如果有多个的启动项,那就显示启动菜单(如果只有一个默认的项,那就是我们立即就可以看到WINDOWS的启动状态条了)
处理BOOT.ini WINDOWS自带的一个工具Bootcfg.exe,可以用这个工具修改,当然也可以自己用记事本打开boot.ini来修改,boot.ini的一些参数会保存在注册表HKLM\System\CurrentControlSet\Control\SystemStartOptions下。关于boot.ini里面的参数大家可以去查阅资料。
4
.下面就是NTLDR调用执行Ntdetect.com,作用是检测的一些基本设备和配置信息
信息包括:CMOS里的时间日期信息,总线类型,磁盘的大小,类型,数目,输入设备的信息,并口的信息,显卡的类型,这些信息收集后保存在HKLM\HARDWARE\DESCRIPTION下面。接着就2000版本下显示“Starting Windows”进程条,而在xp,2003下是显示WINDOWS的LOGO
5
.在显示进程条的过程中,机器实际上是在加载系统相应的内核和HAL文件,一般是Ntoskrnl.exe 和Hal.dll这2个文件,如果这个过程中发现找不到文件,则会显示"Windows could not start because the following file was missing or corrupt"这个信息。然后读取注册表SYSTEM HIVE(Windows\System32\Config\System),来决定需要加载的设备驱动,这些设备驱动都在SERVICE_BOOT_START (0)里面
6.然后加载
Ntoskrnl.exe,这样
NTLDR的使命就结束了。
第二 Ntoskrnl.exe的作用过程
这里主要分
2个阶段来初始化内核,最后创建
the Session Manager subsystem (Smss)进程。
第三 Smss的作用过程
1.创建
LPC port对象,为
MSDOS定义符号连接,例如
COM1、
LPT1,假如安装有
Terminal Services,则创建
\Sessions目录
2.运行注册表里
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute定义的程序,一般默认的是运行
Autochk
3.执行
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations表键中的延迟,删除,改名操作
4.加载
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 初始化
paging files和注册表
5.创建系统环境变量
,这些定义在
HKLM\System\CurrentControlSet\Session Manager\Environment.
6.
加载和初始化WIN32子系统的内核模块Win32k.sys
7.
创建WIN32子系统服务器进程,包括Csrss, 创建Winlogon进程。
这里的2个进程其中一个出现异常,那系统都会中断
第四 Winlogon Csrss过程
1.
加载GINA模块,默认为Msgina (\Windows\System32\Msgina.dll)
2.
启动服务进程Windows\System32\Services.exe
3.
启动Lsass(the local secyrity authentication subsystem)进程
4
.Gina开始处理交互式登陆,登陆验证成功后,Gina就运行HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Userinit,Userinit.exe执行的顺序为:首先处理HKCU\Software\Policies\Microsoft\Windows\System\Scripts 和HKLM\Software\Policies\Microsoft\Windows\System\Scripts这里的脚本,然后处理组策略(假如有的话,运行\Windows\System32\Proquota.exe),最后运行HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell里的SHELL(如果不存在就运行HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell里的,一般这里默认的是EXPLORER.exe),注意这里也是最容易让恶意软件利用的地方。
5
.最后就是启动其他的启动程序,服务。
WINDOWS
的关机流程:
正常关机都是调用ExitWindowsEx这个函数,Csrss收到这个消息后,先给Winlogon所属的窗口发关机消息,等Winlogon处理完后,Csrss然后给每个有关机级别的进程发关机消息(2种消息WM_QUERYENDSESSION/WM_ENDSESSION),这里的等待时间在HKCU\Control Panel\Desktop\HungAppTimeout这里设置,默认是5000 milliseconds,如果在这个时间范围内有线程没处理完,那就会弹出个窗口,让用户来结束,当然也可以设置让系统自动结束,只要设置HKCU\Control Panel\Desktop\AutoEndTasks 为 1就可以了,对于控制台应用程序,则Csrss发这个CTRL_LOGOFF_EVENT事件(服务进程是发CTRL_SHUTDOWN_ EVENT这个事件),同样的流程,有个等待时间,设置在HKCU\Control Panel\Desktop\WaitToKillAppTimeout (默认为 20,000 milliseconds),接着同样的处理系统进程,处理完后,Winlogon就调用NtShutdownSystem,这个函数在调用NtSetSystemPowerState来处理驱动和其他的一些子系统。这样整个关机过程就完成了。