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 を返します。