システムの電源 IRP

システム電源 IRP は、主要な IRP コード IRP_MJ_POWER、以下に示すマイナー電源 IRP コードのうちの 1 つ、IRP スタックの Power.Type メンバーの SystemPowerState 値を指定します。 このような IRP を送信できるのは電源マネージャーだけです。ドライバーは、システム電源 IRP を送信できません。

電源マネージャーは、次のいずれかの理由でシステム電源 IRP を送信します。

  • アイドル タイムアウト、システム アクティビティの変更、ユーザー要求、またはバッテリーの期限切れに応じて、システム電源状態を変更するため (IRP_MN_SET_POWER)

  • デバイスにクエリを実行して、システムがスリープ状態に入れるかどうかを判断するため (IRP_MN_QUERY_POWER)

  • クエリ後の現在のシステム電源状態を再確認するため (IIRP_MN_SET_POWER)

電源マネージャーは、システムの代わりに IRP_MN_QUERY_POWER および IRP_MN_SET_POWER 要求を送信します。 ドライバーは、IRP_MN_QUERY_POWER 要求を失敗する可能性がありますが、IRP_MN_SET_POWER を失敗させることはできません。

たとえば、システム電源状態を変更するために、電源マネージャーは、デバイス ツリーの各デバイス ノードのスタックの最上位ドライバーにシステム電源 IRP を送信します。 次の図は、1 つのデバイス スタック内でドライバーがシステム電源 IRP を処理する方法を示しています。

diagram illustrating the path of a system power irp.

前の図に示すように、

  1. 電源マネージャーは、I/O マネージャーを呼び出して、デバイス ツリー内の各リーフ ノードにシステム電源 IRP を送信します。

  2. ドライバーは可能であれば IRP を処理し、必要に応じて IoCompletion ルーチンを設定し、IoCallDriver (Windows 7 および Windows Vista) または PoCallDriver (Windows Server 2003、Windows XP、Windows 2000) を呼び出して IRP をスタックに転送します。 ドライバーは、IRP に失敗する必要があれば、直ちに失敗し、IRP を完了します。 ドライバーは IRP_MN_QUERY_POWER IRP に失敗する可能性がありますが、システム電源状態を設定する IRP_MN_SET_POWER IRP に失敗することはできません。

  3. デバイスの電源ポリシーを所有するドライバーが IRP を受信すると、そのドライバーは、システム IRP の IoCompletion ルーチンを設定し、その IRP を転送します。

  4. スタック内の他のドライバーは、可能であれば IRP を処理し、必要に応じて IoCompletion ルーチンを設定し、ステップ 2 のように、次の下位ドライバーに IRP を転送します。

  5. 最終的に、バス ドライバーがシステム IRP を受信して完了します。

  6. I/O マネージャーは、ドライバーがシステム IRP をデバイス スタックに渡したときに設定した IoCompletion ルーチンを呼び出します。

  7. IoCompletion ルーチンでは、デバイス電源ポリシー所有者が、システム IRP のシステム電源状態に対して有効なデバイス電源状態を指定して、PoRequestPowerIrp を呼び出し、デバイス電源 IRP を送信します。 ドライバーは、デバイス電源 IRP が完了したときに呼び出されるコールバック ルーチンを設定します。

    必要に応じて、ドライバーは、DEVICE_CAPABILITIES 構造体のキャッシュされたコピー内の DeviceState メンバーを調べて (「デバイスの電源機能のレポート」を参照)、どのデバイス電源状態が IRP 内のシステム電源状態と一致するかを判断します。

  8. デバイス IRP が完了し、デバイス IRP 完了ルーチンが完了が実行された後に、電源ポリシー所有者のコールバック ルーチンが呼び出されます。 コールバック ルーチンでは、ドライバーは、返された状態をシステム IRP にコピーします。 Windows Server 2003、Windows XP、Windows 2000 では、コールバックは PoStartNextPowerIrp を呼び出して次の電源 IRP を開始します。 ただし、Windows 7 および Windows Vista では、PoStartNextPowerIrp の呼び出しは必要なく、このような呼び出しでは電源管理操作は実行されません。 最後に、コールバックは IoCompleteRequest を呼び出してシステム IRP を完了します。

詳細については、「システム電源状態要求の処理」を参照してください。

一部のデバイスでは電源投入時に電流が突入する必要があるため、システム突入電力 IRP はシステム全体で同期的に順次処理されます。 このような IRP が有効になるのは一度に 1 つだけです。 詳細については、「IoCallDriver の呼び出しと PoCallDriver の呼び出し」を参照してください。