儲存體類別驅動程式的 IoCompletion 常式
儲存體類別驅動程式必須有一或多個 IoCompletion 常式,除非驅動程式會同步等候它傳送至埠驅動程式的每個 IRP 完成,並視需要重試要求,然後從分派或 BuildRequest 常式內釋放 SRB 的記憶體。 請注意,同步處理每個 IRP 會降低類別驅動程式的效能。 此外,可能保存系統頁面檔案之裝置的儲存類別驅動程式必須以非同步方式處理所有傳輸要求,因此必須有 IoCompletion 常式來進行讀取/寫入要求。
如 儲存體類別驅動程式的 BuildRequest 常式中所述,儲存類別驅動程式會負責釋放它們配置給 SRB 的記憶體,無論是回到 lookaside 清單還是非分頁集區。 如同任何其他較高層級的核心模式驅動程式,它們也會負責釋放其配置的任何 IRP,例如 IRP 來分割傳輸要求,如 儲存體類別驅動程式的 SplitTransferRequest 常式中所述。
類別驅動程式的 IoCompletion 常式最終會負責確保已設定 I/O 狀態欄塊,以及完成原始 IRP。 請注意,完成 IRP 可以包括將 SRB 的 ScsiStatus 成員或 SenseInfoBuffer 成員中傳回的錯誤轉譯成 NTSTATUS 類型值和/或記錄錯誤,如 在分派常式中完成 IRP中所述。
處理要求時發生特定種類的錯誤時,儲存體埠驅動程式會凍結其內部佇列,以取得目標邏輯單元 (LU) ,並在要求完成時設定SRB_STATUS_QUEUE_FROZEN。 因此,類別驅動程式通常會有內部常式來變更其裝置 I/O 要求的佇列狀態。 如需詳細資訊,請參閱 儲存體類別驅動程式的 ReleaseQueue 常式。
如果驅動程式的 BuildRequest 常式要求埠驅動程式傳回要求的感知資訊,其 IoCompletion 常式會呼叫內部 InterpretRequestSense 常式,或內嵌實作相同的功能。 如需詳細資訊,請參閱 儲存體類別驅動程式的 InterpretRequestSense 常式。
儲存體類別驅動程式負責重試因目標控制器錯誤、匯流排重設或要求逾時而失敗的要求。 當埠驅動程式傳回其SrbStatus設定為指出這類錯誤的特定要求時,類別驅動程式可以從其IoCompletion常式呼叫RetryRequest常式,或可能從其InterpretRequestSense 常式呼叫 RetryRequest常式。 如需詳細資訊,請參閱 儲存體類別驅動程式的 RetryRequest 常式。
如需 IoCompletion 常式的一般資訊,請參閱 完成 IRP。