【问题标题】:How is IOCTL_ATA_PASS_THROUGH used?IOCTL_ATA_PASS_THROUGH 是如何使用的?
【发布时间】:2016-10-01 23:57:05
【问题描述】:
我一直致力于创建一个程序来发送(最好是任意的)ATA 命令,到目前为止,我在 Windows 中找到的唯一选项是 IOCTL_ATA_PASS_THROUGH 和一个相关的结构,ATA_PASS_THROUGH_EX 使用 C++。
不幸的是,对于那些还不知道自己在做什么的人来说,我一直在寻找缺少的文档。以下是我还没弄清楚的:
- 如何在语句中使用
IOCTL_ATA_PASS_THROUGH?
- 你把要发送的 ATA 命令放在哪里?
-
ATA_PASS_THROUGH_EX.DataTransferLength 应该是数据缓冲区的大小,以字节为单位。是 struct + ATA 命令,还是只是命令?
- 如何选择命令将要发送到的驱动器?
- 驱动器的响应去了哪里?
【问题讨论】:
标签:
c++
windows
ioctl
ata
【解决方案1】:
这对于评论来说有点太长了,因此我将其发布为答案,但请注意,这在很大程度上是有根据的猜测。
语句中如何使用 IOCTL_ATA_PASS_THROUGH?
这个很简单。与所有控制代码一样,它使用the DeviceIoControl function 发送。
你把要发送的 ATA 命令放在哪里?
我不熟悉 ATA,但我猜是“命令寄存器”,即CurrentTaskFile[6]。我想你可以找到一些关于 ATA 协议的文档来解决这个问题。
ATA_PASS_THROUGH_EX.DataTransferLength 应该是数据缓冲区的大小,以字节为单位。是 struct + ATA 命令,还是只是命令?
文档说
如果嵌入的 ATA 命令是写操作,输入缓冲区的大小应该是 sizeof(ATA_PASS_THROUGH_EX) 和 ATA_PASS_THROUGH_EX 的 DataTransferLength 成员中的值之和。
所以DataTransferLength 肯定不包括ATA_PASS_THROUGH_EX 结构的长度。
你如何选择该命令要执行的驱动器?
这大概是由您传递给 DeviceIoControl() 的设备句柄决定的。
驱动器的响应去哪里了?
进入 DeviceIoControl() 输出缓冲区。