Обмен данными с жестким диском производится через интерфейс IDE, SATA (или какой-либо другой) при помощи стандартизированных команд. Чтобы прочитать данные с диска достаточно использовать всего две команды: идентификации и, собственно, чтения. Первая нужна для получения размера диска и определения типа команды чтения, которая будет работать со всей поверхностью диска.
Если помните, то за историю своего существования жесткие диски преодолевали целый ряд ограничений емкости.
Некоторые из ограничений преодолевались добавлением новой команды чтения с адресом большей разрядности. Следовательно, из идентификации нужно узнать, какая команда чтения позволит получить доступ ко всей поверхности. Кроме стандартных команд, фирма-производитель дисков еще реализует и использует, так называемые, технологические команды. Их можно разделить на три больших класса:
-
информационные,
-
производственные,
-
диагностические.
Рассмотрим эти классы чуть более подробно.
Информационные команды позволяют получить более подробные (в сравнении со стандартом ATA) данные, например о том, из каких именно деталей собран диск, какие им заданы конфигурации и т. д.
Производственные команды выполняют настройку параметров, размечают/форматируют магнитную поверхность и т.д.
Диагностические используются для определения причины случившейся с диском неисправности. Это нужно фирме-производителю для изучения возвращенных по гарантии дисков.
Теперь попробуем нащупать у нашего подопытного признаки нестандартных технологических команд.
В прошлой части мы нашли и разбирали процедуру выдачи идентификации. В ней наблюдается вывод различного результата в зависимости от 7-ого бита некоего регистра byte_1A (на рисунке подсвечен желтым).
Ставим курсор на надпись byte_1A и нажимаем «x». Получаем список обращений к этому байту памяти:
Далее, просматриваем все инструкции изменяющие значения этого байта и ищем место, в котором устанавливается именно бит 7. Это инструкция по адресу ROM:86E0:
Называем это место «sx_set_factory_mode» и ищем откуда оно вызывается. А вот и место вызова:
Видно, что «sx_set_factory_mode» вызывается в случае, когда +4-ый байт команды равен 00, а +5 равен 0xE0. Тут я не рассказал, как именно мне удалось определить, что «ide_p4p5» содержит байты из параметров команды. Это не трудно установить, разбирая стандартные команды ATA примерно таким же способом, каким мы в прошлой заметке искали формирование сектора идентификации.
С параметрами команды более/менее ясно. Теперь, пробуем отыскать откуда вызывается эта часть, которую, забегая вперед, назовем «lc_cmd_E0_user».
Видно, что этот адрес вызывается не прямо из кода программы, а через таблицу адресов, которая обрабатывается в этой процедуре:
Видно, что таблица с адреса 56A4 вызывается если наш же искомый бит 7 = 0, а вот таблица 56C4, вызывается, когда бит 7 = 1.
Теперь попробуем определить, какой же код команды приводит к включению нашего бита? И тут нам везет! Если посмотреть, откуда вызывается функция формирования идентификации, то увидим это место:
И, оказывается, что вызов «lc_cmd_EC» идет из той же таблицы памяти (56C4)!
В инструкции «andb dword_1C, #0Fh» (в функции sx_parse_cmd_Ex) видно, что переход по таблице осуществляется по младшим 4-м битам и, что в списках адресов (56A4 и 56C4) чтение идентификации (команда 0xEC) находится на позиции 0x0C. Отсюда делаем вывод, что код нашей искомой команды = 0xE0.
Теперь проверим нашу догадку. Открываем ATA Commander и программируем команду:
Подаем ее. Диск ее выполняет без ошибки! Теперь читаем идентификацию и получаем результат:
Изменившиеся байты в сравнении с идентификацией с выключенным битом 7 подсвечены. Отсюда делаем вывод, что мы нашли, так называемую, команду «технологического ключа».
В следующих заметках темы «изобретаем жесткий диск» мы еще вернемся к разбору технологического режима.
Предыдущий пост серии:
Наконец-то новая часть! 🙂
P.S. У вас в комментах не работает логин через ВК, Яндекс и Гугл.