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

Я работал над созданием программы для отправки (предпочтительно произвольных) команд ATA, и пока единственная опция, которую я нашел в Windows, это IOCTL_ATA_PASS_THROUGH и связанная структура, ATA_PASS_THROUGH_EX используя C ++.

К сожалению, я обнаружил, что документации не хватает тем, кто еще не знает, что делает. Вот что я не понял:

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

0

Решение

Это слишком долго для комментария, поэтому я публикую его как ответ, но, пожалуйста, имейте в виду, что это в значительной степени образованное предположение.

Как 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

Другие решения

Других решений пока нет …