STORAGE_REQUEST_BLOCK结构 (srb.h)

STORAGE_REQUEST_BLOCK是扩展格式的 SCSI 请求块 (SRB) 结构。 该结构用于添加与 SRB 函数关联的扩展数据。

注意

SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 改用 Storport 驱动程序Storport 微型端口 驱动程序模型。

语法

typedef struct _STORAGE_REQUEST_BLOCK {
  USHORT                               Length;
  UCHAR                                Function;
  UCHAR                                SrbStatus;
  ULONG                                ReservedUlong1;
  ULONG                                Signature;
  ULONG                                Version;
  ULONG                                SrbLength;
  ULONG                                SrbFunction;
  ULONG                                SrbFlags;
  ULONG                                ReservedUlong2;
  ULONG                                RequestTag;
  USHORT                               RequestPriority;
  USHORT                               RequestAttribute;
  ULONG                                TimeOutValue;
  ULONG                                SystemStatus;
  ULONG                                ZeroGuard1;
  ULONG                                AddressOffset;
  ULONG                                NumSrbExData;
  ULONG                                DataTransferLength;
  PVOID POINTER_ALIGN                  DataBuffer;
  PVOID POINTER_ALIGN                  ZeroGuard2;
  PVOID POINTER_ALIGN                  OriginalRequest;
  PVOID POINTER_ALIGN                  ClassContext;
  PVOID POINTER_ALIGN                  PortContext;
  PVOID POINTER_ALIGN                  MiniportContext;
  _STORAGE_REQUEST_BLOCK POINTER_ALIGN *NextSrb;
  struct                               _STORAGE_REQUEST_BLOCK;
  ULONG                                SrbExDataOffset[ANYSIZE_ARRAY];
} STORAGE_REQUEST_BLOCK, *PSTORAGE_REQUEST_BLOCK;

成员

Length

指定 SRB 标头的大小,以便与 SCSI_REQUEST_BLOCK 结构兼容。 这等于此结构的 Signature 成员的偏移量。

Function

设置为 SRB_FUNCTION_STORAGE_REQUEST_BLOCK ,指示这是扩展的 SRB。 与 SCSI_REQUEST_BLOCK不同,SRB 函数标识符改为位于 SrbFunction 成员中。

SrbStatus

返回已完成请求的状态。 此成员应由微型端口驱动程序设置,然后通知操作系统特定的驱动程序通过调用 ScsiPortNotification with RequestComplete 完成请求。 此成员的值可以是下列值之一:

