次の方法で共有


DispatchPower ルーチン

ドライバーの 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を返します。