Приветствую воинов дзена! Возникла такая проблема, купил новый винт в ноутбук размером 64гб (до этого стоял 60гб), а он, зараза такая, не определяется в биосе Всякие способы, зажимать HPA, бить на разделы, ни к чему не приводят. Диск рабочий, успешно определяется тулзами типа MHDD, HDAT2, на него даже можно установить виндовс, только вот загрузиться не получится... Как единственный выход из ситуации, я решил пропатчить биос, просто тупо сказать ему что винт установлен и грузиться нужно с него. Вобщем распаковал и биос на составляющие модули, и в одном месте нашел похожее место на определение параметров винта, а именно посыл команды: IDENTIFY DEVICE - ECh. А вот что дальше делать, не знаю, скилов моих не хватает. Видимо полученный буфер от винта анализируется в другом модуле и это место я уже найти не могу... В атаче лежат распакованные модули, функция определение находится в файле F0_User_Defined_or_Reserved.bin смещение 15D В общем помогите кто чем может, в решении данной проблемы
mega_john Это похоже на процедуру чтения серийного нумера hdd (512 байт): Код (Text): seg000:015D sub_15D proc near seg000:015D pusha seg000:015E mov bx, dx seg000:0160 call wait_port_7 ; while(!(inportb(port+7)&0x40)); seg000:0163 jnb short loc_167 seg000:0165 jmp short not_ready seg000:0167 ; --------------------------------------------------------------------------- seg000:0167 ; outportb(port+6,0xA0+(drive<<4)); // ? seg000:0167 seg000:0167 loc_167: ; CODE XREF: sub_15D+6j seg000:0167 add dx, 6 seg000:016A shl al, 4 seg000:016D out dx, al seg000:016E ; outportb(port+7,0xEC); seg000:016E mov dx, bx seg000:0170 add dx, 7 seg000:0173 mov al, 0ECh ; 'ý' seg000:0175 out dx, al seg000:0176 mov cx, 1000 seg000:0179 call delay_cx seg000:017C ; while(!(inportb(port+7)&0x48)); seg000:017C mov dx, bx seg000:017E call sub_22E seg000:0181 jb short not_ready seg000:0183 call sub_280 seg000:0186 mov cx, 100h seg000:0189 mov dx, bx seg000:018B add dx, 0 seg000:018E cld seg000:018F mov di, offset hdd_serial_num? seg000:0192 rep insw seg000:0194 test ds:hdd_serial_num?, 80h seg000:0199 jnz short loc_19E
mega_john Собственно, я сказал очевидное - вы и так это написали. Имхо проблемы могут быть из-за задержек (через loop), но это так. Кусок кода можно загрузить в отладчик/etc и посмотреть как он отрабатывает.
Вы меня видимо не верно поняли в этой функции мы получаем информацию о диске, его геометрию, название, итд, а не только серийник. Дальше где-то эта информация обрабатывается и на экран выводится список найденных дисков, их размер, итд... скорее всего при обработке этих данных возникает переполнение либо деление на 0. Вариантов решения может быть несколько, править эту таблицу(например указать размер диска 60гб, и по идее должно прокатить), править функцию расчета геометрии, или вообще ничего не расчитывать, а просто указать биосу что диск есть. Только вот у меня проблема найти эти места. Я даже не уверен, что пошел правильным путем...(((
mega_john Ну исправить нулевой сектор не так то просто. Тут проще найти нужно место в коде и поправить.
mega_john Ну я не сильно разбираюсь в hdd Ж) Тем не менее: В указанной процедуре я нашел следующее: Предположив что это смещение в текущем сегменте (кода) буфера для серийного номера (512) далее просто ищем (в IDA - ec 22 байты) и находим кучку ссылок: Код (Text): seg000:00B4 hdd_serial_ofs dw 22ECh ; DATA XREF ... ... seg000:4A90 mov bx, offset hdd_serial_num? ... seg000:4AAA mov si, offset hdd_serial_num? ... seg000:4B55 mov bx, offset hdd_serial_num? seg000:4B58 cmp dword ptr [bx+1FEh], 0AA55h ... hdd_serial_ofs Наверное будет также интересен - тем более что на него есть ссылки. Также еще раз повторю свой савет исполнить этот код загрузившись с дискетки
PSR1257 Врятли бы производитель ноутов лепил бы в них "уникальный" образ биоса. Хотя всякое может быть ....
T800 Я даже не понял о чем вы Я лишь (вроде так) нашел этот буфер обмена и несколько ссылок на него. Команда по смещению 4B58 говорит о том, что буфер может быть использован для нулевого сектора а не только как "серийный номер hdd" (я так называю то, что читается в самой первой процедуре - insw - 512 байт).
T800 так я о том и говорю, что нужно править биос! какой смысл править сектор, если биос считает что винта нет? PSR1257 спасибо за савет обязательно воспользуюсь но меня до сих пор смущает данный модуль, если на него посмотреть в хекс едиторе, то будет видно, что он сильно похож на rom прошиватель, а не на инициализатор дисков...
mega_john Ну раз спасибо то вот еще один (последний пока) савет: поискав три байтика - B0 EC EE - которые кодируют команду mov al,0ECh, out dx,al - по всем данным модулям - я нашел его только в одном (еще) модуле: Судя по строчкам в первом модуле действительно похоже на 'BIOS ROM Crisis Recovery Utility V1.15'. Sorr за банальные саветы - мне просто любопытна
да мне самому любопытно забороть эту проблему, даже очень) как видно из названия данного модуля, это архив, распакованный лежит в аттаче данные байтики находятся в файле _1B_component_04h, а тут возникает такая проблема(для меня) все эти файлики погружаются по разным сегментам/смещениям, откуда их брать мне непонятно... так что где считывается IDENTIFY DEVICE data я найти не могу
Попробуй спросить еще на http://www.rom.by/ . Также ради интереса можно натравить их биоспатчер на этот биос и посмотреть что скажет.
mega_john Ну вот там чуть ниже вроде есть чтение: Код (Text): seg000:180E rep insw Код если пишеца одним челом - то пишеца примерно одинаково, так что у вас уже есть one swatch (первый модуль). Не совсем понимаю как вы так достали все эти куски. Наверное они идут в памяти друг за другом и скорее всего они из сегмента F000. Почему вы не сдампили сразу весь BIOS (с памяти?) - с адресов C0000 и до самого верха? Если умудрится сказать IDA с какого адреса все это реально сидит то вообще красота будет. Попозже может еще посмотрю...
BLiTZ Спасибо за совет, но без преувеличения могу сказать, что перерыл весь интернет в поисках решения своей проблемы. Патчер который там присутствует, не умеет работать с биосом 8-й версии. PSR1257 Да боюсь биос на столько сложная весч, что пишется далеко не одним человеком. Все эти куски распакованы спец тулзами из образа для прошивки, так что как оно выглядит в памяти, я не имею представления...
прошу прощения за долгое отсутствие... если желание еще не пропало, то вот отчет эвереста по PCI устройствам