IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)

允许应用程序将几乎任何 ATA 命令发送到目标设备,但存在以下限制:

  • 如果存在设备的目标类型的类驱动程序,则应用程序必须将请求发送到类驱动程序。 因此,仅当连接到该 LU 的设备类型没有类驱动程序时,应用程序才能将此请求直接发送到目标逻辑单元的系统端口驱动程序, (LU) 。 在处理传递请求之前,系统端口驱动程序不检查来确定类驱动程序是否已声明设备。 因此,如果应用程序绕过已声明设备的类驱动程序,并将该设备的传递请求直接发送到端口驱动程序,则类驱动程序和应用程序之间可能会发生设备控制冲突。
  • 如果命令需要基础驱动程序直接访问内存,则不能使用此请求。 如果调用方命令可能需要直接访问内存,请改用 IOCTL_ATA_PASS_THROUGH_DIRECT
  • 应用程序不得尝试异步发送传递请求。 所有传递请求都必须是同步的。
  • 应用程序不需要管理特权来向设备发送直通请求,但它们必须具有对设备的读/写访问权限。
调用应用程序为 ATA_PASS_THROUGH_EX 结构中的预期命令提供 ATA 任务文件寄存器内容。 系统双精度缓冲所有数据传输。 此请求通常用于传输 (小于 16 KB) 的少量数据。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

Irp-AssociatedIrp.SystemBuffer> 中的缓冲区应包含ATA_PASS_THROUGH_EX结构,其中包括一组指示要执行的命令及其参数的任务文件输入寄存器。 调用方必须初始化此结构的所有成员,端口驱动程序填充的 PathIdTargetIdLun 除外。 对于数据输出命令,结构的 DataBufferOffset 成员必须指向包含要写入的数据的缓存对齐缓冲区。

输入缓冲区长度

Parameters.DeviceIoControl.InputBufferLength 指示 Irp->AssociatedIrp.SystemBuffer 上的缓冲区大小(以字节为单位)。 如果嵌入的 ATA 命令是写入操作,则输入缓冲区的大小应为大小之和 (ATA_PASS_THROUGH_EX) 和 ATA_PASS_THROUGH_EX的 DataTransferLength 成员中的值。 以下伪代码示例演示如何计算缓冲区大小:
ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength

如果嵌入式 ATA 命令是不涉及数据传输的读取操作或设备控制操作, 则 InputBufferLength 应等于 大小 (ATA_PASS_THROUGH_EX) 。

在任一情况下,如果 InputBufferLength 小于 大小 (ATA_PASS_THROUGH_EX) ,则端口驱动程序将失败 I/O 请求并返回错误。

输出缓冲区

端口驱动程序使用 ATA_PASS_THROUGH_EX 结构格式化返回数据,并将数据存储在 Irp-AssociatedIrp.SystemBuffer> 的缓冲区中

在嵌入式 ATA 命令完成时,端口驱动程序使用设备输出寄存器中存在的值填充 CurrentTaskFile 成员。 如果命令是数据传输,则端口驱动程序会将传输的数据存储在缓存对齐的缓冲区中,该缓冲区位于结构开头的 DataBufferOffset 字节的偏移量处。 应用程序负责解释输出寄存器的内容,以确定设备返回了哪些错误(如果有)。

输出缓冲区长度

端口驱动程序更新 ATA_PASS_THROUGH_EXDataTransferLength 成员,以指示实际从设备传输的数据量。 如果嵌入式 ATA 命令是写入操作或设备控制操作,则不传输数据, OutputBufferLength 等于 sizeof (ATA_PASS_THROUGH_EX) 。 如果嵌入的 ATA 命令是读取操作, 则 OutputBufferLength 等于 (ATA_PASS_THROUGH_EX) + DataTransferLength 的大小

状态块

信息成员设置为 Irp-AssociatedIrp.SystemBuffer> 的输出缓冲区中返回的字节数。 如果未正确设置ATA_PASS_THROUGH_EX中的输入 Status 值,则状态成员设置为STATUS_SUCCESS或可能设置为STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER

要求

要求
最低受支持的客户端 从 Windows Server 2003 开始可用。
标头 ntddscsi.h (包括 Ntddscsi.h)

另请参阅

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT