IOCTL_ATA_PASS_THROUGH 是如何使用的?

How is IOCTL_ATA_PASS_THROUGH used?

我一直致力于创建一个程序来发送(最好是任意的)ATA 命令,到目前为止,我在 Windows 中找到的唯一选择是 IOCTL_ATA_PASS_THROUGH and a related struct, ATA_PASS_THROUGH_EX 使用 C++。

不幸的是,对于那些还不知道自己在做什么的人,我发现缺少文档。这是我还没弄明白的:

这对于评论来说有点太长了,所以我将其作为答案发布,但请注意,这主要是有根据的猜测。

如何在语句中使用IOCTL_ATA_PASS_THROUGH?

这个很简单。与所有控制代码一样,它使用 the DeviceIoControl function.

发送

你把ATA命令发到哪里去了?

我不熟悉 ATA,但我猜是 "command register",即 CurrentTaskFile[6]。我想您可以找到一些关于 ATA 协议的文档来解决这个问题。

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

文档说

If the embedded ATA command is a write operation, the size of the input buffer should be the sum of sizeof(ATA_PASS_THROUGH_EX) and the value in the DataTransferLength member of ATA_PASS_THROUGH_EX.

所以DataTransferLength肯定不包括ATA_PASS_THROUGH_EX结构体的长度

你怎么select命令去哪个驱动?

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

驱动器的响应到哪里去了?

进入 DeviceIoControl() 输出缓冲区。