共用方式為


重新佇列 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 隊列的要求重新排入父佇列。 如果驅動程式使用WdfPdoInitAllowForwardingRequestToParentWdfRequestForwardToParentDeviceIoQueue,框架會增加子裝置的堆疊大小,並將正確的 WDM 裝置物件分派給 I/O 請求。