IRP_MN_SET_POWER

この IRP では、システム電源状態の変更をドライバーに通知したり、システムに対してデバイスの電源状態を設定したりします。

主要なコード

IRP_MJ_POWER

送信時

システム電源マネージャーまたはデバイスの電源ポリシー所有者が、この IRP を送信できます。

電源マネージャーは、システムの電源状態の変更をドライバーに通知するためにこの IRP を送信します。 ドライバーがアイドル状態の検出のためにデバイスを登録している場合は、電源マネージャーは、アイドル状態のデバイスの電源状態を変更するために、この IRP を送信します。

電源ポリシーを所有するドライバーは、デバイスの電源状態を設定するために、この IRP を送信します。 ドライバーは、この IRP を送信するために PoRequestPowerIrp を呼び出す必要があります。

電源マネージャーは、PDO に DO_POWER_PAGABLE フラグを設定したデバイス スタックに、IRQL = PASSIVE_LEVEL でこの IRP を送信します。 このようなスタック内のドライバーは、ページングされたコードまたはデータにアクセスして要求を完了できます。

DO_POWER_INRUSH フラグが設定されている場合、電源マネージャーは IRQL = DISPATCH_LEVEL で IRP を送信できます。 このようなドライバーは、ページングされたコードやデータに直接または間接的にアクセスすることはできません。

入力パラメーター

Parameters.Power.Type メンバーは、設定する電源状態の種類 (SystemPowerState または DevicePowerState) を指定します。

Parameters.Power.State メンバーは、電源状態自体を次のように指定します。

  • Parameters.Power.TypeSystemPowerState の場合、値は SYSTEM_POWER_STATE 型の列挙子です。

  • Parameters.Power.TypeDevicePowerState の場合、値は DEVICE_POWER_STATE 型の列挙子です。

Parameters.Power.ShutdownType メンバーは、要求された遷移に関する追加情報を指定します。 このメンバーに指定できる値は、POWER_ACTION の列挙値です。 詳細については、「システム電源操作」を参照してください。

Windows Vista 以降、Parameters.Power.SystemPowerStateContext メンバーは、コンピューターの以前のシステム電源状態に関する情報を含む、読み取り専用の部分的に不透明な SYSTEM_POWER_STATE_CONTEXT 構造体です。 Parameters.Power.TypeSystemPowerStateParameters.Power.StatePowerSystemWorking の場合、この構造体の 2 つのフラグ ビットは、高速起動または休止状態からの復帰によってコンピューターが S0 (動作中) のシステム状態に入ったかどうかを示します。 詳細については、「高速起動と休止状態からの復帰の区別」を参照してください。

次の表に、各システム電源遷移の SYSTEM_POWER_STATE_CONTEXT 構造内の IRP_MN_SET_POWER.Parameters.Power.{State|ShutdownType} と、CurrentSystemStateTargetSystemState、および EffectiveSystemState ビット フィールドの内容を示しています。 各行は 1 つの IRP_MN_SET_POWER を表します。

切り替え効果 都道府県 シャットダウンの種類 現在の SystemState ターゲット SystemState 有効な SystemState Comments
スリープ状態... S3 Sleep S0 S3 S3
...復帰 S0 Sleep S3 S0 S0
ハイブリッド スリープ... S4 休止状態 S0 S3 S4 休止状態ファイルでスリープ (高速 S4)
...復帰 S0 Sleep S3 S0 S0
...復帰/停電へ S0 Sleep S4 S0 S0
休止状態... S4 休止状態 S0 S4 S4
...復帰 S0 Sleep S4 S0 S0
ハイブリッド シャットダウン... S4 休止状態 S0 S5 S4 アプリが閉じられ、シャットダウンした場合 (休止中の起動) のようにユーザーがログオフしました
...高速起動 S0 Sleep 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 を送信します。

任意の時点で、システムでは、デバイス オブジェクトごとにこのような IRP を 1 つのみアクティブにすることができます。

各ドライバーは、IoCallDriver (Windows Vista 以降)、または PoCallDriver (Windows Server 2003、Windows XP、Windows 2000) を呼び出して、次の下位ドライバーに各電源 IRP を渡す必要があります。 PoCallDriver インターフェイスは、IoCallDriver のインターフェイスに似ていますが、電源管理サブシステムが IRP を次のドライバーに渡す前に遅延する可能性がある点が異なります。 たとえば、デバイスに突入電流が必要なため、別のデバイスで順次電源を入れる必要がある場合、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 を発行する場合があります。 電源マネージャーは、スリープ状態についてのみクエリを実行します。電源が入る前にクエリを実行することはありません。

