1

我一直在努力创建一个程序来发送(最好是任意的)ATA 命令,到目前为止,我在 Windows 中找到的唯一选项是IOCTL_ATA_PASS_THROUGH和一个相关的结构,使用 C++的ATA_PASS_THROUGH_EX 。

不幸的是,对于那些还不知道自己在做什么的人来说,我一直发现缺少这些文档。这是我没有弄清楚的:

  • 如何IOCTL_ATA_PASS_THROUGH在语句中使用?
  • 您将 ATA 命令发送到哪里?
  • ATA_PASS_THROUGH_EX.DataTransferLength应该是数据缓冲区的大小,以字节为单位。那是 struct + ATA 命令,还是只是命令?
  • 您如何选择命令将要执行的驱动器?
  • 驱动器的响应在哪里?
4

1 回答 1

2

这对于评论来说有点太长了,所以我将其发布为答案,但请注意,这在很大程度上是有根据的猜测。

IOCTL_ATA_PASS_THROUGH 如何在语句中使用?

这个很容易。与所有控制代码一样,它是使用DeviceIoControl 函数发送的

您将 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() 输出缓冲区。

于 2016-10-02T00:30:08.320 回答