休止状態からのウェイクと高速スタートアップの区別
Windows には、次の 3 つのスタートアップ モードがあります。
- コールド (繁体字)
- Wake-from-hibernation
- 高速 (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構造体のほとんどのビット フィールドはシステム用に予約されており、ドライバーには不透明です。 ただし、この構造体には TargetSystemState と EffectiveSystemState という 2 つのビット フィールドが含まれています。ドライバーは、高速スタートアップまたは休止解除が発生したかどうかを判断するために読み取ることができます。
TargetSystemState ビット フィールドと EffectiveSystemState ビット フィールドは、列挙値SYSTEM_POWER_STATE設定されます。 TargetSystemState = PowerSystemHibernate と EffectiveSystemState = PowerSystemHibernate の場合、休止状態からの復帰が発生しました。
ただし、 TargetSystemState = PowerSystemShutdown と EffectiveSystemState = PowerSystemHibernate の場合、高速スタートアップが発生しました。
TargetSystemState ビット フィールドは、コンピューターがシャットダウンまたは休止状態になる前に、ドライバーがシステム電源 IRP を受け取った最後のシステム電源状態遷移を指定します。 EffectiveSystemState ビット フィールドは、ユーザーが認識したデバイスの有効な以前のシステム電源状態を示します。 たとえば、ドライバーが休止状態への保留中のシステム遷移の通知を受け取ったが、その後ハイブリッド シャットダウンが発生した場合、 TargetSystemState と EffectiveSystemState の値は一致しない可能性があります。
詳細については、「 SYSTEM_POWER_STATE_CONTEXT」を参照してください。
高速スタートアップの準備
高速スタートアップに備えるために、Windows は完全なシャットダウン シーケンスを実行し、休止状態ファイルを保存します。
- 最初に、完全なシャットダウンと同様に、Windows はすべてのアプリケーションを閉じ、すべてのユーザー セッションをログオフします。 この段階では、アプリケーションは実行されていませんが、Windows カーネルが読み込まれ、システム セッションが実行されています。
- 次に、電源マネージャーはシステム電源 IRP をデバイス ドライバーに送信して、休止状態に入るようにデバイスを準備するように指示します。
- 最後に、Windows はカーネル メモリ イメージ (読み込まれたカーネル モード ドライバーを含む) をHiberfil.sysに保存し、コンピューターをシャットダウンします。
デバイスのドライバーが、コールド スタートアップまたはスリープ解除が発生したかどうかによってデバイスの構成が異なる場合、このドライバーは、高速起動後に、コールド スタートアップが発生したかのようにデバイスを構成する必要があります。 たとえば、システム提供の NDIS ドライバーは、高速スタートアップではミニポート ウェイク機能を無効にしますが、休止状態からの復帰では無効にしません。