IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)
允许应用程序将几乎所有 ATA 命令发送到目标设备,但有以下限制:
- 如果存在设备目标类型的类驱动程序,应用程序必须将请求发送到类驱动程序。 因此,仅当连接到该 LU 的设备类型没有类驱动程序时,应用程序才能将此请求直接发送到目标逻辑单元(LU)的系统端口驱动程序。 在处理直通请求之前,系统端口驱动程序不会检查以确定某个设备是否已由类驱动程序声明。 因此,如果应用程序绕过已声明设备的类驱动程序并将该设备的直通请求直接发送到端口驱动程序,则类驱动程序和应用程序之间可能会发生控制设备的冲突。
- 如果命令要求基础驱动程序直接访问内存,则无法使用此请求。 如果调用方命令可能需要直接访问内存,请改用 IOCTL_ATA_PASS_THROUGH_DIRECT。
- 应用程序不得尝试异步发送直通请求。 所有直通请求都必须是同步的。
- 应用程序不需要管理权限才能将直通请求发送到设备,但它们必须具有对设备的读/写访问权限。
主要代码
输入缓冲区
Irp->AssociatedIrp.SystemBuffer 的缓冲区应包含 ATA_PASS_THROUGH_EX 结构,其中包括一组任务文件输入寄存器,这些寄存器指示要执行的命令的排序及其参数。 调用方必须初始化此结构的所有成员,PathId、TargetId,以及端口驱动程序填充的 Lun。 对于数据输出命令,DataBufferOffset 结构的成员必须指向包含要写入的数据的缓存对齐缓冲区。
输入缓冲区长度
Parameters.DeviceIoControl.InputBufferLength 指示缓冲区的大小(以字节为单位)Irp->AssociatedIrp.SystemBuffer。 如果嵌入式 ATA 命令是写入作,则输入缓冲区的大小应为 sizeof(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 小于 sizeof(ATA_PASS_THROUGH_EX),则端口驱动程序将失败 I/O 请求并返回错误。
输出缓冲区
端口驱动程序使用 ATA_PASS_THROUGH_EX 结构格式化返回数据,并将数据存储在 Irp->AssociatedIrp.SystemBuffer的缓冲区中。
端口驱动程序使用设备输出寄存器中存在的值填充 CurrentTaskFile 成员,这些值在嵌入式 ATA 命令完成后就存在于设备输出寄存器中。 如果命令是数据传输,则端口驱动程序会将传输的数据存储在缓存对齐的缓冲区中,该缓冲区位于 DataBufferOffset 的偏移量 字节从结构开头。 应用程序负责解释输出寄存器的内容,以确定设备返回了哪些错误(如果有)。
输出缓冲区长度
端口驱动程序更新 DataTransferLengthATA_PASS_THROUGH_EX 成员,以指示实际从设备传输的数据量。 如果嵌入式 ATA 命令是写入作或不传输数据的设备控制作,则 OutputBufferLength 等于 (ATA_PASS_THROUGH_EX)大小。 如果嵌入式 ATA 命令是读取作,OutputBufferLength 等于 sizeof(ATA_PASS_THROUGH_EX) + DataTransferLength。
状态块
信息 成员设置为 Irp->AssociatedIrp.SystemBuffer输出缓冲区中返回的字节数。 如果输入 状态ATA_PASS_THROUGH_EX 值未正确设置,则 状态 成员设置为STATUS_SUCCESS或可能为STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows Server 2003 开始可用。 |
标头 | ntddscsi.h (包括 Ntddscsi.h) |