Как используется 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 или просто команда?- Как вы выбираете, на какой диск собирается команда?
- Куда идет ответ от привода?
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().