SCSI_REQUEST_BLOCK 結構 (srb .h)

SCSI_REQUEST_BLOCK 結構與 SRB 函數相關聯。

注意

SCSI 埠驅動程式和 SCSI 微型埠驅動程式模型可能會在未來變更或無法使用。 相反地,我們建議使用 storport 驅動程式storport 微型埠 驅動程式模型。

語法

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 函 式、 PathIdTargetIdLunNextSrb 成員有效。
SRB_FUNCTION_RESET_DEVICE (0x13) ScsiPort 驅動程式不再將此 SRB 傳送到其 miniport。 只有 Storport 微型埠驅動程式會使用此 SRB。 SCSI 目標控制器應該使用 SCSIMESS_BUS_DEVICE_RESET 訊息來重設。 微型埠驅動程式應該會完成目標控制器的任何使用中要求。 只有 SRB 函數TargetIdPathId 成員有效。
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) 如果可能的話,應該重設邏輯單元。 HBA 微型埠驅動程式應完成邏輯單元的任何作用中要求。 只有 SRB 的 FunctionPathIdTargetIdLun 成員有效。 Storport 支援這種類型的重設,但 SCSI 埠則否。
SRB_FUNCTION_RESET_BUS (0x12) SCSI 匯流排應該使用 SCSIMESS_BUS_DEVICE_RESET 訊息來重設。 只有當指定的要求超時,且後續要求中止超時要求時,微型埠驅動程式才會收到此要求。只有 SRB 函 式和 PathId 成員有效。
SRB_FUNCTION_TERMINATE_IO (0x14) 應傳送 SCSIMESS_TERMINATE_IO_PROCESS 訊息,以取消 NextSrb 成員所指向的要求。 如果指出的要求已經完成,則應該正常完成此要求。 只有 SRB 函 式、 PathIdTargetIdLunNextSrb 成員有效。
SRB_FUNCTION_RELEASE_RECOVERY (0x11) 應將 SCSIMESS_RELEASE_RECOVERY 訊息傳送至目標控制器。 只有 SRB 函 式、 PathIdTargetIdLun 成員有效。
SRB_FUNCTION_RECEIVE_EVENT (0x03) HBA 應該準備好接收來自已定址目標的非同步事件通知。 SRB DataBuffer 成員會指出應放置資料的位置。
SRB_FUNCTION_SHUTDOWN (0x07) 系統正在關閉。 只有在 HBA 的 PORT_CONFIGURATION_INFORMATION 中將此 要求設定為 TRUE 時,才會將此要求傳送至微型埠驅動程式。 這種微型埠驅動程式可以在所有系統活動實際停止之前,收到這些通知。 不過,最後一個啟動 i/o 之後將會發生最後一個關機通知。 只有 SRB 函 式、 PathIdTargetIdLun 成員有效。
SRB_FUNCTION_FLUSH (0x08) 微型埠驅動程式應該清除目標裝置的任何快取資料。 只有當此要求在 HBA 的 PORT_CONFIGURATION_INFORMATION 中將 CachesData 設為 TRUE 時,才會傳送至微型埠驅動程式。 只有 SRB 函 式、 PathIdTargetIdLun 成員有效。
SRB_FUNCTION_IO_CONTROL (0x02) 要求是 i/o 控制要求,其源自具有專用 HBA 的使用者模式應用程式。 SRB DataBuffer 會指向 SRB_IO_CONTROL 標頭,後面接著資料區域。 無論 MapBuffers 的值為何,驅動程式都可以使用 DataBuffer 中的值。 只有 SRB 函式、 SrbFlagsTimeOutValueDataBufferDataTransferLength 成員是有效的,而且如果微型埠驅動程式在初始化時要求 SrbExtension 擴充 功能,則只有 SRB 成員。 如果微型埠驅動程式控制應用程式專用的 HBA,使其支援此要求,則微型埠驅動程式應該執行要求,並在 SRB 完成時,使用 ScsiPortNotification 搭配 RequestCompleteNextRequest 的一般呼叫機制來通知作業系統特定的埠驅動程式。
SRB_FUNCTION_LOCK_QUEUE (0x18) 保留由埠驅動程式針對特定邏輯單元排入佇列的要求,通常是在處理電源要求時。 只有 SRB LengthFunctionSrbFlagsOriginalRequest 成員有效。 鎖定佇列時,只會處理具有 SRB_FLAGS_BYPASS_LOCKED_QUEUE 之 SrbFlags or 運算的要求。 SCSI 微型埠驅動程式不會處理 SRB_FUNCTION_LOCK_QUEUE 要求。
SRB_FUNCTION_UNLOCK_QUEUE (0x19) 針對先前使用 SRB_FUNCTION_LOCK_QUEUE 鎖定的邏輯單元,釋放埠驅動程式的佇列。 解除鎖定要求的 SrbFlags 必須以 SRB_FLAGS_BYPASS_LOCKED_QUEUE or 運算。 只有 SRB LengthFunctionSrbFlagsOriginalRequest 成員有效。 SCSI 微型埠驅動程式不會處理 SRB_FUNCTION_UNLOCK_QUEUE 要求。
SRB_FUNCTION_UNLOCK_QUEUE (0x19) 針對先前使用 SRB_FUNCTION_LOCK_QUEUE 鎖定的邏輯單元,釋放埠驅動程式的佇列。 解除鎖定要求的 SrbFlags 必須以 SRB_FLAGS_BYPASS_LOCKED_QUEUE or 運算。 只有 SRB LengthFunctionSrbFlagsOriginalRequest 成員有效。 SCSI 微型埠驅動程式不會處理 SRB_FUNCTION_UNLOCK_QUEUE 要求。
SRB_FUNCTION_DUMP_POINTERS (0x26) 使用此函式的要求會傳送至 Storport 微型埠驅動程式,用來控制保留損毀傾印資料的磁片。 要求會收集微型埠驅動程式所需的資訊,以支援損毀傾印和休眠。 請參閱 MINIPORT_DUMP_POINTERS 結構。 實體微型埠驅動程式必須在其 HW_INITIALIZATION_DATAFeatureSupport 成員中設定 STOR_FEATURE_DUMP_POINTERS 旗標,才能使用此函數接收要求。
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) 使用此函式的要求會傳送至 Storport 微型埠驅動程式,以釋放在 SRB_FUNCTION_DUMP_POINTERS 前一個要求中配置的任何資源。

