次の方法で共有


I/O キューのディスパッチ モードの構成

フレームワークは、アプリケーションからの I/O要求を受け取ると、各要求を適切な I/O キューに配置します。要求がいつどのようにドライバーに送信されるかは、ドライバーで I/O キューのディスパッチとコールバック関数の同期がどのように構成されているかによって決まります。I/O キューは、デバイスが適切な状態になるまで I/O 要求をキューに保持するために、UMDF の PnP と電源の管理サブシステムともやり取りします。

   I/O キューのディスパッチ モードは、同期モードとは関係ありません。I/O キューのディスパッチの構成は、ドライバーが任意の時点で処理のために受け入れることのできる要求の数を制御します。一方、同期は、要求を提出したり取り消したりするイベント コールバック関数の同時実行を制御します。ただし、いくつかの操作モードは、ディスパッチ モードと同期モードの組み合わせによって作成されます。

ドライバーは、IWDFDevice::CreateIoQueue メソッドを呼び出して既定のキューを構成したりセカンダリ キューを作成したりするときに、I/O キューのディスパッチを構成します。ディスパッチ モードを指定するには、IWDFDevice::CreateIoQueueDispatchType パラメーターに WDF_IO_QUEUE_DISPATCH_TYPE 列挙型の値を指定します。I/O キュー オブジェクトでは、以下のディスパッチ モードがサポートされます。

  • 順次

    順次ディスパッチ モードを指定するには、WdfIoQueueDispatchSequential 値を使用します。このディスパッチ モードでは、処理状態のキューで、ドライバーで一度に 1 つの要求のみが処理されるようにイベントが発生します。後続の要求は、ドライバーで現在の要求の処理が完了するまで延期されるか、IWDFIoRequest::ForwardToIoQueue メソッドを呼び出してキューに再登録されます。現在の要求が完了するか転送されると、キューでイベントが発生して次の要求が渡されます。

  • 並列

    並列ディスパッチ モードを指定するには、WdfIoQueueDispatchParallel 値を使用します。このディスパッチ モードでは、処理状態のキューで、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 メソッドを呼び出して手動でキューから要求を取得する必要があります。これは、ポーリング モデルです。

    Version 1.9 以降の UMDF では、ドライバーで手動ディスパッチ モードを使用する場合に、IWDFIoRequest2::Requeue を呼び出して I/O 要求を取得元の I/O キューの先頭に戻すことができます。IWDFIoRequest2::Requeue を呼び出した後の次の IWDFIoQueue::RetrieveNextRequest の呼び出しでは、その再登録された要求が取得されます。

どのディスパッチ モードでも、I/O キュー オブジェクトが要求を受信して、ドライバーによって処理されるか取り消されるまで追跡します。

ドライバーで構成されているキューのディスパッチ モードが順次ディスパッチまたは並列ディスパッチの場合は、ドライバーがキューを作成したときまたは既定のキューを構成したときに登録したコールバック関数を通じてフレームワークが要求をドライバーに通知します。詳細については、「I/O キュー イベントのコールバック関数」を参照してください。