Как используется IOCTL_ATA_PASS_THROUGH?

#c #windows #ioctl #ata

#c #Windows #ioctl #ата #ata

Вопрос:

Я работал над созданием программы для отправки (предпочтительно произвольных) команд 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 используется в инструкции?

Это просто. Как и все управляющие коды, он отправляется с помощью функции DeviceIoControl .

Куда вы помещаете команду ATA для отправки?

Я не знаком с ATA, но я предполагаю, что это «регистр команд», т. Е. CurrentTaskFile[6] . Я полагаю, что вы могли бы найти некоторую документацию по протоколу ATA, которая должна прояснить это.

ATA_PASS_THROUGH_EX.DataTransferLength должен быть размер буфера данных в байтах. Это struct команда ATA или просто команда?

В документации говорится

Если встроенная команда ATA является операцией записи, размер входного буфера должен быть суммой sizeof(ATA_PASS_THROUGH_EX) и значения в элементе DataTransferLength ATA_PASS_THROUGH_EX .

Так DataTransferLength что определенно не включает длину ATA_PASS_THROUGH_EX структуры.

Как вы выбираете, на какой диск отправляется команда?

Предположительно, это определяется дескриптором устройства, который вы передаете DeviceIoControl() .

Куда поступает ответ с диска?

В выходной буфер DeviceIoControl().

Комментарии:

1. Все это было правдой. Спасибо!