次の方法で共有


個々のデバイスの電源 IRP

デバイス電源 IRP は、主要な IRP コード IRP_MJ_POWER、以下に示すマイナー電源 IRP コードのうちの 1 つ、Power.Type メンバーの DevicePowerState 値を指定します。

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IRP_MN_POWER_SEQUENCE

デバイス スタック内のすべてのドライバーは、このような IRP を受信し、通常はデバイス電源ポリシー マネージャーだけがこれらの IRP を送信できます。 ただし、「アイドル状態検出のための電源マネージャー ルーチンの使用」で説明されているように、デバイスの代わりにアイドル状態検出を実行する場合、電源マネージャーがデバイス電源 IRP を送信できます。

ドライバーは、次のいずれかの理由でデバイス電源 IRP を送信します。

  • システム電源 IRP に応答してデバイス電源状態をクエリまたは変更するため

  • デバイスをスリープ状態にして電力を節約するため

  • スリープ状態になった後にデバイスを動作状態に戻すため

  • 外部信号に応答してデバイスのスリープを解除できるようにするため

  • デバイスの電源投入時に電源シーケンス値を取得するため

次の図は、デバイスの電源 IRP を送信、転送、完了するために発生する一連のステップを示しています。

diagram illustrating the path of a device power irp.

前の図に示したように、次のステップでデバイス電源 IRP を送信、転送、完了します。

  1. デバイス電源ポリシー所有者は、PoRequestPowerIrp を呼び出して、IRP のターゲットである PDO と IRP の完了時に呼び出されるコールバック ルーチンを指定して、デバイス電源 IRP を割り当てます。

  2. 電源マネージャーは、デバイス電源 IRP を割り当て、ターゲット PDO のデバイス スタック内の最上位ドライバーに送信します。

  3. このドライバーは、次のアクションを実行します。

    • 必要に応じて、IoCompletion ルーチンを設定します。

    • 完了ルーチンを使用していない場合は、PoStartNextPowerIrp を呼び出します (Windows Server 2003、Windows XP、Windows 2000)。 Windows Vista 以降では、この呼び出しは必要なく、このような呼び出しで電源管理操作は実行されません。

    • IoCallDriver を呼び出すか (Windows 7 および Windows Vista)、PoCallDriver を呼び出して (Windows Server 2003、Windows XP、Windows 2000)、IRP を次の下位ドライバーに渡します。

    スタック内の各ドライバーは、IRP がバス ドライバーに到達するまで同じ処理を行います。 あるドライバーが IRP に失敗せざるを得ない場合は直ちに失敗し、IoCompleteRequest を呼び出します。

  4. デバイス PDO を維持するバス ドライバーは、要求されたアクションを実行し、IoCompleteRequest を呼び出して IRP を完了します。 バス ドライバーは、デバイスが取り出された場合、または取り出し処理中に、デバイスの電源投入 IRP に失敗する可能性があります。

  5. I/O マネージャーは、IRP をスタックに渡したときにドライバーによって設定された IoCompletion ルーチンを呼び出します。 すべての IoCompletion ルーチンが呼び出された後に、コールバック ルーチンが実行されます。

デバイス電源 IRP の詳細については、「個々のデバイスの電源管理」および「ウェイクアップ機能を備えたデバイスのサポート」を参照してください。 電源シーケンス IRP の詳細については、「IRP_MN_POWER_SEQUENCE」を参照してください。