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 是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章

MIDI 文件播放一般是如何处理的?

图片 url 是如何用 java fxml 写的

Java 并发是如何为 Windows 实现的? [关闭]

Nginx 是如何处理 HTTP 头部的?

Nginx 是如何处理 HTTP 头部的?

iOS - 我很困惑这里是如何处理内存的?