не могу вкурить.. как внешнему usb-жесткому диску послать ata-команду, например identify_device (см. прикр. файл)..? и вообще возможно ли это? насколько я понял из своих неудачных попыток, через usb не получается менять конфигурацию жёсткого диска! нет ни доступа к SMART, ни других возможностей (имеется ввиду ATA_PASS_THROUGH с кодом соответствующей ata команды). все ioctl-запросы возвращаются с ошибкой (лишь только STORAGE_PROPERTY_QUERY возвращает конфигурацию внешнего жд)..
Низзя такого сделать. Разве что драйвер будет эмулировать ATA команды. USB винчестер не поддерживает ATA команды, используется SCSI2 завёрнутые в USB Mass Storage пакеты. Даже если просто подключить обычный hdd через переходгик USB->IDE, винчестер всё равно не будет на ATA команды отзываться. Потому что в переходнике стоит контроллер, который по USB получает SCSI2 команды и сам преобразует в ATA и шлёт винчестеру, а потом точно так же преобразует ответ из ATA в SCSI2. Это если от винчестера что-то надо. При команде аналогичной IDENTIFY_DEVICE обычно к диску вообще команда не доходит, а контроллер возвращает что-то типа USB2IDE Controller, размер диска татой-то.
cppasm можно поконкретней, например ссылки на инфу.. Насколько я понял из всего сказанного необходимо обращаться к внешнему жёсткому диску как к scsi устройству, но опять таки все попытки послать команды через DeviceIoControl (..., SCSI_PASS_THROUGH,...) успехом не увенчались.. ?SCSI2 завёрнутые в USB Mass Storage?
Я подробнее не знаю как под Win это делать, я под DOS драйвер для USB Flash/HDD писал. А по поводу протокола - описание есть тут: http://www.usb.org/developers/devclass_docs Раздел Mass Storage, а конкретно Mass Storage Bulk Only 1.0 Но это очень низкий уровень, может в Win по-проще можно...