ドライバーの DispatchPower ルーチンは、IRP_MJ_POWER I/O 関数コードの IRP を処理することによって電源管理をサポートします。 IRP_MJ_POWER関数コードに関連付けられているのは、Power Management のいくつかのマイナー I/O 関数コードです。 電源マネージャーは、これらのマイナー関数コードを使用して、ドライバーの電源状態の変更、システムウェイクアップ イベントの待機と応答、およびデバイスに関するドライバーのクエリを実行します。
各ドライバーの DispatchPower ルーチンは、次のタスクを実行します。
可能であれば IRP を処理します。
PoCallDriver を使用して、デバイス スタック内の次の下位ドライバーに IRP を渡します。
バス ドライバーの場合は、デバイスで要求された電源操作を実行し、IRP を完了します。
デバイスのすべてのドライバーは、機能またはフィルター ドライバーが IRP を失敗することが許可されている場合を除き、デバイスの電源 IRP を処理する機会を持っている必要があります。 ほとんどの関数およびフィルター ドライバーは、いくつかの処理を実行するか、各電源 IRP の IoCompletion ルーチンを設定し、完了せずに次の下位ドライバーに IRP を渡します。 最終的に IRP はバス ドライバーに到達し、必要に応じてデバイスの電源状態を物理的に変更し、IRP を完了します。
IRP が完了すると、I/O マネージャーは、IRP がデバイス スタックを移動したときに、ドライバーによって設定されたすべての IoCompletion ルーチンを呼び出します。 ドライバーが完了ルーチンを設定する必要があるかどうかは、IRP の種類とドライバーの個々の要件によって異なります。
デバイスの電源を投入する電源 IRP は、まず、デバイス スタック内の最も低いドライバー (基になるバス ドライバー) によって処理され、次にスタック上の各ドライバーによって処理される必要があります。 デバイスの電源を落とす電源 IRP は、まずデバイス スタックの最上部にあるドライバーによって処理され、その後、スタック内の各下位のドライバーが順番に処理する必要があります。
リムーバブル デバイスの特別な処理
DispatchPower ルーチンでは、リムーバブル デバイスのドライバーは、デバイスがまだ存在するかどうかを確認する必要があります。 デバイスが削除されている場合、ドライバーは次の下位ドライバーに IRP を渡してはいけません。 代わりに、ドライバーは次の操作を行う必要があります。
PoStartNextPowerIrp を呼び出して、次の power IRP の処理を開始します。
Irp->IoStatus.Status をSTATUS_DELETE_PENDINGに設定します。
IO_NO_INCREMENTを指定して IoCompleteRequest を呼び出して、IRP を完了します。
STATUS_DELETE_PENDINGを返します。