含义
SRB_STATUS_PENDING (0x00) 指示请求正在进行中。 特定于操作系统的端口驱动程序将 SrbStatus 初始化为此值。
SRB_STATUS_SUCCESS (0x01) 指示请求已成功完成。
SRB_STATUS_ABORTED (0x02) 指示请求已中止,如端口驱动程序指示。 微型端口驱动程序在 NextSrb 成员中为成功的SRB_FUNCTION_ABORT_COMMAND请求设置此状态。
SRB_STATUS_ABORT_FAILED (0x03) 指示尝试中止请求失败。 当指定的请求无法找到时,返回SRB_FUNCTION_ABORT_COMMAND请求的此状态。
SRB_STATUS_ERROR (0x04) 指示请求已完成,并在 SCSI 总线状态中出现错误。
SRB_STATUS_BUSY (0x05) 指示微型端口驱动程序或目标设备目前无法接受请求。 操作系统特定的端口驱动程序稍后将重新提交请求。
SRB_STATUS_INVALID_REQUEST (0x06) 指示微型端口驱动程序不支持给定的请求。
SRB_STATUS_INVALID_PATH_ID (0x07) 指示 SRB 中指定的 PathId 不存在。
SRB_STATUS_NO_DEVICE (0x08) 指示设备未响应。
SRB_STATUS_TIMEOUT (0x09) 指示请求超时。
SRB_STATUS_SELECTION_TIMEOUT (0x0A) 指示 SCSI 设备选择超时。
SRB_STATUS_COMMAND_TIMEOUT (0x0B) 指示目标未在时间限制内完成该命令。
SRB_STATUS_MESSAGE_REJECTED (0x0D) 指示目标拒绝了一条消息。 这通常仅针对SRB_FUNCTION_TERMINATE_IO这样的消息类型请求返回。
SRB_STATUS_BUS_RESET (0x0E) 指示执行此请求时发生总线重置。
SRB_STATUS_PARITY_ERROR (0x0F) 指示 SCSI 总线上发生了奇偶校验错误,并且重试失败。
SRB_STATUS_REQUEST_SENSE_FAILED (0x10) 指示请求感知命令失败。 仅当主机总线适配器 (HBA) 执行自动请求感知,微型端口驱动程序在此 HBA 的PORT_CONFIGURATION_INFORMATION中将 AutoRequestSense 设置为 TRUE 时,才会返回此响应。
SRB_STATUS_NO_HBA (0x11) 指示 HBA 不响应。
SRB_STATUS_DATA_OVERRUN (0x12) 指示发生数据溢出或不足错误。 微型端口驱动程序还必须更新 SRB 的 DataTransferLength 成员,以指示在运行不足时实际传输的数据量。
SRB_STATUS_UNEXPECTED_BUS_FREE (0x13) 指示目标意外断开连接。
SRB_STATUS_PHASE_SEQUENCE_FAILURE (0x14) 指示 HBA 检测到非法阶段序列故障错误。
SRB_STATUS_BAD_SRB_BLOCK_LENGTH (0x15) 指示请求失败,因为 SRB 长度无效。
SRB_STATUS_REQUEST_FLUSHED (0x16) 指示状态请求已停止。
SRB_STATUS_INVALID_LUN (0x20) 指示 SRB 中的 Lun 值无效。
SRB_STATUS_INVALID_TARGET_ID (0x21) 指示 SRB 中的 TargetID 值无效。
SRB_STATUS_BAD_FUNCTION (0x22) 指示不支持 SRB 函数 代码。
SRB_STATUS_ERROR_RECOVERY (0x23) 指示请求已完成,并在 SCSI 总线状态中出现错误,并且收到 SCSI INITIATE RECOVERY 消息。
SRB_STATUS_NOT_POWERED (0x24) 指示请求失败,因为目标未提供支持。 对于在 SrbFlags 中设置SRB_FLAGS_NO_KEEP_AWAKE的请求,发送到已关闭的 LUN 的请求将失败并出现此状态。
SRB_STATUS_LINK_DOWN (0x25) 指示请求失败,因为链接已关闭。
SRB_STATUS_INTERNAL_ERROR (0x30) 指示 Storport 驱动程序无法将请求传递到微型端口驱动程序或目标设备。 在这种情况下,状态记录在 InternalStatus 中。
SRB_STATUS_QUEUE_FROZEN (0x40) 微型端口驱动程序不应将 SrbStatus 成员设置为此值。 Windows 端口驱动程序可以设置此值,以通知存储类驱动程序特定外围设备的请求队列已被冻结。
SRB_STATUS_AUTOSENSE_VALID (0x80) 指示 SenseInfoBuffer 中返回的信息有效。

ReservedUlong1

保留。 设置为 0。

Signature

扩展 SRB 格式的签名。 这设置为SRB_SIGNATURE。

Version

所使用的结构版本。 当前版本 STORAGE_REQUEST_BLOCK_VERSION_1

SrbLength

此扩展 SRB 的长度(以字节为单位)包括此结构、地址和任何 SRB 扩展数据。

SrbFunction

指定要执行的操作,可以是以下值之一:

