この IRP は、システム電源状態への変更をドライバーに通知するか、デバイスのデバイスの電源状態を設定します。
主要なコード
送信時
システム電源マネージャーまたはデバイスの電源ポリシー所有者は、この IRP を送信できます。
電源マネージャーは、システムの電源状態に変更をドライバーに通知するには、この IRP を送信します。 ドライバーがアイドル状態の検出のためにデバイスを登録している場合、電源マネージャーは、アイドル状態のデバイスの電源状態を変更するには、この IRP を送信します。
電源ポリシーを所有するドライバーは、デバイスの電源状態を設定するには、この IRP を送信します。 ドライバーは、この IRP を送信する PoRequestPowerIrp を呼び出す必要があります。
電源マネージャーは、IRQL = PASSIVE_LEVEL でこの IRP を PDO のDO_POWER_PAGABLE フラグを設定するデバイス スタックに送信します。 このようなスタック内のドライバーは、ページングされたコードまたはデータにタッチして要求を完了できます。
DO_POWER_INRUSH フラグが設定されている場合、電源マネージャーは IRQL = DISPATCH_LEVEL で IRP を送信できます。 このようなドライバーは、ページングされたコードやデータに直接または間接的にアクセスすることはできません。
入力パラメーター
Parameters.Power.Type メンバーは、設定する電源状態の種類 (SystemPowerState または DevicePowerState) を指定します。
Parameters.Power.State メンバーは、電源状態自体を次のように指定します。
Parameters.Power.Type が SystemPowerState の場合、値はSYSTEM_POWER_STATE型の列挙子です。
Parameters.Power.Type が DevicePowerState の場合、値はDEVICE_POWER_STATE型の列挙子です。
Parameters.Power.ShutdownType メンバーは、要求された遷移に関する追加情報を指定します。 このメンバーに指定できる値は 、列挙値POWER_ACTION です。 詳細については、「 システム電源アクション」を参照してください。
Windows Vista 以降、 Parameters.Power.SystemPowerStateContext メンバーは、コンピューターの以前のシステム電源状態に関する情報を含む読み取り専用の部分的に不透明な SYSTEM_POWER_STATE_CONTEXT 構造体です。 Parameters.Power.Type が SystemPowerState で Parameters.Power.State が PowerSystemWorking の場合、この構造体の 2 つのフラグ ビットは、高速起動または休止解除によってコンピューターが S0 (動作中) システム状態に入ったかどうかを示します。 詳細については、「Wake-from-Hibernationからの高速起動の区別」を参照してください。
次の表に、IRP_MN_SET_POWERの内容を示します。Parameters.Power。{State|ShutdownType} と、各システム電源遷移のSYSTEM_POWER_STATE_CONTEXT構造体の CurrentSystemState、TargetSystemState、および EffectiveSystemState ビット フィールド。 各行は 1 つの IRP_MN_SET_POWERを表します。
遷移 | 状態 | シャットダウンの種類 | 現在の SystemState | ターゲット SystemState | Effective SystemState | コメント |
---|---|---|---|---|---|---|
スリープ状態... | S3 | 寝る | S0 | S3 | S3 | |
...航跡 | S0 | 寝る | S3 | S0 | S0 | |
ハイブリッド スリープ | S4 | 休止状態 | S0 | S3 | S4 | 休止状態ファイルでスリープする (高速 S4) |
...航跡 | S0 | 寝る | S3 | S0 | S0 | |
...Wake/PwrLost | S0 | 寝る | S4 | S0 | S0 | |
Hibernate to... | S4 | 休止状態 | S0 | S4 | S4 | |
...航跡 | S0 | 寝る | S4 | S0 | S0 | |
ハイブリッド シャットダウンの実行... | S4 | 休止状態 | S0 | S5 | S4 | アプリが閉じられ、ユーザーがシャットダウンした場合と同様にログオフしました (休止中のブート) |
...高速スタートアップ | S0 | 寝る | S4 | S0 | S0 | |
シャットダウンする... | S5 | シャットダウン/リセット/オフ | S0 | S5 | S5 | |
...システム ブート | 起動用の S-IRP なし |
出力パラメーター
Parameters.Power.SystemContext はシステム用に予約されています。
I/O 状態ブロック
ドライバーは 、Irp->IoStatus.Status をSTATUS_SUCCESSに設定して、デバイスが要求された状態に入っていることを示します。
ドライバーは、システムの電源状態を設定する要求を失敗させる必要があります。
バス ドライバーの上にある関数ドライバーとフィルター ドライバーは、デバイスの電源状態を設定する要求に失敗してはなりません。 バス ドライバーは、デバイスが削除された場合、または削除中の場合、デバイスの電源投入要求に失敗する可能性があります。
オペレーション
電源マネージャーまたはドライバーは、 IRP_MN_SET_POWER IRP を要求できます。 電源マネージャーは、次のいずれかの理由でこの IRP を送信します。
システム電源状態の変更をドライバーに通知するには
電源マネージャーがアイドル検出を実行しているデバイスの電源状態を変更するには
ドライバーがシステム電源状態の IRP_MN_QUERY_POWER 要求に失敗した後に、現在のシステム状態を再確認するため。 詳細については、「IRP_MN_QUERY_POWER」 を参照してください。
デバイスの電源ポリシーを所有するドライバーは 、 デバイスの電源状態を変更するためにIRP_MN_SET_POWERを送信します。
特定の時点で、システムでは、デバイス オブジェクトごとに 1 つの IRP のみをアクティブにすることができます。
各ドライバーは、 IoCallDriver (Windows Vista 以降) または PoCallDriver (Windows Server 2003、Windows XP、Windows 2000) を呼び出して、次の下位ドライバーに各電源 IRP を渡す必要があります。 PoCallDriver インターフェイスは、電源管理サブシステムが IRP を次のドライバーに渡す前に遅延する可能性がある点を除いて、IoCallDriver のインターフェイスに似ています。 たとえば、デバイスに突入電流が必要なため、別のデバイスで順次電源を入れる必要がある場合、 PowerDeviceD0 要求で遅延が発生する可能性があります。
ドライバーは、Windows Server 2003、Windows XP、または Windows 2000 で IRP_MN_SET_POWER 要求を受信した後、 PoStartNextPowerIrp の呼び出しに関する説明に従って PoStartNextPowerIrp を呼び出す必要があります。 Windows Vista 以降では、 PoStartNextPowerIrp の呼び出しは必要なく、このような呼び出しでは電源管理操作は実行されません。
システム電源状態のIRP_MN_SET_POWER
システム電源マネージャーのみがシステム セット電源 IRP を送信できます。
ドライバーは、システムの電源状態を設定する要求を失敗させる必要があります。
可能な限り、電源マネージャーは システムスリープ状態を 要求するために IRP_MN_SET_POWER を送信する前にIRP_MN_QUERY_POWERを送信します。 ただし、一部の条件下 (ユーザーが 電源オフ ボタンを押したり、バッテリーの有効期限が切れたりするなど) では、電源マネージャーが最初にクエリを実行せずに IRP_MN_SET_POWER を発行する場合があります。 Power Manager はスリープ状態についてのみクエリを実行します。電源が入る前にクエリを実行することはありません。
IRP_MN_SET_POWER要求は、デバイスのデバイス スタックの最上位ドライバーに送信されます。 トップ ドライバーは、IRP がバス ドライバーに到達するまで、次の下位ドライバーに IRP を渡します。IRP を完了する必要があります。
通常、フィルター ドライバーは、渡す以外に、システム セット電源 IRP に対して動作する必要はありません。
ただし、デバイスの電源ポリシー所有者は、IRP を渡す前に IoCompletion ルーチンを設定します。 IoCompletion ルーチンでは、デバイス power IRP のIRP_MN_SET_POWER要求を送信します。 詳細については、「 デバイスの電源ポリシー所有者でのシステム Set-Power IRP の処理」を参照してください。
システムセット電源 IRP は、システム電源状態の変更が差し迫っていることをドライバーに通知し、ドライバーはそれに備える必要があります。 ただし、ドライバーは、デバイスの電源状態の IRP_MN_SET_POWER を受け取るまで、 デバイス の電源状態を変更しないでください。
Parameters.Power.ShutdownType の値は、保留中のアクションに関する追加情報を提供します。 IRP で PowerSystemShutdown (S5) が指定されている場合、ドライバーは、システムがリセットされているか (PowerActionShutdownReset) か、後で再起動するために無期限に電源オフ (PowerActionShutdownOff) かを判断できます。 ほとんどのデバイスのドライバーの場合、違いは重要ではありません。 ただし、ビデオ ストリーミング デバイスなどの特定のデバイスでは、システムのリセット時に I/O を停止するために、ドライバーがデバイスの電源をオフにすることがあります。
ShutdownType の値は PowerActionShutdown にすることもできます。 この場合、ドライバーは、どのような種類のシャットダウンが要求されているかを確認できないため、リセットを続行する必要があります。
デバイスの電源状態
バス ドライバーの上にある関数ドライバーとフィルター ドライバーは、デバイスの電源状態を設定する要求に失敗してはなりません。 バス ドライバーは、デバイスが削除された場合、または削除中の場合、デバイスの電源投入要求に失敗する可能性があります。
ドライバーは、IRP を完了する前に、要求された状態にデバイスを設定する必要があります。
IRP が低い電源状態への移行を要求する場合、ドライバーはデバイス スタックを移動するときに IRP を処理する必要があります。ドライバーが動作状態にデバイスを復元するために必要なコンテキストを保存します。 バス ドライバーが IRP を受け取った後、ドライバーは次の手順を実行します。
ドライバーがデバイスを動作状態に復元するために必要なコンテキストを保存します。
デバイスを要求された電源状態に設定します。
PoSetPowerState を呼び出して、電源マネージャーに通知します。
PoStartNextPowerIrp を呼び出して、次の電源 IRP を起動します (Windows Server 2003、Windows XP、および Windows 2000 のみ)。
デバイスの電源 IRP を完了します。
ドライバーは、タイムリーにこの IRP を完了する必要があります。 一般に、ドライバーは、一般的なユーザーが著しく遅いと思われる遅延を回避する必要があります。 たとえば、ドライバーは、キャッシュされたディスクまたはネットワーク データをフラッシュするシステム状態の変更を遅延させる可能性がありますが、ネットワーク接続を維持したり、テープをフォーマットしたりしないでください。 詳細については、「 Power IRP の受け渡し」を参照してください。
Windows 2000 以降のバージョンのオペレーティング システムでは、IRP が PowerDeviceD1、PowerDeviceD2、または PowerDeviceD3 を指定し、システム セット電源 IRP がアクティブな場合、Parameters.Power.ShutdownType の値はシステム IRP に関する情報を提供します。
休止状態パス上のデバイスのドライバーは、この値を検査する必要があります。 IRP が PowerDeviceD3 を要求し 、ShutdownType が PowerActionHibernate である場合、このようなドライバーは、デバイスを復元するために必要なコンテキストを保存する必要がありますが、デバイスの電源を切らてはなりません。マシンの電源が切れると、デバイスは D3 状態になります。
Windows 2000 以降のバージョンのオペレーティング システムでは、要求された電源状態が PowerDeviceD0 の場合、ドライバーは ShutdownType の値に依存しないでください。
Windows 98/Me では、IRP がデバイスの電源状態を要求した場合、 ShutdownType は常に PowerActionNone です。
デバイスの電源を切るタイミングを決定するドライバーは、デバイス クラスによって異なります。
デバイスの電源をオンにするタイミングを決定するドライバーは、ほとんどの場合、デバイス レジスタにアクセスするドライバーです。 ドライバーは、デバイスのハードウェア レジスタにアクセスする前に、デバイスが D0 状態であることを確認する必要があります。 デバイスが D0 状態でない場合、ドライバーは PoRequestPowerIrp を呼び出して IRP を送信してデバイスの電源をオンにする必要があります。 ドライバーは、デバイスが D0 状態でない限り、そのデバイスにアクセスできません。
ドライバーは、デバイスの状態 D0 の電源の設定 IRP を受け取ると、 IoCompletion ルーチンを設定し、次の下位ドライバーに IRP を渡します。
IRP がバス ドライバーに到達すると、そのドライバーはデバイスに電源を適用 (またはリセット) し、 PoStartNextPowerIrp (Windows Server 2003、Windows XP、Windows 2000 のみ) を呼び出し、 PoSetPowerState を呼び出して、デバイスの新しい電源状態を電源マネージャーに通知します。
バス ドライバーが電源投入 IRP を完了した後、関数およびフィルター ドライバーは、デバイス スタックをバックアップする IoCompletion ルーチンで IRP を処理します。 IoCompletion ルーチンでは、各ドライバーはデバイス コンテキストを復元または再初期化し、その他の必要なスタートアップ タスクを実行します。
詳細については、「デバイスの 電源状態のIRP_MN_SET_POWERの処理」を参照してください。
要求事項
ヘッダ: Wdm.h (Wdm.h、Ntddk.h、または Ntifs.h を含む)
こちらも参照ください
PoStartNextPowerIrpの