SCSI_REQUEST_BLOCK結構 (srb.h)
SCSI_REQUEST_BLOCK 結構與 SRB 函式相關聯。
注意
未來可能會變更或無法使用 SCSI 埠驅動程式和 SCSI 迷你埠驅動程式模型。 相反地,我們建議使用 Storport 驅動程式 和 Storport miniport 驅動程式模型。
語法
typedef struct _SCSI_REQUEST_BLOCK {
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR QueueTag;
UCHAR QueueAction;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
union {
ULONG InternalStatus;
ULONG QueueSortKey;
ULONG LinkTimeoutValue;
};
ULONG Reserved;
UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
成員
Length
指定這個結構位元組的大小。
Function
指定要執行的作業,它可以是下列其中一個值:
價值 | 操作 |
---|---|
SRB_FUNCTION_EXECUTE_SCSI (0x00) | 應該在目標邏輯單元上執行 SCSI 裝置 I/O 要求。 |
SRB_FUNCTION_ABORT_COMMAND(0x10) | 應該傳送SCSIMESS_ABORT訊息,以取消 NextSrb 成員所指向的要求。 如果這是標記佇列要求,則應該改用SCSIMESS_ABORT_WITH_TAG訊息。 如果指定的要求已完成,則此要求應該正常完成。 只有 SRB 函式、PathId、TargetId、Lun和 NextSrb 成員都有效。 |
SRB_FUNCTION_RESET_DEVICE (0x13) | ScsiPort 驅動程式不再將此 SRB 傳送至其迷你埠。 只有 Storport 迷你埠驅動程式使用此 SRB。 應該使用SCSIMESS_BUS_DEVICE_RESET訊息來重設 SCSI 目標控制器。 迷你埠驅動程序應該會完成目標控制器的任何作用中要求。 只有 SRB 函式、TargetId和 PathId 成員有效。 |
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) | 如果可能,應該重設邏輯單元。 HBA 迷你埠驅動程序應該完成邏輯單元的任何使用中要求。 只有 函式、PathId、TargetId,以及 SRB Lun 成員都有效。 Storport 支援這種類型的重設,但 SCSI 埠則不支援。 |
SRB_FUNCTION_RESET_BUS (0x12) | 應該使用SCSIMESS_BUS_DEVICE_RESET訊息來重設 SCSI 總線。 只有在指定的要求逾時,以及後續中止逾時要求時,迷你埠驅動程式才會收到此要求。只有 SRB 函式 和 PathId 成員有效。 |
SRB_FUNCTION_TERMINATE_IO (0x14) | 應該傳送SCSIMESS_TERMINATE_IO_PROCESS訊息,以取消 NextSrb 成員所指向的要求。 如果指定的要求已經完成,則此要求應該正常完成。 只有 SRB 函式、PathId、TargetId、Lun和 NextSrb 成員都有效。 |
SRB_FUNCTION_RELEASE_RECOVERY (0x11) | SCSIMESS_RELEASE_RECOVERY訊息應該傳送至目標控制器。 只有 SRB 函式、PathId、TargetId和 Lun 成員有效。 |
SRB_FUNCTION_RECEIVE_EVENT (0x03) | HBA 應該準備好從尋址目標接收異步事件通知。 SRB DataBuffer 成員表示應該放置數據的位置。 |
SRB_FUNCTION_SHUTDOWN(0x07) | 系統正在關閉。 只有在將 CachesData 設定 為 HBA PORT_CONFIGURATION_INFORMATION TRUE 時,才會將此要求傳送至迷你埠驅動程式。 這類迷你埠驅動程式可以在所有系統活動實際停止之前收到其中數個通知。 不過,最後一次關機通知會在上次啟動 I/O 之後發生。 只有 SRB 函式、PathId、TargetId 和 Lun 成員有效。 |
SRB_FUNCTION_FLUSH (0x08) | 迷你埠驅動程序應該排清目標裝置的任何快取數據。 只有在將 CachesData 設定 為 HBA PORT_CONFIGURATION_INFORMATION 中的 true 時,才會將此要求傳送 至迷你埠驅動程式。 只有 SRB 函式、PathId、TargetId 和 Lun 成員有效。 |
SRB_FUNCTION_IO_CONTROL(0x02) | 要求是 I/O 控制件要求,源自於具有專用 HBA 的使用者模式應用程式。 SRB DataBuffer 指向SRB_IO_CONTROL標頭,後面接著數據區域。 驅動程式可以使用 DataBuffer 中的值,不論 mapBuffers 的值為何。 只有 SRB 函式、SrbFlags、TimeOutValue、DataBuffer和 DataTransferLength 成員有效,以及 SrbExtension 成員,如果迷你埠驅動程式在初始化時要求 SRB 擴充功能。 如果迷你埠驅動程式控制應用程式專用 HBA,使其支援此要求,迷你埠驅動程式應該執行要求,並在 SRB 完成時通知 OS 特定埠驅動程式,並使用一般機制呼叫 ScsiPortNotification 搭配 RequestComplete,並 NextRequest。 |
SRB_FUNCTION_LOCK_QUEUE (0x18) | 保留埠驅動程序針對特定邏輯單元排入佇列的要求,通常是在處理電源要求時。 只有 SRB Length、函式、SrbFlags和 OriginalRequest 成員有效。 鎖定佇列時,只會處理具有 SrbFlags ORed 與 SRB_FLAGS_BYPASS_LOCKED_QUEUE 的要求。 SCSI 迷你埠驅動程式不會處理SRB_FUNCTION_LOCK_QUEUE要求。 |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | 釋放先前使用 SRB_FUNCTION_LOCK_QUEUE 鎖定之邏輯單元的埠驅動程式佇列。 解除鎖定要求的 SrbFlags 必須是具有SRB_FLAGS_BYPASS_LOCKED_QUEUE的 ORed。 只有 SRB Length、函式、SrbFlags和 OriginalRequest 成員有效。 SCSI 迷你埠驅動程式不會處理SRB_FUNCTION_UNLOCK_QUEUE要求。 |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | 釋放先前使用 SRB_FUNCTION_LOCK_QUEUE 鎖定之邏輯單元的埠驅動程式佇列。 解除鎖定要求的 SrbFlags 必須是具有SRB_FLAGS_BYPASS_LOCKED_QUEUE的 ORed。 只有 SRB Length、函式、SrbFlags和 OriginalRequest 成員有效。 SCSI 迷你埠驅動程式不會處理SRB_FUNCTION_UNLOCK_QUEUE要求。 |
SRB_FUNCTION_DUMP_POINTERS(0x26) | 此函式的要求會傳送至 Storport 迷你埠驅動程式,用來控制保存損毀傾印數據的磁碟。 要求會收集迷你埠驅動程式所需的資訊,以支援損毀傾印和休眠。 請參閱 MINIPORT_DUMP_POINTERS 結構。 實體迷你埠驅動程序必須在其 HW_INITIALIZATION_DATA 的 FeatureSupport 成員中設定STOR_FEATURE_DUMP_POINTERS旗標,以接收具有此函式的要求。 |
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) | 具有此函式的要求會傳送至 Storport miniport 驅動程式,以釋放在先前要求SRB_FUNCTION_DUMP_POINTERS期間配置的任何資源。 |
SrbStatus
傳回已完成要求的狀態。 此成員應該由迷你埠驅動程式設定,再通知 OS 特定驅動程式要求已完成,方法是使用 RequestComplete呼叫 ScsiPortNotification。 這個成員的值可以是下列其中一項:
價值 | 意義 |
---|---|
SRB_STATUS_PENDING | 表示要求正在進行中。 OS 特定的埠驅動程式會將 SrbStatus 初始化為此值。 |
SRB_STATUS_SUCCESS | 表示要求已順利完成。 |
SRB_STATUS_ABORTED | 表示要求已中止,如埠驅動程式所指示。 迷你埠驅動程式會在 NextSrb 中設定此狀態,以取得成功的SRB_FUNCTION_ABORT_COMMAND要求。 |
SRB_STATUS_ABORT_FAILED | 表示嘗試中止要求失敗。 當找不到指定的要求時,傳回SRB_FUNCTION_ABORT_COMMAND要求的狀態。 |
SRB_STATUS_ERROR | 指出要求已完成,並出現SCSI總線狀態的錯誤。 |
SRB_STATUS_BUSY | 表示迷你埠驅動程式或目標裝置目前無法接受要求。 OS 特定的埠驅動程式稍後會重新提交要求。 |
SRB_STATUS_INTERNAL_ERROR | 表示 SCSI 埠驅動程式無法將要求傳遞至迷你埠驅動程式或目標裝置。 在這種情況下,狀態會記錄在 InternalStatus中。 |
SRB_STATUS_INVALID_REQUEST | 表示迷你埠驅動程序不支援指定的要求。 |
SRB_STATUS_NO_DEVICE | 表示裝置沒有回應。 |
SRB_STATUS_TIMEOUT | 表示要求逾時。 |
SRB_STATUS_SELECTION_TIMEOUT | 指出 SCSI 裝置選取已逾時。 |
SRB_STATUS_COMMAND_TIMEOUT | 表示目標未在時間限制內完成命令。 |
SRB_STATUS_MESSAGE_REJECTED | 表示目標已拒絕訊息。 這通常只會針對這類訊息類型要求傳回,例如 SRB_FUNCTION_TERMINATE_IO。 |
SRB_STATUS_BUS_RESET | 表示執行此要求時發生總線重設。 |
SRB_STATUS_PARITY_ERROR | 表示在 SCSI 總線上發生同位錯誤,且重試失敗。 |
SRB_STATUS_REQUEST_SENSE_FAILED | 表示要求感知命令失敗。 只有當 HBA 執行自動要求感知,且迷你埠驅動程式設定為 AutoRequestSense,以 此 HBA PORT_CONFIGURATION_INFORMATION中的 TRUE 時,才會傳回此動作。 |
SRB_STATUS_NO_HBA | 表示 HBA 沒有回應。 |
SRB_STATUS_DATA_OVERRUN | 表示發生數據滿溢或不足錯誤。 迷你埠驅動程式也必須更新 SRB 的 DataTransferLength 成員,以指出發生不足時實際傳輸的數據量。 |
SRB_STATUS_UNEXPECTED_BUS_FREE | 表示目標意外中斷連線。 |
SRB_STATUS_PHASE_SEQUENCE_FAILURE | 表示 HBA 偵測到不合法的階段順序失敗錯誤。 |
SRB_STATUS_REQUEST_FLUSHED | 表示狀態的要求已停止。 |
SRB_STATUS_BAD_FUNCTION | 表示不支援 SRB 函式 程式代碼。 |
SRB_STATUS_INVALID_PATH_ID | 表示 SRB 中指定的 PathId 不存在。 |
SRB_STATUS_INVALID_TARGET_ID | 指出 SRB 中 TargetID 值無效。 |
SRB_STATUS_INVALID_LUN | 表示 SRB 中的 Lun 值無效。 |
SRB_STATUS_ERROR_RECOVERY | 指出要求已完成,並出現 SCSI 總線狀態錯誤,並收到 SCSI INITIATE RECOVERY 訊息。 |
SRB_STATUS_AUTOSENSE_VALID | 指出在 SenseInfoBuffer 中傳回的資訊有效。 |
SRB_STATUS_QUEUE_FROZEN | 迷你埠驅動程式 應該永遠不會 將 SrbStatus 成員設定為此值。 Windows 連接埠驅動程式可以設定此值,通知儲存類別驅動程式,其特定周邊的要求佇列已凍結。 |
ScsiStatus
傳回 HBA 或目標裝置所傳回的 SCSI 狀態。 如果狀態不是 SUCCESS,迷你埠驅動程式應將 SrbStatus 成員設定為 SRB_STATUS_ERROR。
PathId
表示要求的 SCSI 埠或總線。 此值是以零起始。
TargetId
指出總線上的目標控制器或裝置。
Lun
指出裝置的邏輯單元編號。
QueueTag
包含 OS 特定埠驅動程式指派的佇列標籤。 如果此成員用於已標記的佇列,HBA 支援內部佇列對 RU 的要求,而 miniport 驅動程式會將 TaggedQueueing 設定為在此 HBA PORT_CONFIGURATION_INFORMATION中 TRUE。
QueueAction
指出設定SRB_FLAGS_QUEUE_ACTION_ENABLE旗標時要使用的標記佇列訊息。 此值可以是下列其中一項:SRB_SIMPLE_TAG_REQUEST、SRB_HEAD_OF_QUEUE_TAG_REQUEST或SRB_ORDERED_QUEUE_TAG_REQUEST,如 SCSI 規格所定義。
CdbLength
指出 SCSI-2 或更新版本命令描述元區塊的位元組大小。
SenseInfoBufferLength
表示要求感知緩衝區的位元組大小。 如果發生不足,迷你埠驅動程序必須將這個成員更新為實際傳輸的位元元組數目。
SrbFlags
指出有關要求的各種參數和選項。 SrbFlags 是唯讀的,除非設定SRB_FLAGS_UNSPECIFIED_DIRECTION,而且需要次要 DMA 適配卡的迷你埠驅動程式才能更新SRB_FLAGS_DATA_IN或SRB_FLAGS_DATA_OUT。 此成員可以設定下列一或多個旗標:
旗 | 意義 |
---|---|
SRB_FLAGS_QUEUE_ACTION_ENABLE | 表示要啟用標記佇列動作。 |
SRB_FLAGS_DISABLE_AUTOSENSE | 表示不應傳回要求感知資訊。 |
SRB_FLAGS_DATA_IN | 表示數據會從裝置傳輸到系統。 |
SRB_FLAGS_DATA_OUT | 表示數據會從系統傳輸到裝置。 |
SRB_FLAGS_UNSPECIFIED_DIRECTION | 針對與 ASPI/CAM SCSI 介面的回溯相容性所定義,此旗標表示傳輸方向可能是上述任一個,因為已設定上述兩個旗標。 如果設定此旗標,迷你埠驅動程式應該藉由檢查 SCSI 總線上目標的數據階段來判斷傳輸方向。 如果 HBA 是次級 DMA 裝置,這類迷你連接埠驅動程式必須先更新SRB_FLAGS_DATA_OUT或SRB_FLAGS_DATA_IN為正確的值,才能呼叫 ScsiPortIoMapTransfer。 |
SRB_FLAGS_NO_DATA_TRANSFER | 表示沒有使用此要求進行數據傳輸。 如果設定這個值,則旗標SRB_FLAGS_DATA_OUT、SRB_FLAGS_DATA_IN和SRB_FLAGS_UNSPECIFIED_DIRECTION都清楚。 |
SRB_FLAGS_DISABLE_SYNCH_TRANSFER | 如果可能的話,表示 HBA 應該針對此傳輸要求執行異步 I/O。 如果先前已交涉同步 I/O,HBA 必須先重新談判異步 I/O,才能執行傳輸。 |
SRB_FLAGS_DISABLE_DISCONNECT | 表示 HBA 不應允許目標在此要求處理期間中斷與 SCSI 總線的連線。 |
SRB_FLAGS_BYPASS_FROZEN_QUEUE | 與迷你埠驅動程序無關。 |
SRB_FLAGS_NO_QUEUE_FREEZE | 與迷你埠驅動程序無關。 |
SRB_FLAGS_IS_ACTIVE | 與迷你埠驅動程序無關。 |
SRB_FLAGS_ALLOCATED_FROM_ZONE | 與迷你埠驅動程序無關,目前 Windows 類別驅動程式已過時。 針對 Windows 舊版類別驅動程式,這表示 SRB 是否從區域緩衝區配置。 如果設定此旗標,類別驅動程式必須呼叫 ExInterlockedFreeToZone 以釋放 SRB;否則,它必須呼叫 exFreePool 。 新的類別驅動程式應該使用 lookaside 清單,而不是區域緩衝區。 |
SRB_FLAGS_SGLIST_FROM_POOL | 與迷你埠驅動程序無關。 對於 Windows 類別驅動程式,這表示已從非分頁集區配置散佈/收集清單的記憶體。 如果設定此旗標,類別驅動程序必須呼叫 ExFreePool,以在 SRB 完成之後釋放記憶體。 |
SRB_FLAGS_BYPASS_LOCKED_QUEUE | 與迷你埠驅動程序無關。 針對埠驅動程式,此旗標表示應該處理邏輯單元佇列是否已鎖定要求。 較高層級的驅動程序必須設定此旗標,才能傳送SRB_FUNCTION_UNLOCK_QUEUE要求。 |
SRB_FLAGS_NO_KEEP_AWAKE | 與迷你埠驅動程序無關。 Windows 類別驅動程式會使用此旗標向埠驅動程式指出要回報閑置,而不是啟動裝置來處理此要求。 |
SRB_FLAGS_FREE_SENSE_BUFFER | 表示埠或迷你埠驅動程式已為感知數據配置緩衝區。 這會通知類別驅動程式,在擷取數據之後,它必須釋放感知數據緩衝區。 |
DataTransferLength
表示數據緩衝區的位元組大小。 如果發生不足,迷你埠驅動程序必須將這個成員更新為實際傳輸的位元元組數目。
TimeOutValue
指出要求可以在OS特定埠驅動程序考慮逾時之前的秒內執行間隔。迷你埠驅動程式不需要時間要求,因為埠驅動程式已經這麼做。
DataBuffer
指向數據緩衝區。 迷你埠驅動程式不應該使用此值作為數據指標,除非迷你埠驅動程式將 mapBuffers 設定 為 HBA PORT_CONFIGURATION_INFORMATION中的 TRUE。 不過,在SRB_FUNCTION_IO_CONTROL要求的情況下,迷你埠驅動程式可以使用此值作為數據指標,而不論 mapBuffers 的值為何。
SenseInfoBuffer
指向要求感知緩衝區。 不需要迷你埠驅動程式,才能在 CHECK CONDITION 之後提供要求感知數據。
NextSrb
表示套用此要求SCSI_REQUEST_BLOCK。 只有一小部分的要求會使用第二個 SRB,例如SRB_FUNCTION_ABORT_COMMAND。
OriginalRequest
指向此要求的 IRP。 此成員與迷你埠驅動程序無關
SrbExtension
指向 Srb 延伸模組。 如果迷你埠驅動程式在 SCSI_HW_INITIALIZATION_DATA 中將 SrbExtensionSize 設為零,則不得使用此成員。 SrbExtension 的記憶體不會由 OS 特定埠驅動程式初始化,而迷你埠驅動程式決定的數據可以直接由 HBA 存取。 使用 SrbExtension 指標呼叫 ScsiPortGetPhysicalAddress,即可取得對應的實體位址。
InternalStatus
由 SCSI 埠驅動程式使用,而不是 SrbStatus,以在無法將要求傳遞至迷你埠驅動程式時報告已完成要求的狀態。 在這種情況下,SrbStatus 會設定為 SRB_STATUS_INTERNAL_ERROR。 此成員專用於 SCSI 埠與類別驅動程式之間的通訊,迷你埠驅動程式不應使用。
QueueSortKey
根據目標裝置的類型,指定媒體開頭或零的位移。
LinkTimeoutValue
連結逾時值。
Reserved
保留。
Cdb[16]
指定要傳送至目標裝置的 SCSI-2 或更新版本命令描述元區塊。
言論
Windows 儲存類別和篩選驅動程式可以使用下列 函式 值將 SRB 傳送至系統埠驅動程式:
- SRB_FUNCTION_CLAIM_DEVICE,表示類別驅動程序支援 SRB 中由 PathId、TargetId和 Lun 成員識別的周邊。
- SRB_ATTACH_DEVICE表示篩選驅動程式分層於類別驅動程式上方,希望先將特定周邊的要求路由傳送至篩選驅動程式。
- SRB_FUNCTION_RELEASE_DEVICE,表示類別驅動程式正在在特定外圍設備上釋放其宣告。
- SRB_FUNCTION_FLUSH_QUEUE要求取消埠驅動程式中目前排入佇列的任何要求至特定周邊。
- SRB_FUNCTION_RELEASE_QUEUE要求埠驅動程序釋放特定周邊要求的凍結佇列。
上述SRB_FUNCTION_XXX 永遠不會在傳送至 SCSI 迷你埠驅動程式的 SRB 中設定。 SRB_FUNCTION_REMOVE_DEVICE已定義以在未來版本的系統中使用。 它也不會在傳送至 SCSI 迷你埠驅動程式的 SRB 中設定。 SRB_FUNCTION_WMI_REQUEST只在 SCSI_WMI_REQUEST_BLOCK 中有效。 記憶體類別或篩選驅動程式會使用此方法將 WMI 要求傳送至埠驅動程式。
要求
要求 | 價值 |
---|---|
標頭 | srb.h (包括 Srb.h、Minitape.h、Storport.h) |