含义
SRB_FUNCTION_EXECUTE_SCSI (0x00) 应在目标逻辑单元上执行 SCSI 设备 I/O 请求。 当 NumSrbExData> 0 时,以下一个或多个扩展请求块结构位于 SrbExDataOffset 中指定的偏移量:SRBEX_DATA_SCSI_CDB16SRBEX_DATA_SCSI_CDB32SRBEX_DATA_SCSI_CDB_VARSRBEX_DATA_BIDIRECTIONALSRBEX_DATA_IO_INFO
SRB_FUNCTION_IO_CONTROL (0x02) 请求是 I/O 控制请求,源自具有专用 HBA 的用户模式应用程序。 SRB DataBuffer 指向 SRB_IO_CONTROL 标头,后跟数据区域。 无论 MapBuffers 的值如何,DataBuffer 中的值都可以由驱动程序使用。 如果微型端口驱动程序在初始化时请求了 SRB 扩展,则只有 SRB 函数SrbFlagsTimeOutValueDataBufferDataTransferLength成员有效 。 如果微型端口驱动程序控制应用程序专用 HBA 以便支持此请求,则微型端口驱动程序应在 SRB 完成时执行请求并通知特定于操作系统的端口驱动程序,并使用使用 RequestCompleteNextRequest 调用 ScsiPortNotification 的正常机制。
SRB_FUNCTION_RECEIVE_EVENT (0x03) HBA 应准备好从寻址目标接收异步事件通知。 SRB DataBuffer 成员指示应放置数据的位置。 注意:此函数不会由 Storport 发送到微型端口。
SRB_FUNCTION_SHUTDOWN (0x07) 系统正在关闭。 微型端口驱动程序可以在所有系统活动实际停止之前接收其中几个通知。 但是,最后一个关闭通知将在上次启动 I/O 之后发生。 此函数不需要扩展 SRB 数据。
SRB_FUNCTION_FLUSH (0x08) 微型端口驱动程序应刷新目标设备的任何缓存数据。 仅在 HBA 的 PORT_CONFIGURATION_INFORMATION中将 CachesData 设置为 TRUE 时,才会将此请求发送到微型端口驱动程序。 此函数不需要扩展 SRB 数据。
SRB_FUNCTION_ABORT_COMMAND (0x10) 应发送SCSIMESS_ABORT消息以取消 NextSrb 成员指向的请求。 如果这是标记队列请求,则应改用SCSIMESS_ABORT_WITH_TAG消息。 如果指示的请求已完成,则应正常完成此请求。 此函数不需要扩展 SRB 数据。 注意:此函数不会由 Storport 发送到微型端口。
SRB_FUNCTION_RELEASE_RECOVERY (0x11) 应向目标控制器发送SCSIMESS_RELEASE_RECOVERY消息。 此函数不需要扩展 SRB 数据。 注意:此函数不会由 Storport 发送到微型端口。
SRB_FUNCTION_RESET_BUS (0x12) 应使用SCSIMESS_BUS_DEVICE_RESET消息重置 SCSI 总线。 仅当给定请求超时且后续请求中止超时请求时,微型端口驱动程序才会收到此请求。此函数不需要扩展 SRB 数据。
SRB_FUNCTION_TERMINATE_IO (0x14) 应发送SCSIMESS_TERMINATE_IO_PROCESS消息,以取消 NextSrb 成员指向的请求。 如果指示的请求已完成,则应正常完成此请求。 此函数不需要扩展 SRB 数据。 注意:此函数不会由 Storport 发送到微型端口。
SRB_FUNCTION_RESET_DEVICE (0x16) 应使用SCSIMESS_BUS_DEVICE_RESET消息重置 SCSI 目标控制器。 微型端口驱动程序应完成目标控制器的任何活动请求。 此函数不需要扩展 SRB 数据。
SRB_FUNCTION_WMI (0x17) 请求是格式化为 SRBEX_DATA_WMI 结构的电源扩展请求。 扩展请求数据的偏移量位于 SrbExDataOffset[0]。
SRB_FUNCTION_LOCK_QUEUE (0x18) 保存由端口驱动程序为特定逻辑单元排队的请求,通常是在处理电源请求时。 只有 SRB 长度函数SrbFlagsOriginalRequest 成员有效。 当队列锁定时,将只处理具有 SrbFlags ORed 和 SRB_FLAGS_BYPASS_LOCKED_QUEUE 的请求。 SCSI 微型端口驱动程序不会处理 SRB_FUNCTION_LOCK_QUEUE 请求。
SRB_FUNCTION_UNLOCK_QUEUE (0x19) 释放以前使用 SRB_FUNCTION_LOCK_QUEUE 锁定的逻辑单元的端口驱动程序队列。 解锁请求的 SrbFlag 必须是 具有 SRB_FLAGS_BYPASS_LOCKED_QUEUE 的 ORed。 只有 SRB 长度函数SrbFlagsOriginalRequest 成员有效。 SCSI 微型端口驱动程序不会处理 SRB_FUNCTION_UNLOCK_QUEUE 请求。
SRB_FUNCTION_QUIESCE_DEVICE (0x1A) 请求仅在存储类和存储端口驱动程序之间,不会发送到微型端口。 此函数充当类驱动程序等待端口驱动程序完成所有未完成的 I/O。
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) 如果可能,应重置逻辑单元。 HBA 微型端口驱动程序应完成逻辑单元的任何活动请求。 此函数不需要扩展 SRB 数据。 Storport 支持这种类型的重置,但 SCSI 端口不支持。
SRB_FUNCTION_POWER (0x24) 请求是格式化为 SRBEX_DATA_POWER 结构的电源扩展请求。 扩展请求数据的偏移量位于 SrbExDataOffset[0]。
SRB_FUNCTION_PNP (0x25) 请求是格式化为 SRBEX_DATA_PNP 结构的 PnP 扩展请求。 扩展请求数据的偏移量位于 SrbExDataOffset[0]。
SRB_FUNCTION_DUMP_POINTERS (0x26) 使用此函数的请求将发送到 Storport 微型端口驱动程序,该驱动程序用于控制保存故障转储数据的磁盘。 请求收集微型端口驱动程序所需的信息,以支持故障转储和休眠。 请参阅 MINIPORT_DUMP_POINTERS 结构。 物理微型端口驱动程序必须在其HW_INITIALIZATION_DATA的 FeatureSupport 成员中设置STOR_FEATURE_DUMP_POINTERS标志才能接收具有此函数的请求。
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) 使用此函数的请求将发送到 Storport 微型端口驱动程序,以释放在以前请求SRB_FUNCTION_DUMP_POINTERS期间分配的任何资源。

