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 佇列進行循序分派的驅動程式可以呼叫 WdfIoQueueRetrieveNextRequest 或 WdfIoQueueRetrieveRequestByFileObject ,以在上次接收的要求完成或取消之前,從佇列取得另一個要求。 您可能會想要在函式驅動程式中執行這項操作,讓驅動程式可以在驅動程式的 EvtInterruptDpc 回呼函式仍在處理先前硬體作業的資料時啟動下一個硬體作業。
如果您建立數個 I/O 佇列,並將其全部設定為循序分派,架構會循序分派每個佇列的要求,但佇列會以平行方式執行。 如果您的驅動程式或裝置一次只能處理任何類型的一個要求,您必須使用單一 I/O 佇列搭配 EvtIoDefault 回 呼函式。
平行分派
如果您的驅動程式和裝置可以同時處理多個 I/O 要求,您可以設定裝置的 I/O 佇列以使用 平行分派 ,讓驅動程式可以非同步處理要求。 這個分派方法也稱為 非同步分派。
如果驅動程式設定 I/O 佇列以使用平行分派,架構會在佇列中提供 I/O 要求後立即傳遞至驅動程式。 結果是驅動程式可能需要一次處理數個要求。
每次驅動程式 的要求處理常式 收到要求時,驅動程式必須 處理要求 ,然後 完成 要求。 如果驅動程式將要求轉送至一 般 I/O 目標,它通常會呼叫其中一個 I/O 目標物件的非同步方法。 如需這些方法的詳細資訊,請參閱 以非同步方式傳送 I/O 要求。 驅動程式最終必須 完成 或 取消 它從 I/O 佇列接收的每個要求。
使用平行分派的驅動程式可以呼叫 WdfIoQueueStop 或 WdfIoQueueStopSynchronously 來暫時停止佇列,然後呼叫 WdfIoQueueStart 以重新開機佇列。
手動分派
如果您想要讓驅動程式完全控制 I/O 要求的傳遞,您可以設定裝置的 I/O 佇列以使用 手動分派,這表示架構不會將要求傳遞給驅動程式,除非驅動程式明確要求一個。
若要從手動佇列取得要求,驅動程式可以在輪詢佇列的迴圈中呼叫 WdfIoQueueRetrieveNextRequest 或 WdfIoQueueRetrieveRequestByFileObject 。 或者,驅動程式可以呼叫 WdfIoQueueReadyNotify 來註冊當佇列中有一或多個要求可用時,架構會呼叫的回呼函式。 在架構呼叫回呼函式之後,驅動程式可以在迴圈中呼叫 WdfIoQueueRetrieveNextRequest 或 WdfIoQueueRetrieveRequestByFileObject 來擷取要求。