電源管理された I/O キューの使用

ドライバーが I/O キューを作成する場合、キューを "電源管理する" かどうかを指定できます。**電源管理されたキューに I/O 要求が追加されると、フレームワークは、デバイスが作業状態 (D0) である場合にのみ、その要求をドライバーに送信します。

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

ドライバーが電源管理された I/O キューを使用する場合、2 つの追加のコールバック関数を提供できます。

  • EvtIoStop
    EvtIoStop コールバック関数は、指定された I/O 要求の処理を停止します。デバイスが作業状態 (D0) から別の状態に一時的に移行しているか、デバイスが取り外されているために、キューからドライバーへの I/O 要求の送信を停止するときに、フレームワークは I/O キューの EvtIoStop コールバック関数を呼び出します。

  • EvtIoResume
    EvtIoResume コールバック関数は、以前に停止された I/O 要求の処理を再開します。デバイスが作業状態に戻った後、フレームワークは、キューからドライバーへの I/O 要求の送信を再開するときに、I/O キューの EvtIoResume コールバック関数を呼び出します。

 

デバイスの I/O キューが電源管理されている場合、フレームワークは、キューに送信したすべての I/O 要求が完了するか取り消されるまで、デバイスが作業状態から別の状態に移行することを許可しません。EvtIoStop コールバック関数を提供することで、ドライバーは、デバイスおよび場合によってはシステムが低電力状態に移行するまでの時間を短縮できます。

電源管理された I/O キューに対して ドライバーが EvtIoStop コールバック関数を登録した場合に、デバイスが使用できなくなると、ドライバーが現在所有している "各" I/O 要求の EvtIoStop 関数が呼び出されます。**

ドライバーが所有する要求ごとに、EvtIoStop コールバック関数は次のいずれかを実行できます。

ドライバーが WdfRequestStopAcknowledge を呼び出す場合、フレームワークが要求を再配置するかどうかを示すブール型の Requeue 引数が指定されます。

  • ドライバーが Requeue を TRUE に設定すると、キューが再開された後に要求をドライバーの要求ハンドラーの 1 つに再び送信できるように、フレームワークはその要求を I/O キューに返します。ドライバーは通常、以前に要求を受け取っていないものとして要求を再処理します。

  • ドライバーが Requeue を FALSE に設定すると、フレームワークは要求をキューに再配置しません。代わりに、デバイスが作業状態に戻った後、フレームワークはドライバーの EvtIoResume コールバック関数を呼び出します。このコールバック関数は、要求の処理を再開できます。

フレームワークがドライバーの EvtIoStop コールバック関数を呼び出すたびに、この関数は I/O 要求を完了するか、WdfRequestStopAcknowledge を呼び出して、要求の所有権をフレームワークに返す必要があります。それ以外の場合、フレームワークは、デバイスが作業状態から別の状態に移行することを許可しません。