管理 I/O 佇列

啟動 I/O 佇列

當驅動程式呼叫 WdfIoQueueCreate 以建立 I/O 佇列時,架構會自動讓佇列接收 I/O 要求,並將其傳遞至驅動程式。

驅動程式通常會從EvtDriverDeviceAdd回呼函式內呼叫WdfIoQueueCreate。 架構可以在驅動程式的 EvtDriverDeviceAdd 回呼函式傳回之後,開始將 I/O 要求傳遞給驅動程式。

如果您的驅動程式使用 受電源管理的 I/O 佇列,架構就無法開始將要求傳遞給驅動程式,直到裝置進入其工作狀態,而且架構已呼叫驅動程式的 EvtDeviceD0Entry 回 呼函式。

停止和重新開機 I/O 佇列

您的驅動程式可以呼叫 WdfIoQueueStopWdfIoQueueStopSynchronously ,暫時防止架構從 I/O 佇列傳遞 I/O 要求。 若要繼續傳遞 I/O 要求,驅動程式會呼叫 WdfIoQueueStart

如果您的驅動程式使用受電源管理的 I/O 佇列,當裝置離開其運作 (D0) 狀態時,架構會自動停止裝置的佇列,而當裝置狀態回到 D0 時,架構就會重新開機佇列。

將要求新增至 I/O 佇列

當系統將讀取、寫入或裝置 I/O 控制要求傳送給驅動程式時,架構會將要求放在 I/O 佇列中。 驅動程式可以藉由呼叫 WdfDeviceConfigureRequestDispatching來控制架構儲存在每個佇列中的要求類型。

驅動程式也可以藉由呼叫 WdfRequestForwardToIoQueue來重新排入從架構收到的要求。

從 I/O 佇列取得要求

如果驅動程式指定 I/O 佇列的循序或平行 分派方法 ,它會在 要求處理常式中接收要求。

如果驅動程式指定手動或循序分派方法,則可以呼叫 WdfIoQueueRetrieveNextRequestWdfIoQueueRetrieveRequestByFileObject來取得要求。

搜尋 I/O 要求

如果驅動程式指定 I/O 佇列的手動 分派方法 ,則可以使用下列步驟來搜尋佇列中的特定要求:

  1. 呼叫 WdfIoQueueFindRequest 以找出符合驅動程式指定準則的要求。

  2. 呼叫 WdfIoQueueRetrieveFoundRequest 以擷取 WdfIoQueueFindRequest 所找到的要求。

清除或清空 I/O 佇列

清除 I/O 佇列表示停止將 I/O 要求插入佇列,並取消已在佇列中的任何要求。

清空 I/O 佇列表示停止將 I/O 要求插入佇列,同時允許將已存在於佇列中的任何要求傳遞至驅動程式。

只有在佇列未受電源管理時,驅動程式通常會清除或清空其佇列。 針對電源管理的 I/O 佇列,驅動程式可以提供 EvtIoStopEvtIoResume 回呼函式。

如果某些驅動程式的佇列未受電源管理,您可能會想要在相關聯的裝置或 I/O 通道無法使用時清除或清空佇列。 一般而言,除非每個要求包含非常重要的資訊,否則您將清除佇列,而不是清空佇列。 例如,網路裝置的驅動程式可能會清除其佇列,而存放裝置的驅動程式可能會清空其佇列。

如果您想要讓驅動程式清除或清空 I/O 佇列,驅動程式可以呼叫下列其中一個佇列物件方法:

呼叫 WdfIoQueueDrainWdfIoQueueDrainSynchronously時,請小心。 由於清空作業會等候要求完成,因此如果您確定佇列的暫止要求會及時完成,就應該清空佇列。 如果您不知道完成 I/O 要求所需的時間,而且可以接受取消未處理的要求,請考慮清除佇列。

將要求從一個 I/O 佇列移至另一個

在驅動程式收到 I/O 要求之後,您可能希望驅動程式將要求重新排入不同的 I/O 佇列。 若要這樣做,驅動程式會呼叫 WdfRequestForwardToIoQueueWdfRequestForwardToParentDeviceIoQueue,這會將要求新增至指定佇列的結尾。 最後,架構會使用指定的佇列分派方法,再次將要求傳遞給驅動程式。 如需將 I/O 要求從一個 I/O 佇列移至另一個佇列的詳細資訊,請參閱 重新排入佇列 I/O 要求

在已排入佇列之前攔截 I/O 要求

驅動程式可以在架構將要求放在 I/O 佇列中之前攔截 I/O 要求。 若要攔截 I/O 要求,驅動程式必須呼叫 WdfDeviceInitSetIoInCallerCoNtextCallback 來註冊 EvtIoInCallerCoNtext 回呼 函式。

架構會將 EvtIoInCallerCoNtext 回呼 函式與裝置產生關聯。 因此,架構會在每次收到系統傳送至裝置的要求時呼叫 EvtIoInCallerCoNtext 回 呼函式。

一般而言, 當 EvtIoInCallerCoNtext 回呼 函式收到要求時,它會對要求執行一些初步處理。 接下來,回呼函式會呼叫 WdfDeviceEnqueueRequest,它會將要求傳回給架構。 架構接著可以將要求放在適當的 I/O 佇列中,就像它沒有呼叫 EvtIoInCallerCoNtext 回呼 函式一樣。

驅動程式可能會提供 EvtIoInCallerCoNtext 回呼函式的主要原因是驅動程式必須處理支援 未緩衝處理或直接 I/O 方法的 I/O 作業。 針對這個 I/O 方法,驅動程式必須存取 I/O 要求之來源進程內容中收到的緩衝區。 如需詳細資訊,請參閱 在 Framework-Based 驅動程式中存取資料緩衝區

取得 I/O 佇列屬性

若要取得架構佇列物件的屬性,驅動程式可以呼叫下列方法: