デバイス電源 IRP の IoCompletion ルーチン
バス ドライバーが IRP を完了した後、I/O マネージャーは、スタックの下位に IRP を渡す際に、上位レベルのドライバーによって登録されている IoCompletion ルーチンを呼び出します。
デバイスが D0 状態になるたびに、各ドライバーは、デバイスを動作状態に戻すために必要なほとんどのタスクを実行する IoCompletion ルーチンを設定する必要があります。 ドライバーは、デバイスがスリープ状態から復帰するのか、システム起動時に D0 に入るのかに関係なく、D0 状態への遷移に対して IoCompletion ルーチンを設定する必要があります。 次の図は、IoCompletion ルーチンが実行する必要があるタスクを示しています。
次のようなタスクがあります。
デバイスの電源状態を復元するか、必要に応じてデバイスを再初期化し、デバイスが動作状態でない間にドライバーによってキューに登録されたすべての I/O を処理する準備を行います。
PoSetPowerState を呼び出して、デバイスが D0 電源状態であることを電源マネージャーに通知します。
ドライバーが最初に現在の電源 IRP を送信しなかった場合は、PoStartNextPowerIrp を呼び出して、次の電源 IRP を受信します。 (Windows Server 2003、Windows XP、および Windows 2000 のみ。)
デバイス コンテキストに割り当てられたメモリを解放します。
IoReleaseRemoveLock を呼び出して、ドライバーが IRP を受信したときに DispatchPower ルーチンで取得したロックを解放します。
STATUS_SUCCESS を返します。
バス ドライバーは、そのドライバーまたは上位のドライバーがデバイスと通信しなければならなくなるまで、デバイスの電源をオンにしません。
デバイスがスリープ状態に入ったら、ドライバーは、PoStartNextPowerIrp (Windows Server 2003、Windows XP、および Windows 2000 のみ) を呼び出して削除ロックを解放する、IoCompletion ルーチンを設定する必要があります。 デバイスがスリープ状態の間は、ドライバーはデバイスにアクセスできないことに注意してください。