如何使用IOCTL_ATA_PASS_THROUGH?

问题描述:

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

不幸的是,我一直在寻找那些不知道他们在做什么的人缺乏的文档。以下是我没有想到的:

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

这对于评论来说太长了,所以我将它作为答案发布,但请注意,它在很大程度上是受过教育的猜测。

在声明中如何使用IOCTL_ATA_PASS_THROUGH?

这个很简单。像所有控制码一样,它使用the DeviceIoControl function发送。

你把ATA命令发送到哪里?

我不熟悉ATA,但我的猜测是“命令注册表”,即CurrentTaskFile[6]。我想你可以找到一些关于ATA协议的文档来清除它。

ATA_PASS_THROUGH_EX.DataTransferLength应该是数据缓冲区的大小,以字节为单位。这是结构+ ATA命令,还是只是命令?

文档说

如果嵌入式ATA命令是一个写操作,输入缓冲器的大小应为的sizeof(ATA_PASS_THROUGH_EX)和ATA_PASS_THROUGH_EX的DataTransferLength成员的值的总和。

所以DataTransferLength绝对不包括ATA_PASS_THROUGH_EX结构的长度。

如何选择命令将要使用的驱动器?

推测这是由您传递给DeviceIoControl()的设备句柄决定的。

从驱动器的响应去哪里?

进入DeviceIoControl()输出缓冲区。

+0

这是完全正确的。谢谢! – Smurfton