IOCTL_ATA_PASS_THROUGH 是如何使用的?
Posted
技术标签:
【中文标题】IOCTL_ATA_PASS_THROUGH 是如何使用的?【英文标题】:How is IOCTL_ATA_PASS_THROUGH used? 【发布时间】: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 命令,还是只是命令?
如何选择命令将要发送到的驱动器?
驱动器的响应去了哪里?
【问题讨论】:
【参考方案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() 输出缓冲区。
【讨论】:
这都是真的。谢谢!以上是关于IOCTL_ATA_PASS_THROUGH 是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章