デバイス電源ポリシーの管理

電源マネージャがシステムの電源ポリシーを維持および管理するのと同様に、各デバイスのデバイス スタック内の 1 つのドライバーが、デバイスの電源ポリシーを維持および管理します。 このドライバーは、デバイスの デバイス電源ポリシー所有者 です。

デバイスの電源ポリシー所有者は、デバイスの使用状況と電源状態に関する最も多くの情報を持つドライバーです。 この所有者は、デバイスの電源をオンまたはオフにするためにデバイス レジスタを物理的に設定できる必要はありませんが、デバイスがいつ使用されているか、アイドル状態になっているか、いつ電源状態を変更するかを判断できる必要があります。

通常は、デバイスのファンクション ドライバーが電源ポリシーの所有者ですが、一部のデバイスでは、別のドライバーまたはシステム コンポーネントがこの役割を引き受けます。 電源管理に関連するドライバーの種類の詳細については、「WDM ドライバーの種類」を参照してください。

一部のドライバーは、あるデバイス (FDO を作成) のファンクション ドライバーおよび列挙された子デバイスのバス ドライバー (PDO を作成) として機能します。 電源および PnP IRP のディスパッチ ルーチンでは、このようなドライバーは、FDO に送信された IRP と PDO に送信された IRP の処理を区別する必要があります。

たとえば、SCSI アダプターのドライバーは、アダプター自体のためのファンクション ドライバー (FDO を作成) と、アダプターに接続されているディスクのためのバス ドライバー (PDO を作成) の役割を実行する場合があります。 SCSI アダプター用のファンクション ドライバー/ポリシー所有者としての機能では、このドライバーはシステム IRP を受信し、SCSI アダプター用のデバイス IRP を要求します。 ディスクのバス ドライバーとしての機能では、作成するディスク PDO を指定するデバイス IRP を処理して完了します。 ドライバーが 1 つのデバイス (FDO) の電源ポリシーを所有しているからといって、このデバイスが、子デバイス (PDO) の電源ポリシーを所有しているわけではありません。

デバイスの電源ポリシー所有者は、次のことを担当します。

  • プラグ アンド プレイ マネージャーの IRP_MN_START_DEVICE要求を処理する PoSetPowerState を呼び出して、デバイスの初期電源状態を D0 に設定します。

    デバイスは必要に応じて電源をオンにする必要があります。たとえば、I/O 要求を処理するには、デバイスの電源を入れる必要があります。 デバイスの電源ポリシー所有者は、デバイスが必要なタイミングを判断し、デバイスの電源がオンになっていることを確認して、正しいデバイスの電源状態を設定する責任を負っています。 一般的なデバイスでは、PnP 開始デバイス IRP が完了した時点で、電源がオンになる必要があります。

    一般的なルールとして、ほとんどのデバイスは、システムが稼働状態であっても、使用されていない場合は電源をオフにする必要があります。

  • PoRequestPowerIrp を呼び出 して、システム電源要求に応答してデバイスの電源要求を送信します。

    たとえば、ポリシー所有者は、システム の電源設定 IRP を受け取ると、デバイス の電源設定 IRP を送信します。 システムがスリープ状態になると、ほとんどのデバイスは D3 になります。 DEVICE_CAPABILITIES 構造体の DeviceState 配列には、システムの電源状態ごとにデバイスが維持できる最も高い電力の状態が一覧表示されます。 (「デバイスの電源機能のレポート」を参照してください。)

  • デバイスがアイドル状態であることを検出し、エネルギーを節約するためにスリープ状態にします。

    電源マネージャーまたはデバイス ポリシー所有者は、アイドル状態のデバイスを検出し、デバイスの電源 IRP を送信してデバイスの状態を変更することができます。 詳細については、「アイドル状態デバイスの検出」を参照してください。

  • 必要に応じて、デバイスを動作状態に戻します。

    スリープ状態のデバイスの I/O 要求を受信したら、デバイスのドライバーは、そのデバイスを動作状態に戻す必要があります。

  • 要求に応じて、デバイスのウェイクアップを有効または無効にします。

    デバイス電源ポリシーの所有者は、「ウェイクアップ機能を備えたデバイスのサポート」の説明に従って、待機/スリープ解除 IRP を送信および取り消します。