設定 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 佇列也會與 UMDF 的 PnP 和電源管理子系統互動,以保存佇列中的 I/O 要求,直到裝置達到適當的狀態為止。

注意 I/O 佇列的分派 模式與同步處理模式無關。 I/O 佇列的分派組態可控制驅動程式可以隨時接受處理的要求數目,而同步處理會控制同時執行呈現或取消要求的事件回呼函式。 不過,結合 分派和同步處理模式會建立數種作業模式。

驅動程式會在驅動程式呼叫 IWDFDevice::CreateIoQueue 方法來設定預設佇列或建立次要佇列時,設定 I/O 佇列的分派。 驅動程式可以在IWDFDevice::CreateIoQueueDispatchType參數中指定WDF_IO_QUEUE_DISPATCH_TYPE列舉類型的其中一個值,以識別分派模式。 I/O 佇列物件可以支援下列分派模式:

  • 循序

    循序分派模式是使用 WdfIoQueueDispatchSequential 值來指定。 在此分派模式中,處理狀態中的佇列會引發事件,讓驅動程式一次只處理一個要求。 佇列會延遲任何其他要求,直到驅動程式完成處理其目前的要求,或呼叫 IWDFIoRequest::ForwardToIoQueue 方法來重新佇列要求。 當目前的要求完成或轉送時,佇列會引發事件以提供下一個要求。

  • 平行

    平行分派模式是使用 WdfIoQueueDispatchParallel 值來指定。 在此分派模式中,處理狀態中的佇列會在 I/O 要求準備好供驅動程式使用時引發事件。 當驅動程式收到 I/O 要求時,驅動程式可以使用下列其中一種方式來處理 I/O 要求:

  • 手動

    手動分派模式是使用 WdfIoQueueDispatchManual 值來指定。 在此分派模式中,I/O 佇列不會在要求抵達佇列時自動通知驅動程式。 驅動程式必須呼叫 IWDFIoQueue::RetrieveNextRequest 方法來手動從佇列擷取要求。 這是輪詢模型。

    在 UMDF 1.9 版和更新版本中,如果您的驅動程式使用手動分派模式,它可以呼叫 IWDFIoRequest2::Requeue ,將 I/O 要求傳回給驅動程式從中取得它的 I/O 佇列前端。 呼叫 IWDFIoRequest2::Requeue之後,驅動程式的下一次呼叫 IWDFIoQueue::RetrieveNextRequest 會擷取重新排入佇列的要求。

對於所有分派模式, I/O 佇列物件 會接收並追蹤要求,直到驅動程式處理要求或取消要求為止。

如果驅動程式設定佇列以進行序列或平行分派,架構會透過驅動程式所註冊的回呼函式通知驅動程式要求,而驅動程式會在驅動程式建立佇列或設定預設佇列時註冊。 如需詳細資訊,請參閱 I/O 佇列事件回呼函式