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
  • 应用程序不得尝试异步发送传递请求。 所有传递请求都必须是同步的。
  • 应用程序不需要管理特权来向设备发送直通请求,但它们必须具有对设备的读/写访问权限。
调用应用程序创建 SCSI 命令描述符块,如果发生 CHECK CONDITION,该块可以包含请求感知数据的请求。

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 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 建议改用 Storport 驱动程序Storport 微型端口 驱动程序模型。
 

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

此结构包括 SCSI CDB,调用方必须初始化该 CDB,但路径、目标 ID 和逻辑单元号 (LUN) 除外,这些路径、目标 ID 和逻辑单元号由端口驱动程序填充。 对于数据输出命令,要传输的数据包含在 SCSI_PASS_THROUGH_EX 结构的 DataInBufferOffsetIrp-AssociatedIrp.SystemBuffer> 缓冲区中。 但是,如果调用方请求请求请求感知数据,则调用方必须在 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结构中的 SenseInfoLengthDataOutTransferLength 以指示传输的数据量。

输出缓冲区长度

更新SCSI_PASS_THROUGH_EX结构中的 SenseInfoLengthDataOutTransferLength 以指示传输的数据量。

状态块

信息”字段设置为 Irp-AssociatedIrp.SystemBuffer> 的输出缓冲区中返回的字节数。 “ 状态” 字段设置为“STATUS_SUCCESS”,如果错误地设置SCSI_PASS_THROUGH_EX中的输入 Length 值,则 可能会STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER

注解

若要发出 IOCTL_SCSI_PASS_THROUGH_EX 请求,基础存储设备必须支持扩展 SDB。 这意味着支持的 SRB 类型SRB_TYPE_STORAGE_REQUEST_BLOCK。 应用程序可以使用查询类型为 PropertyStandardQueryStorageDevicePropertyIOCTL_STORAGE_QUERY_PROPERTY 请求查询 SRB 支持。 STORAGE_ADAPTER_DESCRIPTIOR 结构中返回的 SrbType 成员将指示SRB_TYPE_SCSI_REQUEST_BLOCKSRB_TYPE_STORAGE_REQUEST_BLOCK

要求

要求
Header ntddscsi.h (包括 Ntddscsi.h)

另请参阅

SCSI_PASS_THROUGH_EX