待機/ウェイク コールバック ルーチン
ドライバーが待機/ウェイク IRP を要求する場合、ウェイクアップ イベントが発生したときにデバイスを動作状態 (D0) に戻すことができるように、コールバック ルーチンを指定する必要があります。 ウェイクアップ イベントが発生し、すべてのドライバーが IRP を完了すると、システムは PoRequestPowerIrp に渡されたコールバック ルーチンを呼び出します。
このコールバック ルーチンは、IRP を処理しているドライバーではなく、IRP を発生させたドライバーに代わって設定されるため、 PoStartNextPowerIrp を呼び出さないでください。ドライバーが IRP をスタックに渡す際に設定された IoCompletion ルーチンのみが、次の電源 IRP を開始する必要があります。 ポリシー所有者は IRP を送信するだけでなく、IRP を処理するため、待機/ウェイク IRP を要求するときにコールバック ルーチンを設定するだけでなく、スタックに IRP を渡す IoCompletion ルーチンを設定する可能性があることに注意してください。
コールバック ルーチンには、次の役割があります。
ドライバーが複数のデバイスを制御する場合は、どのデバイスがウェイクアップのシグナルを発したかを判断します。
ウェイクアップ信号の原因となったイベントにサービスを提供します。
ウェイクアップを通知したデバイスを D0 状態にするには、 PoRequestPowerIrp を呼び出して PowerDeviceD0 要求を送信します。 また、ドライバーは PoSetPowerState を呼び出して、新しいデバイスの電源状態を電源マネージャーに通知する必要があります。 詳細については、「 デバイスの電源状態のIRP_MN_QUERY_POWERまたはIRP_MN_SET_POWERの送信」を参照してください 。
ドライバーが IRP の Cancel ルーチンを設定する場合は、 IoSetCancelRoutine を呼び出して Cancel ルーチンを NULLにリセットします。
ドライバーが複数のデバイスの電源ポリシーを所有している場合は、その待機/ウェイク解除の参照数を減らします。 カウントが 0 以外の場合は、別のデバイスが以前に待機/ウェイク IRP を送信したことを示す、その PDO に対して別の待機/ウェイク IRP (PoRequestPowerIrp) を要求します。
たとえば、PCI デバイスでは、モデムとネットワーク インターフェイス カード (NIC) の両方に対して待機/ウェイクが有効になっている場合があります。 NIC がシステムをウエイクアップした場合 (つまり、IRP を完了)、PCI FDO は、モデムがまだウェイク アップできるように、それ自体に別の待機/ウェイク IRP を送信する必要があります。
待機/ウェイク IRP を要求したドライバーは、そのデバイス スタックの電源ポリシーを制御するため、IRP が完了したときに、そのデバイスを動作状態に戻します。 下位ドライバーは既にデバイスに物理的に電源を供給している可能性がありますが、ポリシー所有者は PoRequestPowerIrp を呼び出して、デバイスの電源状態をD0にするための IRP_MN_SET_POWER 要求を送信する必要があります。 デバイス スタック内のすべてのドライバーがこの電源投入 IRP を処理した後でのみ、デバイスは動作状態に戻ります。