この 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 型の列挙子です。
出力パラメーター
なし。
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 要求を送信する場合があります。 Power Manager はスリープ状態についてのみクエリを実行します。動作状態に戻る前にクエリを実行することはありません。
ドライバーがシステム電源クエリ IRP を受け取ると、照会されたシステム状態に対して有効なデバイスの状態をサポートできない場合、IRP は失敗します。 詳細については、「 DeviceState」を参照してください。 それ以外の場合、ドライバーは、次の下位ドライバーに IRP を渡す必要があります。 バス ドライバーは、IRP を完了します。
Windows Vista 以降では、システム スリープ状態への移行は重要な操作と見なされます。 ドライバーは、システム のクエリ電源 IRP に失敗する可能性がありますが、電源マネージャーは引き続きスリープ状態にシステム電源状態を変更可能性があります。 ドライバーは、システム のクエリ電源 IRP を受け取った後、常にシステムの電源状態の後続の変更に備える必要があります。
デバイス電源ポリシーの所有者は、システムの電源クエリ IRP を受け取ると、それを渡す前に、IRP で IoCompletion ルーチンを設定する必要があります。 IoCompletion ルーチンでは、照会されたシステム状態に対して有効なデバイス状態のIRP_MN_QUERY_POWERを送信する必要があります。 詳細については、「 デバイスの電源ポリシー所有者でのシステム 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 は現在のシステム状態を再確認します。 ただし、ドライバーは、クエリされた状態またはその他の中間状態に IRP_MN_SET_POWER を受け取る可能性があります。 これらの状況を処理するには、ドライバーを準備する必要があります。
デバイスの電源状態のIRP_MN_QUERY_POWER
デバイス電源ポリシー所有者は、システム のIRP_MN_QUERY_POWER 要求に応答して、この IRP をスタックに送信します。
ドライバーは、要求されたデバイスの状態にデバイスを配置できる場合は、 IoStatus.Status をSTATUS_SUCCESSに設定し、IRP がバス ドライバーに到達するまで、次の下位ドライバーに IRP を渡します。 スタック内のドライバーが IRP に失敗する必要がある場合、そのドライバーは 、IoCompleteRequest を呼び出してエラー状態を返すことによって、すぐに IRP を完了する必要があります。 IRP に失敗したドライバーは、スタックのさらに下に渡されません。
STATUS_SUCCESSを返すことで、ドライバーは、要求された電源状態を設定する機能を変更する操作を開始しないことを保証します。 ドライバーは、デバイスを許容可能な電源状態に戻す set-power IRP が完了するまで、このような操作を必要とする IRP をキューに入れる必要があります。
Windows 2000 以降のシステムでは、IRP が PowerDeviceD1、PowerDeviceD2、または PowerDeviceD3 を指定すると、Parameters.Power.ShutdownType の値は、システム電源 IRP がアクティブな場合、現在のシステム電源 IRP に関する情報を提供します。 この場合、 ShutdownType の値は、現在要求されているシステム電源状態を示します。システム要求が未処理でない場合は PowerActionNone を示します。 Windows 98/Me では、IRP がデバイスの電源状態を要求すると、このフィールドには常に PowerActionNone が含まれます。
要求事項
ヘッダ: Wdm.h (Wdm.h、Ntddk.h、または Ntifs.h を含む)
こちらも参照ください
PoStartNextPowerIrpの