IRP_MN_SET_POWER 要求は、デバイスのデバイス スタックの最上位ドライバーに送信されます。 最上位のドライバーは、IRP を完了する必要があるバス ドライバーに IRP が到達するまで、次の下位ドライバーに IRP を渡します。

通常、フィルター ドライバーは、システムの電源設定 IRP に対して、それを渡す以外には何もする必要がありません。

ただし、デバイスの電源ポリシー所有者は、IRP を渡す前に IoCompletion ルーチンを設定します。 IoCompletion ルーチンでは、デバイスの電源 IRP の IRP_MN_SET_POWER 要求を送信します。 詳細については、「デバイス電源ポリシー所有者におけるシステム電源設定 IRP の処理」を参照してください。

システムセット電源 IRP は、システム電源状態の変更が差し迫っていることをドライバーに通知し、ドライバーはそれに備える必要があります。 ただし、ドライバーは、デバイスの電源状態の IRP_MN_SET_POWER を受け取るまで、デバイスの電源状態を変更しない必要があります。

Parameters.Power.ShutdownType の値は、保留中のアクションに関する追加情報を提供します。 IRP で PowerSystemShutdown (S5) が指定されている場合、ドライバーは、システムがリセットされているか (PowerActionShutdownReset)、後で再起動するために無期限に電源オフ (PowerActionShutdownOff) にしているかを判断できます。 ほとんどのデバイスのドライバーにとって、この違いは重要ではありません。 ただし、ビデオ ストリーミング デバイスなどの特定のデバイスでは、システムのリセット時に I/O を停止するために、ドライバーがデバイスの電源をオフにすることがあります。

Windows 2000 以降のバージョンのオペレーティング システムでは、ShutdownType の値を PowerActionShutdown にすることもできます。 この場合、ドライバーは、どのような種類のシャットダウンが要求されているかを確認できないため、リセットと同様に処理を進める必要があります。

デバイスの電源状態

バス ドライバーの上にあるファンクション ドライバーとフィルター ドライバーは、デバイスの電源状態を設定する要求に成功する必要があります。 バス ドライバーは、デバイスが削除された場合、または削除中の場合は、デバイスの電源投入要求に失敗することができます。

ドライバーは、IRP を完了する前に、要求された状態にデバイスを設定する必要があります。

IRP が低電力状態への移行を要求する場合、ドライバーはデバイス スタックを下へと移動するときに IRP を処理し、ドライバーがデバイスを動作状態に復元するために必要なコンテキストを保存する必要があります。 バス ドライバーが IRP を受け取った後、ドライバーは次の手順を実行します。

  • ドライバーがデバイスを動作状態に復元するために必要なコンテキストを保存します。

  • デバイスを要求された電源状態に設定します。

  • PoSetPowerState を呼び出して、電源マネージャーに通知します。

  • PoStartNextPowerIrp を呼び出して、次の電源 IRP を起動します (Windows Server 2003、Windows XP、および Windows 2000 のみ)。

  • デバイスの電源 IRP を完了します。

ドライバーは、適時にこの IRP を完了する必要があります。 一般に、ドライバーは、一般的なユーザーが著しく遅いと感じるような遅延を回避する必要があります。 たとえば、ドライバーは、キャッシュされたディスクまたはネットワーク データをフラッシュするためにシステム状態の変更を遅延させることがあり得ますが、ネットワーク接続を維持したり、テープをフォーマットしたりしない必要があります。 詳細については、「電源 IRP の受け渡し」を参照してください。

Windows 2000 以降のバージョンのオペレーティング システムでは、IRP が PowerDeviceD1PowerDeviceD2、または PowerDeviceD3 を指定し、システムの電源指定 IRP がアクティブな場合、Parameters.Power.ShutdownType の値はシステム IRP に関する情報を提供します。

休止状態のパス上にあるデバイスのドライバーは、この値を検査する必要があります。 IRP が PowerDeviceD3 を要求し、ShutdownTypePowerActionHibernate である場合、このようなドライバーは、デバイスを復元するために必要なコンテキストを保存する必要がありますが、デバイスの電源を落とさないようにする必要があります。デバイスは、マシンの電源が切れると 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 を含む)

関連項目

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT