電力管理された I/O キューの使用
ドライバーは、I/O キューを作成するときに、キューが電源管理されているかどうかを指定できます。 電源管理キューで I/O リクエストを使用できる場合、フレームワークは、デバイスが動作中 (D0) 状態の場合にのみ、ドライバーにリクエストを配信します。 フレームワークは、フレームワークが電源管理キューからドライバーに配信したすべての I/O 要求が完了、取り消し、または延期されるまで、デバイスが動作状態を残すことを許可しません。
電源管理 I/O キューの詳細については、「I/O キューの電源管理」を参照してください。
電源管理キューのコールバック関数
ドライバーが電源管理 I/O キューを使用している場合は、次の 2 つの追加のコールバック関数を提供できます。
EvtIoStop
EvtIoStop コールバック関数は、指定された I/O 要求の処理を停止します。 デバイスが動作 (D0) 状態を離れるか削除されると、フレームワークは、ドライバーが所有する要求や I/O ターゲットに転送された要求など、ドライバーが完了していないすべての I/O 要求に対して I/O キューの EvtIoStop コールバック関数を 1 回呼び出します。
EvtIoResume
EvtIoResume コールバック関数は、以前に停止した I/O 要求の処理を再開します。 フレームワークは、デバイスが動作状態に戻った後、キューからドライバーへの I/O 要求の配信を再開するときに、I/O キューの EvtIoResume コールバック関数を呼び出します。
フレームワークがドライバーの EvtIoStop コールバック関数を呼び出すたびに、通常、この関数は I/O 要求を完了またはキャンセルするか、WdfRequestStopAcknowledge を呼び出して要求の所有権をフレームワークに返します。
これは省略可能ですが、一般に、電源管理キューの EvtIoStop コールバック関数を提供する必要があります。 EvtIoStop を提供することで、ドライバーはデバイス(場合によってはシステム)が低電力状態になるまでの経過時間を短縮するのに役立ちます。
電源管理キューに EvtIoStop を指定しない場合、フレームワークは、デバイス (またはシステム) を下位の電源状態に移動するか、デバイスを削除する前に、電源管理キューからドライバーに配信されるすべての要求が完了するまで待機します。 この操作によって、システムが休止状態または別の低システム電源状態に入らないようにすることができます。 最悪の場合、システムがバグチェックコード 9F でクラッシュする可能性があります。
ドライバーが I/O ターゲットに要求を転送せず、不確定な時間の要求を保持していない場合は、電源管理キューの EvtIoStop を安全に省略できます。
ディスパッチャー オブジェクトの待機
一般に、ドライバーでは、非固定スレッド コンテキスト内の同期メカニズムとしてディスパッチャー オブジェクトのみを使用する必要があります。
要求ハンドラーは任意のスレッド コンテキストで実行されるため、電源管理キューの要求ハンドラーは、カーネル ディスパッチャー オブジェクトが設定されるのを待つ必要はありません。 これを行うと、デッドロックが発生する可能性があります。
ドライバーがディスパッチャー オブジェクトを待機できるタイミングとできない場合の対処方法については、「カーネル ディスパッチャー オブジェクトの概要」を参照してください。