【问题标题】:How is IOCTL_ATA_PASS_THROUGH used?IOCTL_ATA_PASS_THROUGH 是如何使用的?
【发布时间】: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 命令,还是只是命令?
  • 如何选择命令将要发送到的驱动器?
  • 驱动器的响应去了哪里?

【问题讨论】:

    标签: c++ windows ioctl 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() 输出缓冲区。

    【讨论】:

    • 这都是真的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2015-05-04
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多