休止状態からのウェイクと高速スタートアップの区別

Windows には、次の 3 つのスタートアップ モードがあります。

  • コールド スタート (従来型)
  • 休止状態からの復帰
  • 高速 (Windows 8 で導入された、最初の 2 つを兼ね備えたモード)

カーネル モードのデバイス ドライバーは、システム電源 IRP を確認して、高速スタートアップと休止状態からの復帰を区別します。

コールド スタートアップ中、ブート ローダーは、Windows カーネル ファイルのセクションをメモリに読み込んでリンクすることで、カーネル メモリ イメージを構築します。 次に、カーネルはコア システム機能を構成し、コンピューターに接続されているデバイスを列挙して、それらのドライバーを読み込みます。

これに対し、高速スタートアップでは、休止状態ファイル (Hiberfil.sys) をメモリに読み込むだけです。 高速スタートアップでは、コールド スタートアップよりも大幅に所要時間が短縮されます。

高速起動からの復帰か、休止状態からの復帰かをドライバーが判断するには、コンピューターが S0 (動作中) 状態に入っていることをドライバーに通知するシステム セット電源 (IRP_MN_SET_POWER) IRP の情報を確認します。 この IRP のドライバーの I/O スタック位置にある Power メンバーには、電源に関する情報が保持されています。 Windows Vista 以降、Power メンバー構造体には SystemPowerStateContext メンバーが含まれています。これは、以前のシステム電源状態に関する情報が格納された SYSTEM_POWER_STATE_CONTEXT 構造体です。 この情報は、SYSTEM_POWER_STATE_CONTEXT 構造体のビット フィールドでエンコードされています。

SYSTEM_POWER_STATE_CONTEXT 構造体のほとんどのビット フィールドはシステム用に予約されており、ドライバーに対して不透明です。 ただし、この構造体には TargetSystemStateEffectiveSystemState の 2 つのビット フィールドが含まれています。このフィールドは、ドライバーが読み取って、高速スタートアップや休止解除が発生したかどうかを判断できます。

TargetSystemStateEffectiveSystemState のビット フィールドには、SYSTEM_POWER_STATE 列挙値が設定されます。 TargetSystemState = PowerSystemHibernate かつ EffectiveSystemState = PowerSystemHibernate の場合、休止状態からのウェイクが発生します。

TargetSystemState = PowerSystemShutdown かつ EffectiveSystemState = PowerSystemHibernate の場合は、高速起動が発生します。

TargetSystemState ビット フィールドは、コンピューターがシャットダウンまたは休止状態に入る前に、ドライバーがシステム電源 IRP を受け取った最後のシステム電源状態の遷移を指定します。 EffectiveSystemState ビット フィールドは、ユーザーがデバイスについて認識した以前の有効なシステム電源状態を示します。 たとえば、ドライバーが 休止状態へのシステム遷移が保留中である旨の通知を受け取ったが、その後ハイブリッド シャットダウンが発生した場合、TargetSystemStateEffectiveSystemState の値が一致しない可能性があります。

詳細については、「SYSTEM_POWER_STATE_CONTEXT 構造体 (wdm.h)」を参照してください。

高速スタートアップの準備

高速起動を準備するために、Windows は完全なシャットダウン シーケンスを実行し、休止状態ファイルを保存します。

  1. 完全なシャットダウンと同様に、Windows はまずすべてのアプリケーションを閉じ、すべてのユーザー セッションをログオフします。 この段階では、アプリケーションは実行されていませんが、Windows カーネルが読み込まれ、システム セッションが実行されています。
  2. 次に、電源マネージャーはシステム電源 IRP をデバイス ドライバーに送信して、休止状態に向けてデバイスを準備するように指示します。
  3. 最後に、Windows はカーネル メモリ イメージ (読み込まれたカーネル モード ドライバーを含む) を Hiberfil.sys に保存し、コンピューターをシャットダウンします。

コールド スタートアップか休止状態からの復帰かで、デバイスのドライバーによるデバイス設定が異なる場合、このドライバーは、高速スタートアップの後、コールド スタートアップが発生した場合と同じ方法でデバイスを設定する必要があります。 たとえば、システムが提供する NDIS ドライバーは、高速スタートアップではミニポート ウェイク機能を無効にしますが、休止状態からの復帰では無効にしません。