Есть БИОС на базе Award для гигабайтовской материнской платы и есть желание его поредактировать.
Но видимо есть какие-то особенности подсчета контрольных сум, которые не учитываются cbrom 1.95 - Q-Flash ругается на собранный образ "Invalid BIOS Image".
Был проведен следующий эксперимент.
Взят оригинальный биос:
gigabyte.com.tw/Support/Motherboard/BIOS_DownloadFile.aspx?FileType=BIOS&F...
Вот "листинг" этого файла:
>CBROM195.exe MA78GUD3.F4 /D CBROM195.exe V1.95 [12/14/07] (C)Phoenix Technologies 2001-2007 ******** MA78GUD3.F4 BIOS component ******** No. Item-Name Original-Size Compressed-Size Original-File-Name ================================================================================ 0. System BIOS 20000h(128.00K) 12B9Bh(74.90K) MA78GUD3.BIN 1. XGROUP CODE 0E3E0h(56.97K) 09D4Dh(39.33K) awardext.rom 2. ACPI table 069E8h(26.48K) 030BEh(12.19K) ACPITBL.BIN 3. EPA LOGO 0168Ch(5.64K) 0030Dh(0.76K) AwardBmp.bmp 4. GROUP ROM[18] 041C0h(16.44K) 02C40h(11.06K) ggroup.bin 5. GROUP ROM[20] 02640h(9.56K) 01BE4h(6.97K) ffgroup.bin 6. YGROUP ROM 0B950h(46.33K) 06005h(24.00K) awardeyt.rom 7. GROUP ROM[22] 0F630h(61.55K) 008B5h(2.18K) tgroup.bin 8. GROUP ROM[23] 0F630h(61.55K) 0015Bh(0.34K) t1group.bin 9. GROUP ROM[24] 0F630h(61.55K) 0015Ch(0.34K) t2group.bin 10. GROUP ROM[ 0] 073B0h(28.92K) 02E72h(11.61K) _EN_CODE.BIN 11. VGA ROM[1] 0EA00h(58.50K) 094CFh(37.20K) VGA_DVI.BIN 12. OEM6 CODE 0EA00h(58.50K) 094D0h(37.20K) VGA_HDMI.BIN 13. OEM1 CODE 0C800h(50.00K) 07BDBh(30.96K) UI.BIN 14. PCI ROM[A] 0FC00h(63.00K) 09CBDh(39.18K) SATARAID.BIN 15. PCI ROM[B] 03600h(13.50K) 02427h(9.04K) ahci.BIN 16. OEM3 CODE 0C000h(48.00K) 0704Ch(28.07K) ahci.DLL 17. PCI ROM[C] 0C800h(50.00K) 079FDh(30.50K) rtegrom.lom 18. LOGO1 ROM 00B64h(2.85K) 00520h(1.28K) DBIOS.BMP 19. OEM0 CODE 03006h(12.01K) 022A6h(8.66K) SBF.BIN 20. GV3 08E73h(35.61K) 02FF0h(11.98K) AGESACPU.ROM 21. MINIT 19801h(102.00K) 1982Bh(102.04K) MEMINIT.BIN 22. HTINIT 05011h(20.02K) 05040h(20.06K) HT.DLL 23. 2 PE32 in MB 00550h(1.33K) 005CFh(1.45K) HT32GATE.BIN 24. LOGO BitMap 4B30Ch(300.76K) 0EA1Dh(58.53K) UD3_D.bmp (SP) NCPUCODE 05800h(22.00K) 05800h(22.00K) NCPUCODE.BIN Total compress code space = E2000h(904.00K) Total compressed code size = 9B78Eh(621.89K) Remain compress code space = 46892h(282.14K) ** Micro Code Information ** Bridge ID | Bridge ID North South Update ID CPUID | North South Update ID CPUID ---------------------------------------+---------------------------------------- C0012102 0401 | 1000002 0|
С помощью cbrom 1.95 были сначал extract-нуты, а потом release-нуты модуль MEMINIT.BIN и все идущие после него (MEMINIT.BIN, HT.DLL, HT32GATE.BIN, UD3_D.bmp)
Потом все эти модули были добавлены назад в том же порядке.
Листинг результирующего файла оказался точно таким же как и у изначального.
Потом были сделаны дампы обоих файлов и сравнены.
Оказалось, что есть определенные различия.
Причем похоже они в полях, где хранятся LHA контрольные суммы.
А также есть разница в выравнивании содержимого модуля HT32GATE.BIN - если CBROM195 выровнял начало к ближайшему адресу кратному 16, то у изначального файла выравнивание было 4K.
Измененный файл можно найти здесь:
icyb.net.ua/~avg/MA78GUD3.F41
Вот начальная часть diff-а между дампами:
--- MA78GUD3.F4.hd 2009-09-03 19:53:43.316258641 +0300 +++ MA78GUD3.F41.hd 2009-09-04 11:52:47.820313604 +0300 @@ -26727,9 +26727,9 @@ 000686e0 86 b1 f9 39 f4 da a2 14 c4 b9 59 d2 2d d8 ac 02 |...9......Y.-...| 000686f0 74 7a 8e de eb 29 b5 f2 dd 25 c6 6f 64 be 11 1b |tz...)...%.od...| 00068700 04 b9 ca 25 c6 6b e4 65 27 ed da fd d9 77 81 71 |...%.k.e'....w.q| -00068710 37 24 5c bb ca b0 00 24 4c 2d 6c 68 30 2d 04 98 |7$\....$L-lh0-..| +00068710 37 24 5c bb ca b0 00 24 f9 2d 6c 68 30 2d 04 98 |7$\....$.-lh0-..| 00068720 01 00 01 98 01 00 00 00 69 40 20 01 0b 4d 45 4d |........i@ ..MEM| -00068730 49 4e 49 54 2e 42 49 4e 18 8d 20 03 00 00 00 00 |INIT.BIN.. .....| +00068730 49 4e 49 54 2e 42 49 4e 34 1e 20 03 00 00 00 00 |INIT.BIN4. .....| 00068740 4d 5a 2e 00 76 00 00 00 20 00 00 00 ff ff 00 00 |MZ..v... .......| 00068750 00 00 1a 2c 00 00 00 00 1e 00 00 00 01 00 00 00 |...,............| 00068760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| @@ -33202,8 +33202,8 @@ 00081f10 1c 30 24 30 2c 30 34 30 3c 30 4c 32 50 32 58 32 |.0$0,040<0L2P2X2| 00081f20 64 32 70 32 7c 32 88 32 94 32 00 00 00 00 00 00 |d2p2|2.2.2......| 00081f30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00081f40 60 ff 1f 5c 2d 6c 68 30 2d 1e 50 00 00 11 50 00 |`..\-lh0-.P...P.| -00081f50 00 00 00 7a 40 20 01 06 48 54 2e 44 4c 4c 06 75 |...z@ ..HT.DLL.u| +00081f40 60 ff 1f cc 2d 6c 68 30 2d 1e 50 00 00 11 50 00 |`...-lh0-.P...P.| +00081f50 00 00 00 7a 40 20 01 06 48 54 2e 44 4c 4c ea 01 |...z@ ..HT.DLL..| 00081f60 20 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ...............| 00081f70 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..............| 00081f80 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |........@.......| @@ -34483,3818 +34483,3816 @@ 00086f40 d7 33 de 33 e5 33 ec 33 f3 33 fa 33 01 34 08 34 |.3.3.3.3.3.3.4.4| 00086f50 0f 34 16 34 1d 34 24 34 2b 34 32 34 39 34 40 34 |.4.4.4$4+42494@4| 00086f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00086f80 9c ff 25 b3 2d 6c 68 30 2d a7 05 00 00 50 05 00 |..%.-lh0-....P..| +00086f70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7f |................| +00086f80 1d ff 25 13 2d 6c 68 30 2d 57 05 00 00 50 05 00 |..%.-lh0-W...P..| 00086f90 00 00 00 7c 40 20 01 0c 48 54 33 32 47 41 54 45 |...|@ ..HT32GATE| -00086fa0 2e 42 49 4e fe cd 20 57 00 00 00 00 00 00 00 00 |.BIN.. W........| -00086fb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00087000 4d 5a 4f 01 03 00 00 00 20 00 01 00 ff ff 00 00 |MZO..... .......| -00087010 00 00 97 13 00 00 00 00 1e 00 00 00 01 00 00 00 |................| -00087020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00087030 00 00 00 00 00 70 f8 ff 00 00 00 00 00 00 00 00 |.....p..........| -00087040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| +00086fa0 2e 42 49 4e 0b c0 20 07 00 00 00 00 00 00 00 00 |.BIN.. .........| +00086fb0 4d 5a 4f 01 03 00 00 00 20 00 01 00 ff ff 00 00 |MZO..... .......| +00086fc0 00 00 97 13 00 00 00 00 1e 00 00 00 01 00 00 00 |................| +00086fd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| +00086fe0 00 00 00 00 b0 6f f8 ff 00 00 00 00 00 00 00 00 |.....o..........| +00086ff0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
попробуйте старый добрый cbrom220 или cbrom207 только экстрактить придётся типа так
CBROM220.EXE ORIGINAL.ROM /OTHER 4078:0000 EXTRACT SLPKEY.BIN
цифры 4078 могут отличаться. может и вообще не увидеть каких-то модулей.
Дрессируем коров
CBROM V2.20 (C)Phoenix Technologies, Ltd 2001 All Rights Reserved.
******** ORIGINAL.ROM BIOS component ********
No. Item-Name Original-Size Compressed-Size Original-File-Name
===============================================================================
0. System BIOS 20000h(128.00K) 12B9Bh(74.90K) MA78GUD3.BIN
1. XGROUP CODE 0E3E0h(56.97K) 09D4Dh(39.33K) awardext.rom
2. ACPI table 069E8h(26.48K) 030BEh(12.19K) ACPITBL.BIN
3. EPA LOGO 0168Ch(5.64K) 0030Dh(0.76K) AwardBmp.bmp
4. GROUP ROM[18] 041C0h(16.44K) 02C40h(11.06K) ggroup.bin
5. GROUP ROM[20] 02640h(9.56K) 01BE4h(6.97K) ffgroup.bin
6. YGROUP ROM 0B950h(46.33K) 06005h(24.00K) awardeyt.rom
7. GROUP ROM[22] 0F630h(61.55K) 008B5h(2.18K) tgroup.bin
8. GROUP ROM[23] 0F630h(61.55K) 0015Bh(0.34K) t1group.bin
9. GROUP ROM[24] 0F630h(61.55K) 0015Ch(0.34K) t2group.bin
10. GROUP ROM[ 0] 073B0h(28.92K) 02E72h(11.61K) _EN_CODE.BIN
11. VGA ROM[1] 0EA00h(58.50K) 094CFh(37.20K) VGA_DVI.BIN
12. OEM6 CODE 0EA00h(58.50K) 094D0h(37.20K) VGA_HDMI.BIN
13. OEM1 CODE 0C800h(50.00K) 07BDBh(30.96K) UI.BIN
14. PCI ROM[A] 0FC00h(63.00K) 09CBDh(39.18K) SATARAID.BIN
15. PCI ROM[B] 03600h(13.50K) 02427h(9.04K) ahci.BIN
16. OEM3 CODE 0C000h(48.00K) 0704Ch(28.07K) ahci.DLL
17. PCI ROM[C] 0C800h(50.00K)079FDh(30.50K)rtegrom.lom
18. LOGO1 ROM 00B64h(2.85K)00520h(1.28K)DBIOS.BMP
19. OEM0 CODE 03006h(12.01K)022A6h(8.66K)SBF.BIN
20. Other(4067:0000) 08E73h(35.61K)02FF0h(11.98K)AGESACPU.ROM
21. Other(4069:0000) 19801h(102.00K)1982Bh(102.04K)MEMINIT.BIN
22. Other(407A:0000) 05011h(20.02K)05040h(20.06K)HT.DLL
23. Other(407C:0000) 00550h(1.33K)005CFh(1.45K)HT32GATE.BIN
24. LOGO BitMap 4B30Ch(300.76K)0EA1Dh(58.53K)UD3_D.bmp
Соответственно
MEMINIT.BIN 4069:0000
HT.DLL 407A:0000
HT32GATE.BIN 407C:0000
ну, а лого уже понятно.
Дрессируем коров
В том и проблема, что не понимает.
Например MEMINIT.BIN обязан быть в несжатом виде (lh0), а cbrom220 сжимает...
Вообще интересно - изначально в LH заголовке модуля meminit CRC-16 было 8D18, cbrom 195 посчитал 1E34, а lha говорит, что должно быть 3634. Где тут собака порылась?
Хмм, кажется в этом случае поле CRC-16 в заголовке LHA используется для других целей.
Эксперимент:
Руками изменил несколько байтов в теле MEMINIT.BIN.
После этого с помощью cbrom195 убрал и вернул последний модуль (logo), чтобы пересчитались общие контрольные суммы.
При этом значение в CRC-16 заголовка MEMINIT.BIN естественно не поменялось.
Полученый таким образом образ Q-Flash признал правильным. (Прошивать его я естественно не стал).
Таким образом я прихожу к выводу, что поле CRC-16 для этого модуля выполняет иную функцию.
Попутный вопрос: а что в образе биоса помечено повторяющейся последовательностью fe ff 00 00?
(область около килобайта размером)
Путем дизассемблирования бут-блока биоса были сделаны следующие наблюдения:
1. поле CRC-16 для "ранних" lh0 модулей похоже не играет никакой роли;
2. сумма байтов этих модулей должна быть ноль (только тело, без заголовка), это очень важно;
3. в коде есть метки "MEMINITENTRYPOINT" и "HTINITINENTRYPOINT", сразу после них находятся указатели на тела соответствующих модулей (для meminit прямо на начало MZ заголовка, для ht куда-то внутрь тела);
4. также рядом с HTINITINENTRYPOINT, по смещению F2E9D находится указатель на MZ-начало модуля HT32GATE
Под ранними модулями подразумевались как раз MEMINIT.BIN (4069), HT.DLL (407a), HT32GATE.BIN (407c).
Кстати, на каком-то китайском сайте есть cbrom 1.96.
Скачал, но еще не тестировал.
Поищите на оверах 1.98
Дрессируем коров
Отправить комментарий