重新佇列 I/O 要求
驅動程式可以重新佇列從 I/O 佇列取得的 I/O 要求。 驅動程式可以將 I/O 要求重新佇列至驅動程式為相同裝置建立的另一個 I/O 佇列。 此外, 匯流排驅動程式 可以將 I/O 要求從子裝置的 I/O 佇列重新排入父裝置的 I/O 佇列。
將 I/O 要求重新佇列至裝置的不同 I/O 佇列
驅動程式的要求處理常式從驅動程式的 I/O 佇列收到 I/O 要求之後,驅動程式可以呼叫 WdfRequestForwardToIoQueue ,將要求重新佇列至另一個佇列。
例如,如果您想要讓驅動程式在處理要求之前配置資源給要求,驅動程式的 EvtIoDefault 回呼函式可以接收所有要求、將資源資訊儲存在每個要求的內容記憶體中,然後呼叫 WdfRequestForwardToIoQueue 將每個要求重新排入佇列。
如果您的驅動程式呼叫 WdfRequestForwardToIoQueue ,以重新佇列驅動程式從使用循序 分派方法從 I/O 佇列取得的 I/O 要求,架構會將下一個 I/O 要求從循序佇列傳遞至驅動程式,而不需要等候重新佇列的要求完成。
如果您的驅動程式使用手動分派方法,它可以呼叫 WdfRequestRequeue 方法,將 I/O 要求傳回給驅動程式從中取得它的 I/O 佇列前端。 呼叫 WdfRequestRequeue之後,驅動程式的下一個呼叫 WdfIoQueueRetrieveNextRequest 會擷取重新佇列的要求。
將 I/O 要求重新佇列至父裝置的 I/O 佇列
父裝置的函式驅動程式可以做為 匯流排驅動程式 , 以列舉 父裝置的子裝置,並為子裝置建立 實體裝置物件 (PDO) 。 這類驅動程式有時會收到父裝置必須處理的子裝置 I/O 要求。
例如,通訊協定匯流排 (例如 USB) 通常會控制指派給每個連線裝置的硬體資源。 因此,父匯流排的函式驅動程式通常會處理每個子裝置的 I/O 作業。 當 I/O 管理員將 I/O 要求傳送至其中一個子裝置的 裝置堆疊 時,匯流排的函式驅動程式會在其中一個子裝置的 I/O 佇列中接收 I/O 要求,因為該驅動程式建立了子裝置的 PDO。 在驅動程式可以在父匯流排裝置的內容中處理 I/O 要求之前,必須先將來自子裝置 I/O 佇列的 I/O 要求重新佇列至屬於父裝置的 I/O 佇列。
不過,驅動程式無法呼叫 WdfRequestForwardToIoQueue ,將要求從子佇列移至父佇列。 因為 I/O 管理員會為父裝置和子裝置建立個別的裝置堆疊,所以基礎 WDM 裝置物件必須先從代表子裝置的裝置變更為代表父系的裝置。
在 KMDF 1.9 版之前,驅動程式只能藉由建立 遠端 I/O 目標、增加子裝置裝置的裝置堆疊大小,以及指定正確的 WDM 裝置物件,將 I/O 要求從子裝置傳送至其父系。
從 KMDF 1.9 版開始,驅動程式可以在建立子裝置之前呼叫 WdfPdoInitAllowForwardingRequestToParent, 然後呼叫 WdfRequestForwardToParentDeviceIoQueue ,將子系 I/O 佇列的要求重新佇列至父佇列。 如果驅動程式使用WdfPdoInitAllowForwardingRequestToParent 和 WdfRequestForwardToParentDeviceIoQueue,架構會增加子系的裝置堆疊大小,並將正確的 WDM 裝置物件指派給 I/O 要求。