IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)
IOCTL_ATA_PASS_THROUGH_DIRECT 允许应用程序将几乎任何 ATA 命令发送到目标设备,但存在以下限制:
如果存在设备的目标类型的类驱动程序,则应用程序必须将请求发送到类驱动程序。 因此,仅当设备没有类驱动程序时,应用程序才能将此请求直接发送到目标逻辑单元的系统端口驱动程序。
如果嵌入式 ATA 命令可能需要基础微型端口驱动程序直接访问内存,则应用程序 必须 使用此请求而不是 IOCTL_ATA_PASS_THROUGH 。
如果 ATA 命令请求数据传输操作,调用方必须设置缓存对齐的缓冲区,驱动程序可以从该缓冲区或将数据直接传输到该缓冲区。 调用方应确保以下各项:
- 数据传输长度满足设备的 I/O 对齐要求;否则,此 IOCTL 将失败并STATUS_INVALID_PARAMETER。
- 数据传输长度不应大于设备的最大 I/O 传输长度;否则,预期设备会使请求失败。
IOCTL_ATA_PASS_THROUGH_DIRECT请求通常用于传输 (超过 16 KB) 的大量数据。
主要代码
输入缓冲区
Irp-AssociatedIrp.SystemBuffer> 中的缓冲区包含一个ATA_PASS_THROUGH_DIRECT结构,该结构包含一组指示要执行的命令类型的任务文件输入寄存器。 调用方必须初始化此结构的所有成员,端口驱动程序填充的 PathId、 TargetId 和 Lun 除外。 对于数据输出命令,ATA_PASS_THROUGH_DIRECT 的 DataBuffer 成员必须指向包含要写入的数据的缓存对齐缓冲区。
输入缓冲区长度
Parameters.DeviceIoControl.InputBufferLength 指示 Irp-AssociatedIrp.SystemBuffer> 中缓冲区的大小(以字节为单位)。 InputBufferLength 的值是固定的,不依赖于传输的数据量。 它等于 sizeof (ATA_PASS_THROUGH_DIRECT) 。 如果缓冲区的大小小于 size of (ATA_PASS_THROUGH_DIRECT) ,则端口驱动程序将失败 I/O 请求并返回错误。
输出缓冲区
端口驱动程序使用存储在 Irp-AssociatedIrp.SystemBuffer> 缓冲区中的ATA_PASS_THROUGH_DIRECT结构来格式化返回数据。
端口驱动程序将传输的数据存储在 ATA_PASS_THROUGH_DIRECT的 DataBuffer 成员指向的缓存对齐缓冲区中。
在完成 ATA 命令时,端口驱动程序使用设备输出寄存器中存在的值填充 ATA_PASS_THROUGH_DIRECT 的 CurrentTaskFile 成员。 应用程序负责解释输出寄存器的内容,以确定设备返回了哪些错误(如果有)。
输出缓冲区长度
端口驱动程序更新ATA_PASS_THROUGH_DIRECT结构的 DataTransferLength 成员,以指示从设备传输的数据量。
输入/输出缓冲区
无。
输入/输出缓冲区长度
不适用。
状态块
信息成员设置为 Irp-AssociatedIrp.SystemBuffer> 的输出缓冲区中返回的字节数。 如果未正确设置 ATA_PASS_THROUGH_DIRECT 中的输入 Length 值,则状态成员设置为 STATUS_SUCCESS,或者可能设置为STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Server 2003 |
标头 | ntddscsi.h (包括 Ntddscsi.h) |