IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)
IOCTL_SCSI_PASS_THROUGH_EX 控制代码请求是 IOCTL_SCSI_PASS_THROUGH 请求的扩展版本。 此请求支持双向数据传输,并允许命令数据块(CDB)> 16 字节。
允许应用程序向目标设备发送几乎所有 SCSI 命令,但有以下限制:
- 不允许使用多目标命令(如 COPY)。
- 如果存在设备的目标类型的类驱动程序,则必须将请求发送到该类驱动程序。 因此,仅当连接到该 LU 的设备类型没有类驱动程序时,应用程序才能将此请求直接发送到目标逻辑单元(LU)的系统端口驱动程序。 在处理直通请求之前,系统端口驱动程序不会检查以确定设备是否已由类驱动程序声明。 因此,如果应用程序绕过已声明设备的类驱动程序并将该设备的直通请求直接发送到端口驱动程序,则类驱动程序和应用程序之间可能会发生控制设备的冲突。 如果传递请求发送到适配器设备对象,并且它源自用户模式并面向类驱动程序声明的 LU,则 Storport 将失败请求并STATUS_INVALID_DEVICE_REQUEST。 如果请求发送到 LU 设备对象、源自内核模式或面向未认领的 LU,则会将其传递到微型端口驱动程序。
- 如果 CDB 可能需要基础微型端口驱动程序直接访问内存,则无法使用此请求。 如果调用方 CDB 可能需要直接访问内存,请改用 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX。
- 应用程序不得尝试异步发送直通请求。 所有直通请求都必须是同步的。
- 应用程序不需要管理权限才能将直通请求发送到设备,但它们必须具有对设备的读/写访问权限。
IOCTL_SCSI_PASS_THROUGH_EX 是缓冲设备控制请求。 若要绕过系统内存中的缓冲,调用方应使用 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX。 处理 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX 请求时,系统会锁定用户内存中的缓冲区,并且设备直接访问此内存。
此请求通常用于传输少量数据(<16K)。
应用程序可以通过 IRP_MJ_DEVICE_CONTROL 请求发送此请求。
存储类驱动程序将次要 IRP 编号设置为IRP_MN_SCSI_CLASS,以指示请求已由存储类驱动程序处理。
主要代码
输入缓冲区
此结构包括一个 SCSI CDB,该 CDB 必须由调用方初始化,但端口驱动程序填充的路径、目标 ID 和逻辑单元号(LUN 除外)。 对于数据输出命令,要传输的数据包含在 Irp->AssociatedIrp.SystemBuffer 的缓冲区中,DataInBufferOffsetSCSI_PASS_THROUGH_EX 结构中。 但是,如果调用方要求请求请求感知数据,则调用方必须立即分配额外的存储,SCSI_PASS_THROUGH_EX之后。
输入缓冲区长度
Parameters.DeviceIoControl.InputBufferLength 指示 Irp->AssociatedIrp.SystemBuffer的缓冲区的大小(感知数据大小 + 大小(SCSI_PASS_THROUGH_EX))。 SCSI_PASS_THROUGH_EX 结构的大小因 DataInTransferLength 中指定的值而异。输出缓冲区
端口驱动程序返回任何请求感知数据和从设备传输到缓冲区的任何数据,Irp->AssociatedIrp.SystemBuffer。 SCSI_PASS_THROUGH_EX 结构中的 SenseInfoLength 和 DataOutTransferLength 更新,以指示传输的数据量。
输出缓冲区长度
SCSI_PASS_THROUGH_EX 结构中的 SenseInfoLength 和 DataOutTransferLength 更新,以指示传输的数据量。
状态块
信息 字段设置为 Irp->AssociatedIrp.SystemBuffer输出缓冲区中返回的字节数。 “状态”字段设置为STATUS_SUCCESS,或者如果输入 长度 值在 SCSI_PASS_THROUGH_EX 中设置不当,则设置为STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER。
言论
若要发出 IOCTL_SCSI_PASS_THROUGH_EX 请求,基础存储设备必须支持扩展的 SRB。 这意味着支持的 SRB 类型 SRB_TYPE_STORAGE_REQUEST_BLOCK。 应用程序可以使用 IOCTL_STORAGE_QUERY_PROPERTY 请求查询 SRB 支持,其查询类型 为 propertyStandardQuery,以及 StorageDeviceProperty的属性类型。 STORAGE_ADAPTER_DESCRIPTIOR 结构中返回的 SrbType 成员将指示 SRB_TYPE_SCSI_REQUEST_BLOCK 或 SRB_TYPE_STORAGE_REQUEST_BLOCK。
要求
要求 | 价值 |
---|---|
标头 | ntddscsi.h (包括 Ntddscsi.h) |