控制一般 I/O 目標的狀態

您可以將 I/O 目標物件視覺化為具有兩個閘道:閘道內和外門。 當架構將要求傳遞至目標裝置物件時,外門控制,而當允許要求進入 I/O 目標時,閘道內控制。

架構會針對一般 I/O 目標定義下列狀態:

開始
I/O 目標物件的兩個閘道都會開啟。 驅動程式可以將 I/O 要求傳送至 I/O 目標佇列,而架構會將要求傳遞給適當的驅動程式。

停止
I/O 目標的閘道已開啟,但輸出閘道已關閉。 架構會停止將要求傳遞給適當的驅動程式。 若要將 I/O 要求傳送至 I/O 目標,驅動程式必須在每個要求的WDF_REQUEST_SEND_OPTIONS結構中設定WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATEWDF_REQUEST_SEND_OPTION_SEND_AND_FORGET

清除
I/O 目標物件的兩個閘道都會關閉。 除非驅動程式設定 WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATEWDF_REQUEST_SEND_OPTION_SEND_AND_FORGET,否則驅動程式無法將 I/O 要求傳送至 I/O 目標。 此外,架構會取消 I/O 目標物件內部佇列中的未處理要求。 從 KMDF 1.11 版開始,即可使用此狀態。

已關閉查詢-移除
遠端 I/O 目標會暫時關閉,因為其裝置可能很快就會移除。

關閉
I/O 目標已關閉,無法啟動或停止。

刪除
已移除 I/O 目標的裝置。

WDF_IO_TARGET_STATE列舉會定義代表這些狀態的值。 您的驅動程式可以呼叫 WdfIoTargetGetState 來取得 I/O 目標的狀態。

本機 I/O 目標狀態

架構會自動開啟並啟動本機 I/O 目標。

如有必要,驅動程式可以呼叫 WdfIoTargetStop 來暫時停止本機 I/O 目標,並呼叫 WdfIoTargetStart 重新開機它。 例如,如果驅動程式偵測到暫時性錯誤狀況,驅動程式可能會停止本機 I/O 目標,然後在修正錯誤狀況時重新開機 I/O 目標。

在 KMDF 1.11 版和更新版本中,驅動程式可以呼叫 WdfIoTargetPurge ,暫時防止 I/O 要求傳送至本機 I/O 目標,以及取消目標佇列中未處理的要求。 例如,在檔案控制代碼清除過程中,驅動程式可能會清除本機 I/O 目標,以確保所有傳送至驅動程式的要求都會取消。

如果移除本機 I/O 目標的裝置,架構會自動停止並關閉 I/O 目標,並 取消 目標佇列中的所有 I/O 要求。 架構會透過呼叫裝置物件事件回呼函式,通知驅動程式無法再使用裝置。 如需這些回呼函式的詳細資訊,請參閱 PnP 和電源管理案例

遠端 I/O 目標狀態

驅動程式必須呼叫 WdfIoTargetOpen 以開啟遠端 I/O 目標。 當驅動程式開啟遠端 I/O 目標時,架構會自動啟動 I/O 目標。

如有必要,驅動程式可以呼叫 WdfIoTargetStop 來暫時停止遠端 I/O 目標,並呼叫 WdfIoTargetStart 將其重新開機。

在 KMDF 1.11 版和更新版本中,驅動程式可以呼叫 WdfIoTargetPurge ,暫時防止 I/O 要求傳送至遠端 I/O 目標,以及取消目標佇列中未處理的要求。

如果移除遠端 I/O 目標的裝置,架構會自動停止並關閉 I/O 目標,並取消目標佇列中的所有 I/O 要求,除非驅動程式註冊下列事件回呼函式:

EvtIoTargetQueryRemove
通知驅動程式,遠端 I/O 目標的裝置可能會遭到移除。 如果您希望驅動程式允許移除裝置,驅動程式必須呼叫 WdfIoTargetCloseForQueryRemove

EvtIoTargetRemoveComplete
通知驅動程式遠端 I/O 目標的裝置已移除。 此回呼函式必須呼叫 WdfIoTargetClose

EvtIoTargetRemoveCanceled
通知驅動程式,嘗試移除遠端 I/O 目標的裝置已取消。 此回呼函式必須呼叫 WdfIoTargetOpen,而驅動程式通常會呼叫 WDF_IO_TARGET_OPEN_PARAMS_INIT_REOPEN 來初始化其WDF_IO_TARGET_OPEN_PARAMS_INIT函式。

如果驅動程式已使用遠端 I/O 目標完成,且不會再次使用目標,而且目標沒有仍然擱置的子要求物件,則驅動程式可以呼叫 WdfObjectDelete ,而不需要先呼叫 WdfIoTargetClose。 如果目標有任何仍在擱置中的子要求物件,驅動程式必須先呼叫 WdfIoTargetClose ,才能安全地呼叫 WdfObjectDelete