システム電源設定 IRP への応答におけるデバイス電源設定 IRP の送信
デバイス電源ポリシー所有者は、システム電源設定 IRP に応答するために以下の手順を実行する必要があります。
IoAcquireRemoveLockを呼び出し、現在の IRP を Tag パラメータとして渡して、ドライバーが電源 IRP の処理中にプラグアンドプレイ IRP_MN_REMOVE_DEVICE 要求を受信しないようにします。
IoAcquireRemoveLock が失敗ステータスを返した場合、ドライバーはIRPの処理を続行すべきではありません。 代わりに、Windows Vista 以降では、ドライバーは IoCompleteRequest を呼び出し要求を完了して、エラー状態を返す必要があります。 Windows Server 2003、Windows XP、およびWindows 2000では、ドライバーは最初に PoStartNextPowerIrpを呼び出し、 IoCompleteRequest を呼び出してIRPを完了し、エラー状態を返します。
IoCopyCurrentIrpStackLocationToNextを呼び出して、次の下位ドライバーのIRPスタック位置を設定します。
IoCompletion ルーチンをシステム電源設定IRPに設定します。
IoMarkIrpPending を呼び出して、システム電源設定IRPを保留中としてマークします。
IoCallDriver (Windows Vista 以降) または PoCallDriver (Windows Server 2003、Windows XP、および Windows 2000) を呼び出して、システム電源設定IRP を次の下位のドライバーに渡します。
DispatchPower ルーチンから STATUS_PENDING を返します。
IoCompletion ルーチン(前の一覧の手順3を参照)で、デバイスの電源ポリシーの所有者は、次のようにデバイスの電源設定IRPを送信します:
システム電源設定IRP を調べ、要求されたシステム電源状態を取得します。 そのシステム電源状態に対して適切なデバイス電源状態を選択します。 詳細は、 正しいデバイス電源状態の決定を参照してください。
PoRequestPowerIrp を呼び出し、手順1で決定したデバイス電源状態に対して IRP_MN_SET_POWER を送信します。 電源ポリシーの所有者は、デバイスが既にその状態にある場合でも、デバイスの電源設定要求を送信する必要があります。
PoRequestPowerIrp の呼び出しで電源完了コールバックルーチン (CompletionFunction) を指定し、 Context バッファリングにシステム電源設定IRPを渡します。
IoCompletion ルーチンから STATUS_MORE_PROCESSING_REQUIRED を返し、ドライバーが電源完了コールバックルーチンでシステム電源設定 IRP の処理を終了できるようにします。
デバイス電源ポリシーの所有者は、デバイス 電源設定IRP を送信するだけでなく、この IRP がデバイススタックを通過する際に処理しなければならないことを覚えておいてください。 その結果、デバイスの電源ポリシー所有者は、デバイス電源設定IRP とシステム電源設定IRP 用の IoCompletion ルーチンに関連する電源完了コールバックルーチンだけでなく、デバイス電源設定IRP 用の IoCompletion ルーチンを持つ可能性があります。 詳細は、 Handling IRP_MN_SET_POWER for Device Power Statesを参照してください。
I/Oマネージャは、デバイス電源設定IRPがデバイススタックを移動するときに設定されたすべての IoCompletion ルーチンを呼び出した後、電源完了コールバックルーチンを呼び出します。 この時点で、スタック内のすべてのドライバーがデバイス電源設定IRP を完了し、デバイスの電源切り替えが完了します。
電源完了コールバック ルーチンでは、次の操作を行う必要があります。
PoStartNextPowerIrp を呼び出して、次の電源IRPを開始します。 (Windows Server 2003、Windows XP、および Windows 2000 のみ。)
デバイス電源設定IRPで返された状態で、システム電源設定IRP (IoCompleteRequest) を完了します。
IoReleaseRemoveLock を呼び出し、以前に取得したロックを解放します。
電源設定IRP が完了した状態を返します。