共用方式為


儲存類別驅動程式的 BuildRequest 常式

如同所有較高層級的核心模式驅動程式,儲存類別驅動程式必須在 處理對存放裝置周邊的要求時,為下一個較低驅動程式設定 IRP 的 I/O 堆疊位置。 在類別驅動程式為系統提供的埠驅動程式設定 SB 的 IRP 中,埠驅動程式的 I/O 堆疊位置會設定如下:

  • MajorFunction 包含IRP_MJ_SCSI

  • Parameters.Scsi.Srb 包含 SRB 的指標

每個類別驅動程式都會負責配置 SRB 的記憶體,以及針對基礎儲存體埠驅動程式使用 CDB 進行設定。 類別驅動程式可以使用 ExInitializeNPageLo以sidesideList 設定其 SRB 的 lookaside 清單,或針對非分頁式記憶體呼叫 ExAllocatePool 。 如需使用 lookaside 清單和非分頁集區的詳細資訊,請參閱使用 Lookaside 清單

無論是從集區或從驅動程式建立的 lookaside 清單配置記憶體,每個儲存類別驅動程式都會負責釋放它配置給 SRB 的記憶體。 儲存體類別驅動程式的 IoCompletion 常式,如 儲存體類別驅動程式的 IoCompletion 常式中所述,通常會將配置給 SRB 的記憶體釋放回 lookaside 清單。

類別驅動程式的 BuildRequest 常式必須在 SRB 成員中設定適當的值,包括其設定為與其裝置通訊的 CDB 長度。 對於傳回要求感知資訊和/或驅動程式可能需要重試的要求,它會在 IRP 中設定 IoCompletion 常式。 針對讀取或寫入要求,其會分別具有適當傳輸方向的 SrbFlags ,SRB_FLAGS_DATA_IN或SRB_FLAGS_DATA_OUT。

BuildRequest常式可能會負責設定 SRB 與一對SendSrbSynchronousSendSrbAsynchronous常式。 也就是說, BuildRequest 常式可以設定通常針對所有要求設定的 SRB 成員,而 SendSrbXxx 常式則每個設定的 SRB 值只與每種要求類型相關。 當 IRP 從 SendSrbAsynchronous 常式向下傳遞至埠驅動程式時,必須使用驅動程式提供的 IoCompletion 常式來設定 IRP。

載入類別驅動程式之後,它會設定大部分的 SRB,並將 Function 成員設定為 SRB_FUNCTION_EXECUTE_SCSI,指出要透過匯流排傳送的裝置 I/O 要求。

如需系統定義 SRB 成員及其值的詳細資訊,請參閱 SCSI_REQUEST_BLOCK

設定要求感知的 SRB

當目標控制器傳回檢查條件時,類別驅動程式可以要求埠驅動程式傳回 SCSI 要求感知或對等資訊。 若要這樣做,類別驅動程式會在 SRB 中設定 SenseInfoBuffer 指標和 SenseInfoBufferLength ,因此埠驅動程式可以在檢查條件發生時傳回要求感知資訊。 埠驅動程式藉由在傳回 IRP 時,使用 SRB_STATUS_AUTOSENSE_VALID 設定 SrbStatus 成員,以指出它傳回要求感知資訊。 如需 InterpretSenseInfo 常式的詳細資訊,請參閱 儲存體類別驅動程式的 InterpretRequestSense 常式

重試

儲存體類別驅動程式負責重試因目標/控制器錯誤、匯流排重設或要求逾時而失敗的要求。 因此,許多類別驅動程式都會在 IRP 的自己的 I/O 堆疊位置中維護重試計數。 這類類別驅動程式的 BuildRequest 常式也可能在設定 IoCompletion 常式並將 IRP 傳送至埠驅動程式之前,先初始化指定要求的重試限制。 如需 RetryRequest 常式的詳細資訊,請參閱 儲存體類別驅動程式的 RetryRequest 常式