SCSI_REQUEST_BLOCK 结构 (storport.h)
注意
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 函数、 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 微型端口驱动程序应完成逻辑单元的任何活动请求。 只有 SRB 的 Function、 PathId、 TargetId 和 Lun 成员有效。 Storport 支持这种类型的重置,但 SCSI 端口不支持。 |
SRB_FUNCTION_RESET_BUS (0x12) | 应使用SCSIMESS_BUS_DEVICE_RESET消息重置 SCSI 总线。 仅当给定请求已超时且后续中止超时请求的请求也已超时时,微型端口驱动程序才会收到此请求。只有 SRB Function 和 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) | 系统正在关闭。 仅当在 HBA 的PORT_CONFIGURATION_INFORMATION中将 CachesData 设置为 TRUE 时,此请求才会发送到微型端口驱动程序。 此类微型端口驱动程序可以在所有系统活动实际停止之前接收其中几个通知。 但是,上次关闭通知将在上次启动 I/O 之后发生。 只有 SRB 函数、 PathId、 TargetId 和 Lun 成员有效。 |
SRB_FUNCTION_FLUSH (0x08) | 微型端口驱动程序应刷新目标设备的任何缓存数据。 仅当在 HBA 的PORT_CONFIGURATION_INFORMATION中将 CachesData 设置为 TRUE 时,此请求才会发送到微型端口驱动程序。 只有 SRB 函数、 PathId、 TargetId 和 Lun 成员有效。 |
SRB_FUNCTION_IO_CONTROL (0x02) | 请求是 I/O 控制请求,源自具有专用 HBA 的用户模式应用程序。 SRB DataBuffer 指向后跟数据区域的SRB_IO_CONTROL标头。 无论 MapBuffers 的值如何,驱动程序都可以使用 DataBuffer 中的值。 如果微型端口驱动程序在初始化时请求 SRB 扩展,则只有 SRB 函数、 SrbFlags、 TimeOutValue、 DataBuffer 和 DataTransferLength 成员以及 SrbExtension 成员有效。 如果微型端口驱动程序控制应用程序专用 HBA 以便支持此请求,则微型端口驱动程序应执行请求,并在 SRB 完成时使用通过 RequestComplete 和 NextRequest 调用 ScsiPortNotification 的正常机制通知特定于 OS 的端口驱动程序。 |
SRB_FUNCTION_LOCK_QUEUE (0x18) | 保留特定逻辑单元的端口驱动程序排队的请求,通常是在处理电源请求时。 只有 SRB Length、 Function、 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、 Function、 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 微型端口驱动程序,以释放在上一个请求SRB_FUNCTION_DUMP_POINTERS期间分配的任何资源。 |
SrbStatus
返回已完成请求的状态。 此成员应由微型端口驱动程序设置,然后它通过调用 ScsiPortNotification 和 RequestComplete 来通知特定于 OS 的驱动程序请求已完成。 此成员的值可以是下列值之一:
值 | 含义 |
---|---|
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 执行自动请求检测,并且微型端口驱动程序在此 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 端口驱动程序可以设置此值,以通知存储类驱动程序其特定外围设备的请求队列已冻结。 |
ScsiStatus
返回 HBA 或目标设备返回的 SCSI 状态。 如果状态不为 SUCCESS,微型端口驱动程序应将 SrbStatus 成员设置为SRB_STATUS_ERROR。
PathId
指示请求的 SCSI 端口或总线。 此值从零开始。
TargetId
指示总线上的目标控制器或设备。
Lun
指示设备的逻辑单元号。
QueueTag
包含由特定于 OS 的端口驱动程序分配的队列标记值。 如果此成员用于标记队列,则 HBA 支持对 LU 的请求进行内部排队,并且微型端口驱动程序在此 HBA 的PORT_CONFIGURATION_INFORMATION中将 TaggedQueueing 设置为 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 设备,则此类微型端口驱动程序必须在调用 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 类驱动程序,这表示散点/收集列表的内存是从非分页池分配的。 如果设置了此标志,则类驱动程序必须调用 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
指向数据缓冲区。 微型端口驱动程序不应将此值用作数据指针,除非微型端口驱动程序在 HBA 的PORT_CONFIGURATION_INFORMATION中将 MapBuffers 设置为 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 存储类和筛选器驱动程序可以将具有以下 函数 值的 SDB 发送到系统端口驱动程序:
- 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 微型端口驱动程序的 SDB 中设置。 SRB_FUNCTION_WMI_REQUEST仅在 SCSI_WMI_REQUEST_BLOCK 中有效。 存储类或筛选器驱动程序使用此将 WMI 请求发送到端口驱动程序。
要求
要求 | 值 |
---|---|
Header | storport.h (包括 Srb.h、Minitape.h、Storport.h) |