storport.h) (STORAGE_REQUEST_BLOCK 结构

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;
  union {
    ULONG SystemStatus;
    ULONG RequestTagHigh4Bytes;
  } DUMMYUNIONNAME;
  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

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

含义
SRB_STATUS_PENDING 指示请求正在进行。 特定于操作系统的端口驱动程序将 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 指示微型端口驱动程序或目标设备此时无法接受请求。 操作系统特定的端口驱动程序稍后将重新提交请求。
SRB_STATUS_INTERNAL_ERROR 指示 Storport 驱动程序无法将请求传递到微型端口驱动程序或目标设备。 在这种情况下,状态记录在 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 INITIATE RECOVERY 消息。
SRB_STATUS_AUTOSENSE_VALID 指示 SenseInfoBuffer 中返回的信息有效。
SRB_STATUS_QUEUE_FROZEN 微型端口驱动程序绝不应将 SrbStatus 成员设置为此值。 Windows 端口驱动程序可以设置此值,以通知存储类驱动程序其特定外围设备的请求队列已冻结。
SRB_STATUS_NOT_POWERED 指示请求失败,因为目标未通电。 对于在 SrbFlags 中设置了SRB_FLAGS_NO_KEEP_AWAKE的请求,发送到已关闭的 LUN 的请求将失败,并显示此状态。
SRB_STATUS_LINK_DOWN 指示请求因链接关闭而失败。
SRB_STATUS_BAD_SRB_BLOCK_LENGTH 指示由于 SRB 长度无效,请求失败。

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_BIDIRECTIONAL、SRBEX_DATA_IO_INFO
SRB_FUNCTION_IO_CONTROL (0x02) 请求是 I/O 控制请求,源自具有专用 HBA 的用户模式应用程序。 SRB DataBuffer 指向后跟数据区域的 SRB_IO_CONTROL 标头。 无论 MapBuffers 的值如何,驱动程序都可以使用 DataBuffer 中的值。 如果微型端口驱动程序在初始化时请求 SRB 扩展,则只有 SRB 函数SrbFlagsTimeOutValueDataBufferDataTransferLength 成员以及 SrbExtension 成员有效。 如果微型端口驱动程序控制应用程序专用 HBA 以便支持此请求,则微型端口驱动程序应执行该请求,并在 SRB 完成时使用通过 RequestCompleteNextRequest 调用 StorPortNotification 的正常机制来通知特定于操作系统的端口驱动程序。
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 LengthFunctionSrbFlagsOriginalRequest 成员有效。 当队列被锁定时,只会处理具有 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 LengthFunctionSrbFlagsOriginalRequest 成员有效。 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。 新的类驱动程序应使用 lookaside 列表,而不是区域缓冲区。
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 支持对逻辑单元 (LU) 的请求进行内部排队,微型端口驱动程序在此 HBA 的PORT_CONFIGURATION_INFORMATION中将 TaggedQueueing 设置为 TRUE

RequestPriority

SRB 的优先级分配。 可以是以下值之一。

含义
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

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

DUMMYUNIONNAME

嵌入式联合。

DUMMYUNIONNAME.SystemStatus

用于将系统故障状态信息存储在 SrbStatus 故障条件 (例如SRB_STATUS_INTERNAL_ERROR) 中。

DUMMYUNIONNAME.RequestTagHigh4Bytes

如果启用了唯一标记功能,则用于存储高 4 个字节的唯一标记。

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 指针调用 StorportGetPhysicalAddress 来获取相应的物理地址。

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 及更高版本的 Windows。
标头 storport.h (包括 Storport.h、Srb.h、Minitape.h)

另请参阅