次の方法で共有


DispatchPower ルーチン

ドライバーの DispatchPower ルーチンは、IRP_MJ_POWER I/O 関数コードの IRP を処理することによって電源管理をサポートします。 IRP_MJ_POWER 関数コードには、電源管理用のいくつかのマイナー 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 を呼び出して、次の電源 IRP の処理を開始します。

  • Irp->IoStatus.Status を STATUS_DELETE_PENDING に設定します。

  • IO_NO_INCREMENT を指定して IoCompleteRequest を呼び出し、IRP を完了します。

  • STATUS_DELETE_PENDING を返します。