Share via


I/O キューの電源管理

フレームワークは、ドライバーのいずれかのデバイスに送信される I/O 要求を受け取ると、その要求を適切な I/O キューに追加します。ドライバーは、要求ハンドラーを指定するか、キューにポーリングを行うことによって、I/O キューから I/O 要求を受け取ることができます。I/O キューの詳細については、「フレームワークベースのドライバーでの I/O 要求の処理」を参照してください。

ドライバーの設計時には、ドライバーが受信する I/O 要求を次の 2 つのカテゴリに分類する必要があります。

  1. デバイスが作業状態 (D0) である必要がある要求。次の要求が該当します。
    • デバイスの関数ドライバーが、デバイスからデータを読み取る必要のある読み取り要求、またはデバイスにデータを書き込む必要のある書き込み要求。
    • 関数ドライバーまたはバス ドライバーが、デバイスにアクセスしなければ処理できないデバイス制御要求。
  2. デバイスが作業状態 (D0) である必要のない要求。次の要求が該当します。
    • 関数ドライバーまたはバス ドライバーが、デバイスにアクセスしなくても処理できるデバイス制御要求。
    • フィルター ドライバーが受信するほぼすべての要求。
    • ハードウェアと通信しないソフトウェア専用のデバイスをドライバー スタックがサポートしている場合は、スタック内のすべてのドライバーが受信するすべての要求。

フィルター ドライバーを作成する場合や、ハードウェアと通信しないスタックのドライバーを作成する場合を除き、デバイスが作業状態である必要のある要求 (およびその必要のない要求) を、ドライバーが受信する可能性は高いと言えます。

これら 2 種類の要求に対応するため、フレームワークには、"電源管理された" I/O キューとそうでない I/O キューの 2 種類の I/O キューが用意されています**。ドライバーは、I/O キューを作成するたびに、キューの WDF_IO_QUEUE_CONFIG 構造体の PowerManaged メンバーを WdfTrue または WdfFalse に設定して、次のいずれかを指定します。

  • PowerManagedWdfTrue に設定すると、キューが電源管理されます。

    電源管理されたキューに I/O 要求が追加されると、フレームワークは、デバイスが作業状態 (D0) である場合にのみ、その要求をドライバーに送信します。このため、ドライバーが電源管理されたキューから要求を受信した場合は、デバイスが使用可能であることをフレームワークによって保証されたことになります。デバイスが作業状態でない場合、フレームワークは、デバイスが使用できる状態になるまで、要求をキューに保存します。

    デバイスがアイドル状態であるために低電力状態にあるときに、フレームワークが I/O 要求をドライバーのいずれかの電源管理されたキューに追加した場合、フレームワークは、ドライバーに要求を送信する前に、デバイスを作業状態に戻すようドライバー スタックに依頼します。

    システムが作業状態 (S0) でないためにデバイスが低電力状態にあるときに、フレームワークが I/O 要求をドライバーのいずれかの電源管理されたキューに追加した場合、フレームワークは、デバイスが作業状態 (D0) に戻るまで待機してから、ドライバーに要求を送信します。

    デバイスが作業状態でない場合、フレームワークは電源管理されたキューに I/O 要求を送信しないので、ドライバー スタック内で電源ポリシー所有者より上位にあるドライバーでは、電源管理された I/O キューを使用しないでください**。電源ポリシー所有者より上位にあるドライバーで電源管理されたキューを使用している場合に、デバイスが低電力状態になると、その上位ドライバーは要求を受信しないため、電源ポリシー所有者に要求を渡すことができません。このため、デバイスの電源状態を制御する電源ポリシー所有者が、デバイスを作業状態に戻すことができなくなります。

  • ドライバーで PowerManagedWdfFalse に設定すると、キューは電源管理されません。

    電源管理されていないキューに I/O 要求が追加されると、フレームワークは、デバイスが作業状態 (D0) であるかどうかに関係なく、ドライバーに要求を送信します。デバイスへのアクセスを必要としない要求だけを受信するようにキューを設定している場合は、デバイスが使用できない状態でも、ドライバーで各要求を処理できます。

電源管理された I/O キューの詳細については、「電源管理された I/O キューの使用」を参照してください。

ドライバーの中には、プラグ アンド プレイ (PnP) 操作や電源管理操作を直接制御する必要のあるものがあります。このようなドライバーでは、"自己管理 I/O" を使用できます**。詳細については、「自己管理 I/O の使用」を参照してください。