I/O キューのディスパッチ モードの構成
警告
UMDF 2 は UMDF の最新バージョンであり、UMDF 1 に取って代わるものです。 すべての新しい UMDF ドライバーは、UMDF 2 を使用して記述する必要があります。 UMDF 1 には新機能が追加されておらず、Windows 10 の新しいバージョンでは UMDF 1 のサポートが制限されています。 ユニバーサル Windows ドライバーでは、UMDF 2 を使用する必要があります。
アーカイブされた UMDF 1 サンプルは、Windows 11, バージョン 22H2 - 2022 年 5 月 ドライバー サンプル アップデートでご確認いただけます。
詳しくは、UMDFの概要をご覧ください。
アプリケーションからの I/O 要求が到着すると、フレームワークは各要求を適切な I/O キューに配置します。 要求をドライバーに配信する方法とタイミングは、ドライバーが I/O キューのディスパッチを構成する方法と、ドライバーがコールバック関数の同期を指定する方法によって異なります。 I/O キューは、デバイスが適切な状態になるまでキュー内の I/O 要求を保持するために、UMDF の PnP および電源管理サブシステムとも対話します。
注: I/O キューのディスパッチ モードは、同期モードとは関係ありません。 I/O キューのディスパッチ構成は、ドライバーが任意の時点で処理を受け入れることができる要求の数を制御し、同期は要求を提示または取り消すイベント コールバック関数の同時実行を制御します。 ただし、ディスパッチ モードと同期モードを組み合わせることにより 、いくつかの操作モードが作成されます。
ドライバーは、ドライバーが IWDFDevice::CreateIoQueue メソッドを呼び出して既定のキューを構成するか、セカンダリ キューを作成するときに、I/O キューのディスパッチを構成します。 ドライバーは、ディスパッチ モードを識別する IWDFDevice::CreateIoQueue の DispatchType パラメーターで、WDF_IO_QUEUE_DISPATCH_TYPE 列挙型の値のいずれかを指定できます。 I/O キュー オブジェクトは、次のディスパッチ モードをサポートできます。
シーケンシャル
順次ディスパッチ モードは、WdfIoQueueDispatchSequential 値を使用して指定します。 このディスパッチ モードでは、処理状態のキューがイベントを発生させ、ドライバーが一度に 1 つの要求のみを処理するようにします。 キューは、ドライバーが現在の要求の処理を完了するか、IWDFIoRequest::ForwardToIoQueue メソッドを呼び出して要求を再度キューに入れるまで、追加の要求を延期します。 現在の要求が完了するか転送されると、キューはイベントを発生させ、次の要求を提供します。
Parallel
並列ディスパッチ モードは、WdfIoQueueDispatchParallel 値を使用して指定します。 このディスパッチ モードでは、処理状態のキューは、ドライバーの I/O 要求の準備ができたらすぐにイベントを発生させます。 ドライバーが I/O 要求を受信すると、ドライバーは次のいずれかの方法で I/O 要求を処理できます。
- ドライバーは、IWDFIoRequest::Complete または IWDFIoRequest::CompleteWithInformation メソッドを呼び出して、I/O 要求をすぐに完了します。 ドライバーは、I/O 要求が無効な場合、処理できない場合、またはデータを含むバッファーまたはキャッシュからデータをコピーすることによって完了できる場合は、すぐに I/O 要求を完了します。
- ドライバーは IWDFIoRequest ::ForwardToIoQueue メソッドを呼び出して、I/O 要求を再度キューに入れます。
- ドライバーは、IWDFIoRequest::Send メソッドを呼び出して、下位レベルのドライバーに I/O 要求を渡します。
手動
手動ディスパッチ モードは、WdfIoQueueDispatchManual 値を使用して指定します。 このディスパッチ モードでは、要求がキューに到着したときに、I/O キューはドライバーに自動的に通知しません。 ドライバーは、IWDFIoQueue::RetrieveNextRequest メソッドを呼び出して、キューから要求を手動で取得する必要があります。 これはポーリング モデルです。
UMDF バージョン 1.9 以降では、ドライバーが手動ディスパッチ モードを使用している場合は、IWDFIoRequest2::Requeue を呼び出して、ドライバーが取得した I/O キューの先頭に I/O 要求を返すことができます。 IWDFIoRequest2::Requeue を呼び出した後、ドライバーが次に IWDFIoQueue::RetrieveNextRequest を呼び出すと、再度キューに入れられた要求が取得されます。
すべてのディスパッチ モードでは、ドライバーが要求を処理するか、要求が取り消されるまで、I/O キュー オブジェクトが要求を受信して追跡します。
ドライバーが順次ディスパッチまたは並列ディスパッチ用にキューを構成している場合、フレームワークは、ドライバーがキューを作成するか、既定のキューを構成するときにドライバーによって登録されるコールバック関数を介して要求をドライバーに通知します。 詳細については、「I/O キュー イベント コールバック関数」を参照してください。