SrbStatus

傳回已完成要求的狀態。 此成員應由微型埠驅動程式設定,然後才會使用 RequestComplete 呼叫 SCSIPORTNOTIFICATION來通知 OS 特定驅動程式,要求已完成。 此成員的值可以是下列其中一項:

意義
SRB_STATUS_PENDING 表示要求正在進行中。 作業系統專用的埠驅動程式會將 SrbStatus 初始化為此值。
SRB_STATUS_SUCCESS 表示已成功完成要求。
SRB_STATUS_ABORTED 指出依埠驅動程式所指示的要求已中止。 當 SRB_FUNCTION_ABORT_COMMAND 要求成功時,微型埠驅動程式會在 NextSrb 中設定此狀態。
SRB_STATUS_ABORT_FAILED 指出嘗試中止要求失敗。 找不到指定的要求時,傳回 SRB_FUNCTION_ABORT_COMMAND 要求的狀態。
SRB_STATUS_ERROR 指出要求已完成,並顯示 SCSI 匯流排狀態的錯誤。
SRB_STATUS_BUSY 表示微型埠驅動程式或目標裝置目前無法接受要求。 作業系統專用的埠驅動程式會在稍後重新提交要求。
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 執行自動要求感知,而且此 HBA 的 PORT_CONFIGURATION_INFORMATION 中的微型埠驅動程式將 AutoRequestSense 設為 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 起始修復訊息。
SRB_STATUS_AUTOSENSE_VALID 指出 SenseInfoBuffer 中傳回的資訊是有效的。
SRB_STATUS_QUEUE_FROZEN 微型埠驅動程式 絕對不 應將 SrbStatus 成員設定為此值。 Windows 的埠驅動程式可以設定此值,以通知儲存類別驅動程式其特定週邊設備的要求佇列已遭到凍結。

ScsiStatus

傳回 HBA 或目標裝置所傳回的 SCSI 狀態。 如果狀態不是成功,則微型埠驅動程式應該將 SrbStatus 成員設定為 SRB_STATUS_ERROR。

PathId

表示要求的 SCSI 埠或匯流排。 這個值是以零為基底。

TargetId

指出匯流排上的目標控制器或裝置。

Lun

指出裝置的邏輯單元編號。

QueueTag

包含由作業系統專用的埠驅動程式所指派的佇列標記值。 如果此成員用於已標記的佇列,HBA 支援對 Lu 的內部要求佇列,而此 HBA 的 PORT_CONFIGURATION_INFORMATION 中的微型埠驅動程式 set TaggedQueueingTRUE

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 裝置,則這類微型埠驅動程式必須在呼叫 ScsiPortIoMapTransfer之前,先更新 SRB_FLAGS_DATA_OUT 或 SRB_FLAGS_DATA_IN 為正確的值。
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。 新類別驅動程式應該使用對應清單,而不是區域緩衝區。
SRB_FLAGS_SGLIST_FROM_POOL 與微型埠驅動程式無關。 在 Windows 類別驅動程式中,這表示散佈/收集清單的記憶體是從非分頁集區配置的。 如果設定此旗標,則類別驅動程式必須在 SRB 完成之後呼叫 ExFreePool 來釋放記憶體。
SRB_FLAGS_BYPASS_LOCKED_QUEUE 與微型埠驅動程式無關。 若為埠驅動程式,此旗標會指出是否已鎖定邏輯單元佇列,以處理要求。 較高層級的驅動程式必須設定此旗標,以傳送 SRB_FUNCTION_UNLOCK_QUEUE 要求。
SRB_FLAGS_NO_KEEP_AWAKE 與微型埠驅動程式無關。 Windows 類別驅動程式會使用此旗標,向埠驅動程式表示要報告閒置,而不是開啟裝置來處理此要求。
SRB_FLAGS_FREE_SENSE_BUFFER 指出埠或微型埠驅動程式已為有意義的資料配置緩衝區。 這會通知類別驅動程式,它必須在解壓縮資料之後釋放出意義的資料緩衝區。

