快速启动与休眠唤醒的区分

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 结构中的大多数位字段都保留供系统使用,并且对驱动程序不透明。 但是,此结构包含两个位字段 TargetSystemStateEffectiveSystemState,驱动程序可以读取这些字段,以确定是发生快速启动还是从休眠状态唤醒。

TargetSystemStateEffectiveSystemState 位字段设置为SYSTEM_POWER_STATE枚举值。 如果 TargetSystemState = PowerSystemHibernateEffectiveSystemState = PowerSystemHibernate,则发生从休眠状态唤醒。

但是,如果 TargetSystemState = PowerSystemShutdownEffectiveSystemState = PowerSystemHibernate,则会发生快速启动。

TargetSystemState 位字段指定在计算机关闭或进入休眠状态之前驱动程序收到系统电源 IRP 的最后一个系统电源状态转换。 EffectiveSystemState 位字段指示用户感知到的设备上一个有效系统电源状态。 例如,如果驱动程序收到挂起的系统转换为休眠状态的通知,但随后发生了混合关闭,则 TargetSystemStateEffectiveSystemState 值可能不匹配。

有关详细信息,请参阅 SYSTEM_POWER_STATE_CONTEXT

为快速启动做准备

为了准备快速启动,Windows 执行完整关机序列并保存休眠文件。

  1. 首先,与完全关闭一样,Windows 会关闭所有应用程序并注销所有用户会话。 在此阶段,没有应用程序正在运行,但 Windows 内核已加载,系统会话正在运行。
  2. 接下来,电源管理器将系统电源 IRP 发送到设备驱动程序,告诉它们准备设备以进入休眠状态。
  3. 最后,Windows 保存内核内存映像 (包括) Hiberfil.sys加载的内核模式驱动程序,并关闭计算机。

如果设备的驱动程序根据是否发生了冷启动或从休眠状态唤醒以不同的方式配置设备,则此驱动程序应在快速启动后配置设备,就像发生了冷启动一样。 例如,系统提供的 NDIS 驱动程序在快速启动时禁用微型端口唤醒功能,但在从休眠状态唤醒时不会禁用。