SrbFlags

指示请求的各种参数和选项。 SrbFlags 是只读的,除非设置 SRB_FLAGS_UNSPECIFIED_DIRECTION ,并且需要从属 DMA 适配器的微型端口驱动程序来更新 SRB_FLAGS_DATA_INSRB_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 总线上目标的数据阶段来确定传输方向。
SRB_FLAGS_NO_DATA_TRANSFER 指示没有使用此请求进行数据传输。 如果已设置,则标志 SRB_FLAGS_DATA_OUTSRB_FLAGS_DATA_INSRB_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 此标志与微型端口驱动程序无关。 对于类驱动程序,这表示从非分页池分配散点/收集列表的内存。 如果设置了此标志,类驱动程序必须调用 ExFreePool ,以在 SRB 完成后释放内存。
SRB_FLAGS_BYPASS_LOCKED_QUEUE 此标志与微型端口驱动程序无关。 对于端口驱动程序,此标志指示是否锁定逻辑单元队列时应处理请求。 高级驱动程序必须设置此标志才能发送 SRB_FUNCTION_UNLOCK_QUEUE 请求。
SRB_FLAGS_NO_KEEP_AWAKE 此标志与微型端口驱动程序无关。 Windows 类驱动程序使用此标志向端口驱动程序指示请求失败,而不是启动设备来处理此请求。
SRB_FLAGS_FREE_SENSE_BUFFER 指示端口或微型端口驱动程序已为感知数据分配缓冲区。 这会通知类驱动程序提取数据后,它必须释放感知数据缓冲区。
SRB_FLAGS_D3_PROCESSING 指示请求是 D3 处理的一部分。 支持运行时电源控制的微型端口不应使用这些请求调用 StorPortPoFxActivateComponentStorPortPoFxIdleComponent
SRB_FLAGS_ADAPTER_CACHE_ENABLE 指示适配器可以缓存数据。

ReservedUlong2

保留。 设置为 0。

RequestTag

包含由特定于操作系统的端口驱动程序分配的队列标记值。 如果此成员用于标记队列,则 HBA 支持对逻辑单元 (RU) 的内部排队,并且微型端口驱动程序在此 HBA 的PORT_CONFIGURATION_INFORMATION中将 TaggedQueueing 设置为 TRUE

RequestPriority

SRB 的优先级分配。 这是以下 _STOR_IO_PRIORITY_HINT 值之一:

含义
StorIoPriorityVeryLow (0) 优先级很低。
StorIoPriorityLow (1) 低优先级。
StorIoPriorityNormal (2) 普通优先级。
StorIoPriorityHigh (3) 高优先级。
StorIoPriorityCritical (4) 关键优先级。