DataTransferLength

表示資料緩衝區的大小(以位元組為單位)。 如果發生不足的情況,微型埠驅動程式必須將這個成員更新為實際傳送的位元組數目。

TimeOutValue

表示在 OS 特定的埠驅動程式可能會將其視為超時之前,要求可執行檔間隔(以秒為單位)。因為埠驅動程式已經執行,所以不需要有微型埠驅動程式,就能要求時間。

DataBuffer

指向資料緩衝區。 除非微型埠驅動程式在 HBA 的 PORT_CONFIGURATION_INFORMATION 中將 MapBuffers 設為 TRUE ,否則,微型埠驅動程式不應使用此值作為資料指標。 不過,在 SRB_FUNCTION_IO_CONTROL 要求的情況下,不論 MapBuffers 的值為何,微型埠驅動程式都可以使用此值作為資料指標。

SenseInfoBuffer

指向要求感知緩衝區。 不需要使用微型埠驅動程式,就能在檢查條件之後提供要求感知資料。

NextSrb

指出套用此要求的 SCSI_REQUEST_BLOCK。 只有一小部分的要求會使用第二個 SRB,例如 SRB_FUNCTION_ABORT_COMMAND。

OriginalRequest

指向此要求的 IRP。 此成員與微型埠驅動程式無關

SrbExtension

指向 Srb 延伸模組。 如果微型埠驅動程式在 SCSI_HW_INITIALIZATION_DATA 中將 SrbExtensionSize 設定為零,則不能使用這個成員。 作業系統專用的埠驅動程式並不會初始化 SrbExtension 的記憶體,而且可以直接由 HBA 存取微型埠驅動程式所決定的資料。 您可以使用 SrbExtension 指標呼叫 ScsiPortGetPhysicalAddress來取得對應的實體位址。

InternalStatus

當要求無法傳遞至微型埠驅動程式時,SCSI 埠驅動程式(而不是 SrbStatus)會用來報告已完成要求的狀態。 在這種情況下, SrbStatus 會設定為 SRB_STATUS_INTERNAL_ERROR。 此成員專門用於 SCSI 埠與類別驅動程式之間的通訊,而且不應該由微型埠驅動程式使用。

QueueSortKey

指定從媒體的開頭算起的位移,或從零開始,視目標裝置的類型而定。

LinkTimeoutValue

連結超時值。

Reserved

保留的。

Cdb

指定要傳送至目標裝置的 SCSI-2 或更新的命令描述項區塊。

備註

Windows 儲存類別和篩選器驅動程式可以將 具有下列函 式值的 SRBs 傳送至系統埠驅動程式:

  • SRB_FUNCTION_CLAIM_DEVICE,指出類別驅動程式支援 PathIdTargetIdLun 成員在 SRB 中識別的周邊。
  • SRB_ATTACH_DEVICE 指出篩選器驅動程式(分層)高於類別驅動程式時,想要將特定周邊的要求先路由傳送到篩選驅動程式。
  • SRB_FUNCTION_RELEASE_DEVICE 指出類別驅動程式會在特定的周邊上釋放其宣告。
  • SRB_FUNCTION_FLUSH_QUEUE 要求取消目前在埠驅動程式中排入至特定周邊的任何要求。
  • SRB_FUNCTION_RELEASE_QUEUE,要求埠驅動程式釋出對特定周邊的要求凍結佇列。

先前的 SRB_FUNCTION_ XXX 絕對不會在傳送至 SCSI 微型埠驅動程式的 SRBs 中設定。 SRB_FUNCTION_REMOVE_DEVICE 的定義可用於未來的系統版本。 它也不會在傳送至 SCSI 微型埠驅動程式的 SRBs 中設定。 SRB_FUNCTION_WMI_REQUEST 僅適用于 SCSI_WMI_REQUEST_BLOCK。 儲存類別或篩選器驅動程式會使用這個來傳送 WMI 要求至埠驅動程式。

規格需求

   
標頭 srb (包含 Srb .h、Minitape .h、Storport. h)

另請參閱

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification