休止状態からのウェイクと高速スタートアップの区別
Windows には、次の3つのスタートアップモードがあります。
- コールド (従来の)
- 休止状態からの復帰
- Fast (最初の2つを組み合わせ、Windows 8 で導入)
高速スタートアップを休止状態から区別するために、カーネルモードデバイスドライバーはシステムの 電源 irpを調べることができます。
コールド起動中、ブートローダーは、Windows カーネルファイルのセクションをメモリに読み込み、それらをリンクすることで、カーネルメモリイメージを構築します。 次に、カーネルはコアシステム関数を構成し、コンピューターに接続されているデバイスを列挙し、ドライバーを読み込みます。
これに対して、高速スタートアップは単に休止状態ファイル (Hiberfil.sys) をメモリに読み込みます。 高速スタートアップは、コールドスタートよりも大幅に時間がかかる傾向があります。
復帰と休止状態からの高速スタートアップを区別するために、ドライバーは、コンピューターが S0 (動作) 状態になったことをドライバーに通知する system set-power (IRP_MN_SET_POWER) IRP 内の情報を検査できます。 この IRP 内のドライバーの i/o スタックの場所 には、電源に関連する情報を含む構造体である 電源 メンバーが含まれています。 Windows Vista 以降では、電源メンバー構造に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 = powersystemshutdownの場合、高速スタートアップが発生しました。
Targetsystemstateビットフィールドは、コンピューターがシャットダウンまたは休止状態になる前に、ドライバーがシステム電源 IRP を受信した最後のシステム電源状態の移行を指定します。 EffectiveSystemStateビットフィールドは、ユーザーが認識している、デバイスの以前のシステム電源の有効な状態を示します。 たとえば、ドライバーが保留中のシステム遷移の通知を休止状態にしたが、その後にハイブリッドシャットダウンが発生した場合、 Targetsystemstate と EffectiveSystemState の値が一致しない可能性があります。
詳細については、「 SYSTEM_POWER_STATE_CONTEXT」を参照してください。
高速スタートアップの準備
高速スタートアップの準備として、Windows は完全なシャットダウンシーケンスを実行し、休止状態ファイルを保存します。
- 1つ目は、完全なシャットダウンと同様に、Windows すべてのアプリケーションを閉じ、すべてのユーザーセッションからログオフします。 この段階では、アプリケーションは実行されていませんが、Windows カーネルが読み込まれ、システムセッションが実行されています。
- 次に、電源マネージャーは、デバイスドライバーにシステム電源 Irp を送信し、デバイスが休止状態に入る準備をするように指示します。
- 最後に、Windows カーネルメモリイメージ (読み込まれたカーネルモードドライバーを含む) を Hiberfil.sys に保存し、コンピューターをシャットダウンします。
デバイスのドライバーで、コールドスタートまたは休止状態が発生したかどうかによってデバイスが異なる方法で構成されている場合、このドライバーは、高速スタートアップの後で、コールド起動が発生した場合と同様にデバイスを構成する必要があります。 たとえば、システムによって提供される NDIS ドライバーは、高速起動時にミニポートウェイクアップ機能を無効にしますが、休止状態からは無効にします。