共用方式為


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 來擷取要求。

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