待機/ウェイク IRP 完了の概要
ウェイクアップ信号の受信をもって待機/ウェイク IRP が完了します。 ウェイクアップ信号はデバイス固有ですが、一般的にはデバイスに対する通常のサービス イベントです。 たとえば、着信リングを使用すると、スリープ中のモデムが起動します。
次の図は、待機/ウェイク IRP の完了手順を示しています。
ウェイクアップ信号が発生すると、デバイスの起動がバスで検出された時点で制御がバス ドライバーに戻ります。 バス ドライバーは、必要に応じてこのイベントを取り扱い、自身の PDO の IRP_MN_WAIT_WAKE IRP を完了するために IoCompleteRequest を呼び出します。
つづいて I/O マネージャーは、次の上位ドライバーによってデバイス スタックに設定されている IoCompletion ルーチンを呼び出します。 そのドライバーは、この IoCompletion ルーチンで必要に応じてウェイクアップ信号を扱い、IoCompleteRequest を呼び出してこの IRP を完了します。 I/O マネージャーは、すべてのドライバーが IRP を完了するまで、デバイス スタックを移動しながら IoCompletion ルーチンの呼び出しを続けます。
IoCompletion ルーチンでは、複数の子デバイスを列挙して (複数の PDO を作成) それらの 1 つ以上から待機/ウェイク要求を受信しているドライバーが、待機/ウェイク IRP を送信したうえで、別の子の待機/ウェイクに備えます。 詳細については「デバイス ツリーを通じた待機/ウェイク IRP のパスの概要」を参照してください。
I/O マネージャーは、ドライバーがスタックに IRP を渡したときにそのドライバーによって設定された IoCompletion ルーチンを呼び出した後、待機/ウェイク IRP を要求したときに電源ポリシー所有者によって設定されたコールバック ルーチンを呼び出します。 このコールバック ルーチンでは、ポリシー所有者がそのデバイスを動作状態に戻し、子の PDO に保留中の待機/ウェイク IRP があれば、それを完了します。
子の IRP が完了すると、I/O マネージャーは、子のデバイス スタックでドライバーによって設定された IoCompletion ルーチンを呼び出します。 最終的に、devnode で元の待機/ウェイク IRP を開始したポリシー所有者が、そのデバイスでウェイクアップ信号がアサートされ、保留になっていた待機/スリープ解除 IRP がすべて完了したと判断します。