RequestAttribute

指示设置 SRB_FLAGS_QUEUE_ACTION_ENABLE 标志时要使用的标记队列消息。 该值可以是下列值之一: SRB_SIMPLE_TAG_REQUESTSRB_HEAD_OF_QUEUE_TAG_REQUESTSRB_ORDERED_QUEUE_TAG_REQUEST

TimeOutValue

指示请求可以在操作系统特定的端口驱动程序认为超时之前可以执行的间隔(以秒为单位)。微型端口驱动程序不需要时间请求,因为端口驱动程序已这样做。

SystemStatus

每当无法将请求传送到微型端口驱动程序时,Storport 驱动程序(而不是 SrbStatus)使用,报告已完成请求的状态。 在这种情况下, SrbStatus 设置为 SRB_STATUS_INTERNAL_ERROR。 此成员专用于 Storport 与类驱动程序之间的通信,不应由微型端口驱动程序使用。

ZeroGuard1

要防范将此结构解释为 SCSI_REQUEST_BLOCK的驱动程序的防护区域。 设置为 0。

AddressOffset

存储请求地址相对于此结构的开头的偏移量。 此偏移量查找包含请求地址 的STOR_ADDRESS 结构。

NumSrbExData

此请求的扩展 SRB 数据块计数。

DataTransferLength

指示数据缓冲区的大小(以字节为单位)。 如果出现不足,微型端口驱动程序必须将此成员更新为实际传输的字节数。

DataBuffer

指向数据缓冲区。 微型端口驱动程序不应将此值用作数据指针,除非微型端口驱动程序在 HBA 的PORT_CONFIGURATION_INFORMATION中将 MapBuffers 设置为 TRUE。 但是,对于SRB_FUNCTION_IO_CONTROL请求,微型端口驱动程序可以将此值用作数据指针,而不考虑 MapBuffers 的值。

ZeroGuard2

要防范将此结构解释为 SCSI_REQUEST_BLOCK的驱动程序的防护区域。 设置为 0。

OriginalRequest

指向此请求的 IRP。 此成员与微型端口驱动程序无关。

ClassContext

指向此请求的类驱动程序上下文数据。 此成员与微型端口驱动程序无关。

PortContext

指向此请求的端口驱动程序上下文数据。 此成员与微型端口驱动程序无关。

MiniportContext

指向 Srb 扩展。 如果微型端口驱动程序在 HW_INITIALIZATION_DATA中将 SrbExtensionSize 设置为零,则不得使用此成员。 MiniportContext 上的内存不是由特定于操作系统的端口驱动程序初始化的,微型端口驱动程序确定的数据可以直接由 HBA 访问。 可以通过使用 MiniportContext 指针调用 ScsiPortGetPhysicalAddress 来获取相应的物理地址。

NextSrb

指示此请求应用到的 STORAGE_REQUEST_BLOCK 。 只有一小部分请求使用第二个 SRB,例如SRB_FUNCTION_ABORT_COMMAND。

_STORAGE_REQUEST_BLOCK

SrbExDataOffset[ANYSIZE_ARRAY]

指定 SRB 扩展数据块位置的偏移量数组。 如果 NumSrbExData = 0,则此数组为空。

注解

从 Windows 8 开始,STORAGE_REQUEST_BLOCK结构支持扩展 SRB 类型。 STORAGE_REQUEST_BLOCK 扩展 SRB 函数,允许将 SRB 函数的扩展数据块添加到请求中。 将继续支持使用 SCSI_REQUEST_BLOCK 结构的 SRB 请求。

如果 为 NumSrbExData> 0,则 SRB 扩展数据块的偏移量位于 SrbExDataOffset 数组中。 每个偏移量相对于此结构的开头,并指向包含扩展数据块 的SRBEX_DATA 结构。

SRB 的目标设备地址位于 AddressOffset 指示的STOR_ADDRESS结构中。

要求

   
最低受支持的客户端 Windows 8
标头 srb.h (包括 Storport.h、Srb.h、Minitape.h)

另请参阅

SCSI_REQUEST_BLOCK

STOR_ADDRESS