IoCallDriver の呼び出しと PoCallDriver の呼び出し

Windows Vista 以降では、ドライバーは PoCallDriver ではなく IoCallDriver を呼び出して、次の下位ドライバーに電源 IRP を渡す必要があります。 Windows Server 2003、Windows XP、および Windows 2000 では、次の下位ドライバーに電源 IRP を渡すには、ドライバーが IoCallDriver ではなく PoCallDriver を呼び出す必要があります。 ただし、Windows Vista と以前のバージョンの両方で実行するために同じコードを使用するドライバーは、 IoCallDriver ではなく PoCallDriver を呼び出す必要があることに注意してください。

Windows Vista 以降では、 PoRequestPowerIrpIoCallDriver を使用して、電源マネージャーがシステム全体で電源 IRP を正しく同期するようにします。 Windows Server 2003、Windows XP、Windows 2000、PoRequestPowerIrpPoCallDriverPoStartNextPowerIrp では、電源マネージャーがシステム全体で電源 IRP を正しく同期していることを確認します。

システムは、アクティブな電源 IRP の数を次のように制限します。

  • 物理デバイス オブジェクト (PDO) ごとに、任意の時点でアクティブにできるシステム電源 IRP (IRP_MN_SET_POWERIRP_MN_QUERY_POWER) は 1 つ以上ありません。

  • 任意の時点で PDO ごとにアクティブにできるデバイス セット電源 IRP (IRP_MN_Standard Edition T_POWER) は 1 つ以上ありません。

  • 電源の突入を必要とするデバイス電源 IRP は、任意の時点でシステム内の任意の場所でアクティブにすることはできません。

2 台の突入デバイスが同時に電源投入を試みないようにするために、電源マネージャーはシステム全体でアクティブな突入電力 IRP を追跡し、一度にアクティブにできるのは 1 つだけです。 アクティブな突入 IRP が完了するまで、追加の突入 IRP を開始できません。

これらの突入 IRP の制限のため、別のデバイスの突入 IRP が完了すると、デバイスの電源 IRP がブロックされる可能性があります。 ドライバーライターは、デバッグ中にこの動作を認識する必要があります。