IRP_MN_QUERY_POWER

この IRP は、システムの電源状態またはデバイスの電源状態を変更できるかどうかを判断するクエリをデバイスに実行します。

主要なコード

IRP_MJ_POWER

送信時

電源マネージャーまたはデバイスの電源ポリシー所有者は、システムまたはデバイスの電源状態を (通常はスリープ状態に) 変更できるかどうかを判断するために、この 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 型の列挙子です。

出力パラメーター

なし。

I/O 状態ブロック

ドライバーは、デバイスが要求された状態に入ることができることを示すために、Irp->IoStatus.Status を STATUS_SUCCESS に設定します。 要求された状態に入ることができないことを示すためには、ドライバーは適切なエラー状態を設定します。

操作

IRP_MN_QUERY_POWER のパラメーターは、IRP_MN_SET_POWER のパラメーターと同じです。 ただし、IRP_MN_QUERY_POWER は、電源状態の取り消し不能な変更をドライバに通知するのではなく、システムまたはデバイスが特定の電源状態に入ることができるかどうかをクエリします。

ドライバーは、IRP_MN_QUERY_POWER 要求に応答して、デバイスの電源状態を変更してはなりません。

ドライバーは、Windows Server 2003、Windows XP、および Windows 2000 で IRP_MN_QUERY_POWER 要求を受け取った後、PoStartNextPowerIrp の呼び出しを、「PoStartNextPowerIrpの呼び出し」の説明に従って行う必要があります。 Windows Vista 以降では、PoStartNextPowerIrp の呼び出しは必要ありません。このような呼び出しをしても電源管理操作は実行されません。

システムの電源状態の IRP_MN_QUERY_POWER

電源マネージャーは、ネットワーク接続の切断など、作業を中断することなく、システムの電源状態を変更できることを確認するために、この IRP を送信します。

可能な限り、電源マネージャーは、システム スリープ状態または通常のシステムシャットダウンを要求するために IRP_MN_SET_POWER を送信する前に、クエリを実行します。 ただし、一部のクリティカルな条件下 (ユーザーが電源オフ ボタンを押したり、バッテリー切れになったりするなど) では、電源マネージャーは、最初にクエリ電源要求を送信せずに IRP_MN_SET_POWER 要求を送信する場合があります。 電源マネージャーはスリープ状態についてのみクエリを実行します。動作状態に戻る前にクエリを実行することはありません。

ドライバーは、システム電源クエリ IRP を受け取ったとき、クエリされたシステム状態に対して有効なデバイスの状態をサポートできない場合は、IRP に失敗する必要があります。 詳細については、「DeviceState」を参照してください。 それ以外の場合、ドライバーは、次の下位ドライバーに IRP を渡す必要があります。 バス ドライバーは、IRP を完了します。

Windows Vista 以降では、システム スリープ状態への移行はクリティカルな操作と見なされます。 ドライバーは、システム のクエリ電源 IRP に失敗する可能性がありますが、その場合でも電源マネージャーはシステム電源状態をスリープ状態に変更する可能性があります。 ドライバーは、システム のクエリ電源 IRP を受け取った後、常にシステムの電源状態の後続の変更に備える必要があります。

デバイス電源ポリシーの所有者は、システムの電源クエリ IRP を受け取ると、それを渡す前に、IRP で IoCompletion ルーチンを設定する必要があります。 IoCompletion ルーチンでは、クエリされたシステム状態に対して有効なデバイス状態の IRP_MN_QUERY_POWER を送信する必要があります。 詳細については「デバイス電源ポリシー所有者のシステムクエリ電源 IRP の処理」を参照してください。

IRP が PowerSystemShutdown (S5) を指定すると、Parameters.Power.ShutdownType の値によってシャットダウンの理由が提供されます。 ShutdownType は、システムがリセットされているか (PowerActionShutdownReset) か、後で再起動するために無期限に電源オフ (PowerActionShutdownOff) しているかをドライバーに通知します。 ほとんどのデバイスのドライバーにとって、この違いは重要ではありません。 ただし、DMA を実行するビデオ ストリーミング デバイスなどの特定のデバイスの場合、ドライバーは、システムのリセット時にデバイスの電源を切り、進行中の I/O を停止することを選択する場合があります。

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

ドライバーがシステム電源状態のIRP_MN_QUERY_POWER 要求に失敗すると、電源マネージャーは通常、IRP_MN_SET_POWER を発行して応答します。 通常、この IRP は現在のシステム状態を再確認します。 ただし、ドライバーは、クエリされた状態またはその他の中間状態への IRP_MN_SET_POWER を受け取る可能性があります。 ドライバーは、これらの状況を処理できるように準備しておく必要があります。

デバイの電源状態の IRP_MN_QUERY_POWER

デバイス電源ポリシー所有者は、システムの IRP_MN_QUERY_POWER 要求に応答して、この IRP をスタックに送信します。

ドライバーは、デバイスを要求されたデバイスの状態にできる場合は、IoStatus.Status を STATUS_SUCCESS に設定し、IRP がバス ドライバーに到達するまで、次の下位ドライバーに IRP を渡します。 スタック内のドライバーが IRP に失敗する必要がある場合、そのドライバーは、IoCompleteRequest を呼び出して失敗の状態を返すことによって、すぐに IRP を完了する必要があります。 ドライバーは IRP に失敗すると、それ以上スタックの下に向かって IRP を渡しません。

STATUS_SUCCESS を返すことで、ドライバーは、要求された電源状態を設定する能力が変更されてしまうような操作を開始しないことを保証します。 ドライバーは、デバイスを許容可能な電源状態に戻す電源設定 IRP が完了するまで、このような操作を必要とする IRP をキューに入れる必要があります。

Windows 2000 以降のシステムでは、IRP が PowerDeviceD1PowerDeviceD2、または PowerDeviceD3 を指定すると、Parameters.Power.ShutdownType の値が、システム電源 IRP がアクティブな場合は、現在のシステム電源 IRP に関する情報を提供します。 この場合、ShutdownType の値は、現在要求されているシステム電源状態を示し、システム要求が未処理でない場合は PowerActionNone を示します。 Windows 98/Me では、IRP がデバイスの 電源状態を要求すると、このフィールドには常に PowerActionNone が示されます。

要件

ヘッダー

Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoRequestPowerIrp

PoStartNextPowerIrp