設定 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::CreateIoQueue 的 DispatchType 參數中指定 WDF_IO_QUEUE_DISPATCH_TYPE 列舉類型的其中一個值,以識別分派模式。 I/O 佇列物件 可以支援下列分派模式:
順序
循序派遣模式透過 WdfIoQueueDispatchSequential 值來指定。 在此分派模式中,處理狀態的佇列會引發事件,讓驅動程式一次只處理一個要求。 佇列會延遲任何其他要求,直到驅動程式完成處理其目前的要求,或呼叫 IWDFIoRequest::ForwardToIoQueue 方法來重新排入要求。 當目前的要求完成或轉送時,佇列會引發事件以提供下一個要求。
平行
平行分派模式是使用 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 佇列事件回呼函式。