I/O 要求的分派方法

當驅動程式呼叫 WdfIoQueueCreate 以建立 I/O 佇列時,它會指定佇列的分派方法。 架構提供三種分派方法: 循序平行手動。 驅動程式可以為任何 I/O 佇列指定任何分派方法,包括裝置 的預設 I/O 佇列

驅動程式會在佇列的WDF_IO_QUEUE_CONFIG結構中指定WDF_IO_QUEUE_DISPATCH_TYPE型別值,以設定佇列的分派方法。

如需每個分派方法的使用範例,請參閱 I/O 佇列的使用範例

循序分派

如果您的驅動程式或裝置一次只能處理來自佇列的一個 I/O 要求,您應該將裝置的 I/O 佇列設定為使用 循序分派,這也稱為 同步分派。 透過這種類型的分派,架構會一次將要求傳遞給驅動程式。 在驅動程式 完成取消重新佇列 先前的要求之前,架構不會傳遞下一個要求。

在架構將要求傳遞至其中一個驅動程式 的要求處理常式之後,驅動程式會 處理要求。 如果驅動程式將要求轉送至一 般 I/O 目標,它通常會呼叫其中一個 I/O 目標物件的同步方法。 如需這些方法的詳細資訊,請參閱 同步傳送 I/O 要求。 驅動程式最終必須 完成取消 它從 I/O 佇列接收的每個要求。

已設定 I/O 佇列進行循序分派的驅動程式可以呼叫 WdfIoQueueRetrieveNextRequestWdfIoQueueRetrieveRequestByFileObject ,以在上次接收的要求完成或取消之前,從佇列取得另一個要求。 您可能會想要在函式驅動程式中執行這項操作,讓驅動程式可以在驅動程式的 EvtInterruptDpc 回呼函式仍在處理先前硬體作業的資料時啟動下一個硬體作業。

如果您建立數個 I/O 佇列,並將其全部設定為循序分派,架構會循序分派每個佇列的要求,但佇列會以平行方式執行。 如果您的驅動程式或裝置一次只能處理任何類型的一個要求,您必須使用單一 I/O 佇列搭配 EvtIoDefault 回 呼函式。

平行分派

如果您的驅動程式和裝置可以同時處理多個 I/O 要求,您可以設定裝置的 I/O 佇列以使用 平行分派 ,讓驅動程式可以非同步處理要求。 這個分派方法也稱為 非同步分派

如果驅動程式設定 I/O 佇列以使用平行分派,架構會在佇列中提供 I/O 要求後立即傳遞至驅動程式。 結果是驅動程式可能需要一次處理數個要求。

每次驅動程式 的要求處理常式 收到要求時,驅動程式必須 處理要求 ,然後 完成 要求。 如果驅動程式將要求轉送至一 般 I/O 目標,它通常會呼叫其中一個 I/O 目標物件的非同步方法。 如需這些方法的詳細資訊,請參閱 以非同步方式傳送 I/O 要求。 驅動程式最終必須 完成取消 它從 I/O 佇列接收的每個要求。

使用平行分派的驅動程式可以呼叫 WdfIoQueueStopWdfIoQueueStopSynchronously 來暫時停止佇列,然後呼叫 WdfIoQueueStart 以重新開機佇列。

手動分派

如果您想要讓驅動程式完全控制 I/O 要求的傳遞,您可以設定裝置的 I/O 佇列以使用 手動分派,這表示架構不會將要求傳遞給驅動程式,除非驅動程式明確要求一個。

若要從手動佇列取得要求,驅動程式可以在輪詢佇列的迴圈中呼叫 WdfIoQueueRetrieveNextRequestWdfIoQueueRetrieveRequestByFileObject 。 或者,驅動程式可以呼叫 WdfIoQueueReadyNotify 來註冊當佇列中有一或多個要求可用時,架構會呼叫的回呼函式。 在架構呼叫回呼函式之後,驅動程式可以在迴圈中呼叫 WdfIoQueueRetrieveNextRequestWdfIoQueueRetrieveRequestByFileObject 來擷取要求。

驅動程式從佇列取得要求之後,必須 處理要求。 驅動程式最終必須 完成取消 每個要求。