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。 对于数据输出命令,DataBuffer 成员 ATA_PASS_THROUGH_DIRECT 必须指向包含要写入的数据的缓存对齐缓冲区。
输入缓冲区长度
Parameters.DeviceIoControl.InputBufferLength 指示缓冲区的大小(以字节为单位)Irp->AssociatedIrp.SystemBuffer。 InputBufferLength 的值是固定的,不依赖于传输的数据量。 它等于 sizeof(ATA_PASS_THROUGH_DIRECT)。 如果缓冲区的大小小于 sizeof(ATA_PASS_THROUGH_DIRECT),则端口驱动程序将失败 I/O 请求并返回错误。
输出缓冲区
端口驱动程序使用存储在 Irp->AssociatedIrp.SystemBuffer的缓冲区 ATA_PASS_THROUGH_DIRECT 结构设置返回数据的格式。
端口驱动程序将传输的数据存储在由 ATA_PASS_THROUGH_DIRECTDataBuffer 成员指向的缓存对齐缓冲区中。
端口驱动程序使用设备输出寄存器中存在的值填充 CurrentTaskFile 成员 ATA_PASS_THROUGH_DIRECT 完成 ATA 命令。 应用程序负责解释输出寄存器的内容,以确定设备返回了哪些错误(如果有)。
输出缓冲区长度
端口驱动程序更新 ATA_PASS_THROUGH_DIRECT 结构的 DataTransferLength 成员,以指示从设备传输的数据量。
输入/输出缓冲区
没有。
输入/输出缓冲区长度
不適用。
状态块
信息 成员设置为 Irp->AssociatedIrp.SystemBuffer输出缓冲区中返回的字节数。 如果 ATA_PASS_THROUGH_DIRECT 中输入 长度 值未正确设置,则 状态 成员设置为STATUS_SUCCESS或可能设置为STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER。
要求
| 要求 | 价值 |
|---|---|
| 最低支持的客户端 | Windows Server 2003 |
| 标头 | ntddscsi.h (包括 Ntddscsi.h) |