如何使用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()输出缓冲区。
这是完全正确的。谢谢! – Smurfton