快速启动与休眠唤醒的区分
05/10/2021
本文内容
Windows 有三种启动模式:
冷 (传统)
从休眠唤醒
快速 (合并了前两个,在 Windows 8)
为了区分快速启动与从休眠唤醒,内核模式设备驱动程序可以检查系统电源 IRP。
在冷启动期间,启动加载程序通过将 Windows 内核文件的各个部分加载到内存中并链接它们来构造内核内存映像。 接下来,内核配置核心系统函数,枚举附加到计算机的设备,并加载这些函数的驱动程序。
相比之下,快速启动只是将休眠文件 (Hiberfil.sys) 内存中。 快速启动往往比冷启动要少得多。
为了区分快速启动与从休眠唤醒,驱动程序可以检查系统集电源 (IRP _ MN _ SET _ POWER) IRP 中的信息,以通知驱动程序计算机已进入 S0 (工作) 状态。 驱动程序在此 IRP 中的 I/O 堆栈 位置包含 Power 成员,该成员是包含电源相关信息的结构。 从 Windows Vista 开始 ,Power 成员结构包含 SystemPowerStateContext 成员,它是一个 SYSTEM POWER STATE _ _ _ CONTEXT 结构,其中包含有关以前的系统电源状态的信息。 此信息在 SYSTEM POWER STATE _ _ _ CONTEXT 结构的位字段中进行编码。
SYSTEM _ POWER STATE _ _ CONTEXT 结构中的大多数位字段保留供系统使用,对驱动程序是不透明的。 但是,此结构包含两个位字段 :TargetSystemState 和 EffectiveSystemState, 驱动程序可以读取这些字段,以确定是发生快速启动还是从休眠唤醒。
TargetSystemState 和 EffectiveSystemState 位域设置为 系统 _ 电源 _ 状态枚举值。 如果 TargetSystemState = PowerSystemHibernate 和 EffectiveSystemState = PowerSystemHibernate,则会发生从休眠状态唤醒。
但是,如果 TargetSystemState = PowerSystemShutdown 和 EffectiveSystemState = PowerSystemHibernate,则会快速启动。
TargetSystemState 位域指定上次系统电源状态转换,驱动程序将在计算机关闭或进入休眠状态之前接收到系统电源 IRP。 " EffectiveSystemState 位" 字段指示该设备的以前的有效先前系统电源状态,如用户所示。 例如,如果驱动程序收到挂起的系统转换到休眠状态的通知,但随后发生了混合关闭,则 TargetSystemState 和 EffectiveSystemState 值可能不匹配。
准备快速启动
若要为快速启动做好准备,Windows 会执行完整的关闭序列并保存休眠文件。
首先,与完全关闭一样,Windows 会关闭所有应用程序并记录所有用户会话。 在此阶段,没有运行任何应用程序,但已加载 Windows 内核,并且系统会话正在运行。
接下来,电源管理器会将系统电源 Irp 发送到设备驱动程序,告诉他们准备设备进入休眠状态。
最后,Windows 将 (包含已加载的内核模式驱动程序) 中的内核内存映像保存 Hiberfil.sys 并关闭计算机。
如果设备的驱动程序配置设备的方式不同,具体取决于是否发生冷启动或唤醒,此驱动程序应在快速启动后,将设备配置为 "冷启动"。 例如,系统提供的 NDIS 驱动程序在快速启动时禁用微型端口唤醒功能,但在从休眠唤醒时禁用此功能。