STORAGE_REQUEST_BLOCK结构(storport.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;
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 结构兼容。 这等于此结构的 签名 成员的偏移量。
Function
设置为 SRB_FUNCTION_STORAGE_REQUEST_BLOCK 以指示这是扩展的 SRB。 与 SCSI_REQUEST_BLOCK不同,SRB 函数标识符位于 SrbFunction 成员中。
SrbStatus
返回已完成请求的状态。 此成员应由微型端口驱动程序设置,然后通知特定于作系统的驱动程序,该驱动程序通过调用 StorPortNotification 以及 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) 执行自动请求感知,并将微型端口驱动程序设置为 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 端口驱动程序可以设置此值,以通知存储类驱动程序特定外围设备的请求队列已被冻结。 |
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_CDB16、SRBEX_DATA_SCSI_CDB32、SRBEX_DATA_SCSI_CDB_VAR、SRBEX_DATA_BIDIRECTIONAL、SRBEX_DATA_IO_INFO |
SRB_FUNCTION_IO_CONTROL(0x02) | 请求是 I/O 控制请求,源自具有专用 HBA 的用户模式应用程序。 SRB DataBuffer 指向 SRB_IO_CONTROL 标头,后跟数据区域。 驱动程序可以使用 DataBuffer 中的值,而不考虑 mapBuffers 的值。 只有 SRB 函数、SrbFlags、TimeOutValue、DataBuffer,DataTransferLength 成员以及初始化时 SrbExtension 成员一起有效。 如果微型端口驱动程序控制应用程序专用 HBA 以便支持此请求,则微型端口驱动程序应在 SRB 完成后执行请求并通知特定于作系统的端口驱动程序,并使用 RequestComplete 和 NextRequestStorPortNotification 的正常机制。 |
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 Length、函数、SrbFlags,并且 OriginalRequest 成员有效。 当队列被锁定时,只会处理 SrbFlags 具有 SRB_FLAGS_BYPASS_LOCKED_QUEUE 的 ORed 的请求。 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_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_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 总线上目标的数据阶段来确定传输方向。 |
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 | 此标志与微型端口驱动程序无关。 对于类驱动程序,这表示已从非分页池分配散点/收集列表的内存。 如果设置了此标志,类驱动程序必须调用 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 处理的一部分。 支持运行时电源控制的微型端口不应使用这些请求调用 StorPortPoFxActivateComponent 或 StorPortPoFxIdleComponent。 |
SRB_FLAGS_ADAPTER_CACHE_ENABLE | 指示适配器可以缓存数据。 |
ReservedUlong2
保留。 设置为 0。
RequestTag
包含由特定于作系统的端口驱动程序分配的队列标记值。 如果此成员用于标记队列,则 HBA 支持对逻辑单元(LU)的请求的内部队列,并将微型端口驱动程序设置为 TagedQueueing 设置为此 HBA PORT_CONFIGURATION_INFORMATION中的 true TRUE。
RequestPriority
SRB 的优先级分配。 可以是以下值之一。
价值 | 意义 |
---|---|
StorIoPriorityVeryLow (0) | 优先级非常低。 |
StorIoPriorityLow (1) | 低优先级。 |
StorIoPriorityNormal (2) | 正常优先级。 |
StorIoPriorityHigh (3) | 高优先级。 |
StorIoPriorityCritical (4) | 关键优先级。 |
RequestAttribute
指示设置 SRB_FLAGS_QUEUE_ACTION_ENABLE 标志时要使用的标记队列消息。 该值可以是下列值之一:SRB_SIMPLE_TAG_REQUEST、SRB_HEAD_OF_QUEUE_TAG_REQUEST或 SRB_ORDERED_QUEUE_TAG_REQUEST。
TimeOutValue
指示请求可以在作系统特定的端口驱动程序认为超时之前可以执行的间隔(以秒为单位)。微型端口驱动程序不需要时间请求,因为端口驱动程序已经这样做。
DUMMYUNIONNAME
嵌入式联合。
DUMMYUNIONNAME.SystemStatus
用于在 SrbStatus 故障条件中存储系统故障状态信息(例如,SRB_STATUS_INTERNAL_ERROR)。
DUMMYUNIONNAME.RequestTagHigh4Bytes
启用唯一标记功能时,用于存储高四字节的唯一标记。
SystemStatus
由 Storport 驱动程序使用,而不是 SrbStatus,在无法将请求传送到微型端口驱动程序时报告已完成请求的状态。 在这种情况下,SrbStatus 设置为 SRB_STATUS_INTERNAL_ERROR。 此成员专用于 Storport 和类驱动程序之间的通信,不应由微型端口驱动程序使用。
ZeroGuard1
一个防护区,以防止将这种结构解释为 SCSI_REQUEST_BLOCK的驱动程序。 设置为 0。
AddressOffset
存储请求地址与此结构开头的偏移量。 此偏移量查找包含请求地址的 STOR_ADDRESS 结构。
NumSrbExData
此请求的扩展 SRB 数据块计数。
DataTransferLength
指示数据缓冲区的大小(以字节为单位)。 如果出现不足,微型端口驱动程序必须将此成员更新为实际传输的字节数。
DataBuffer
指向数据缓冲区。 微型端口驱动程序不应将此值用作数据指针,除非微型端口驱动程序将 MapBuffers 设置为 HBA PORT_CONFIGURATION_INFORMATION中的 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) |