Вот чё получилось, скажу сразу асм я знаю на уровне Z-80, так что силно не пинайте, но суть похоже такая.
1. Ищется $GAFR в последнем секторе. Если нашли то берётся адрес на винте начала образа и
2. Начинается попытка распаковать сохранённый на винте образ. Если не получилось - то никакого авторековери...
3. Если распаковалось - то сравнивается версия. Если она совпала с той, что прописана во флэшке - то начинается восстановление.
HPA начиная с 117302879 сектора.
Вот последний сектор на HDD у GA-8IPE1000 Rev. 3.1, BIOS 8ipekg.f5 :
где видно в смещении 0x01Ah байты 06 FD E6 5F что в десятичной с/с будет ровно 117302879 т.е. начало образа BIOS.
Вторая строчка в смещении 0x100h точная копия версии из самого БИОСА.
Вот бут от GA-8IPE1000MK BIOS pe1000mk.f13 :
;--------------------------------------------------------------------------------------
F000:EFDC ; _______________ S U B R O U T I N E _______________________________________
F000:EFDC
F000:EFDC
F000:EFDC sub_FEFDC proc near ; CODE XREF: F000:ED25p
F000:EFDC mov byte ptr cs:word_FED3E, 1
F000:EFE2 call Copy_ROM ; Предположительно распаковка образа с ROM в RAM
F000:EFE5 jb locret_FEFEA ; Если не смогли пральна распаковать BIOS
F000:EFE7 call Find_$GAFR ; вызываем рековери
F000:EFEA
F000:EFEA locret_FEFEA: ; CODE XREF: sub_FEFDC+9j
F000:EFEA retn ; Return Near from Procedure
F000:EFEA sub_FEFDC endp
F000:EFEA
F000:EFEB
Собсно основной поиск на винте...
F000:F060 ; _______________ S U B R O U T I N E _______________________________________
F000:F060
F000:F060
F000:F060 Find_$GAFR proc near ; CODE XREF: sub_FEFDC+Bp
F000:F060 push ds
F000:F061 push es
F000:F062 mov bx, 0
F000:F065
F000:F065 loc_FF065: ; DATA XREF: F000:F86Fr
F000:F065 ; F000:F874w ...
F000:F065 call Compare_$GAFR ; Ищем адрес "$GAFR" на HDD
F000:F068 jnz NO_$GAFR ; Выходим если не нашли
F000:F06A mov eax, es:[bx+1Ah]; Иначе берём адрес начала образа BIOS на HDD
F000:F06F mov edx, es:[bx+1Eh]; это непонятно, т.к. по смещению 1Eh только 00
F000:F074 mov cs:dword_FED40, eax
F000:F079 mov cs:dword_FED44, edx
F000:F07F mov ax, 200h
F000:F082 mov cs:word_FED3C, ax
F000:F086 mov cx, 40h
F000:F089
F000:F089 loc_FF089: ; CODE XREF: Find_$GAFR+4Bj
F000:F089 mov cs:word_FED3E, 8
F000:F090 call Copy_ROM ; Предположительно распаковка образа с HDD в RAM
F000:F093 jb NO_$GAFR ; Выходим если не смогли пральна распаковать BIOS
F000:F095 mov ax, es
F000:F097 add ax, 100h ; Add
F000:F09A mov es, ax
F000:F09C assume es:nothing
F000:F09C add cs:dword_FED40, 8 ; Add
F000:F0A3 jnb loc_FF0AB ; Jump if Not Below (CF=0)
F000:F0A5 inc cs:dword_FED44 ; Increment by 1
F000:F0AB
F000:F0AB loc_FF0AB: ; CODE XREF: Find_$GAFR+43j
F000:F0AB loop loc_FF089 ; Предположительно возвращаемся на распаковку слещего модуля
F000:F0AD call Compare_Version ; Проверка БИОС для этой мамки или нет
F000:F0B0 jnz NO_$GAFR ; Jump if Not Zero (ZF=0)
F000:F0B2 clc ; Clear Carry Flag
F000:F0B3 jmp short Find_Exit ; Начинаем упешно восстанавливать
F000:F0B5
F000:F0B5 NO_$GAFR: ; CODE XREF: Find_$GAFR+8j
F000:F0B5 ; Find_$GAFR+33j ...
F000:F0B5 stc ; Образ не наш, не нашли или повреждён
F000:F0B6
F000:F0B6 Find_Exit: ; CODE XREF: Find_$GAFR+53j
F000:F0B6 pop es
F000:F0B7 assume es:nothing
F000:F0B7 pop ds
F000:F0B8 assume ds:nothing
F000:F0B8 retn ; Return Near from Procedure
F000:F0B8 Find_$GAFR endp
F000:F0B8
F000:F0B9
F000:F0B9 ; _______________ S U B R O U T I N E _______________________________________
F000:F0B9
F000:F0B9
F000:F0B9 Compare_Version proc near ; CODE XREF: Find_$GAFR+4Dp
F000:F0B9 mov cx, cs:word_FED3C
F000:F0BE shl cx, 5 ; Shift Logical Left
F000:F0C1 add cx, 2000h ; Add
F000:F0C5 sub ch, 10h ; Integer Subtraction
F000:F0C8 mov es, cx
F000:F0CA mov cx, cs
F000:F0CC mov ds, cx
F000:F0CE assume ds:seg000
F000:F0CE mov si, offset a6a79zg08 ; "6A79ZG08"
F000:F0D1 mov di, si
F000:F0D3 mov cx, 8
F000:F0D6 repe cmpsb ; Compare Strings
F000:F0D8 retn ; Return Near from Procedure
F000:F0D8 Compare_Version endp
F000:F0D8
F000:F0D8 ; ---------------------------------------------------------------------------
F000:F0D9 aGafr db '$GAFR' ; DATA XREF: Compare_$GAFR+2o
F000:F0DE
F000:F0DE ; _______________ S U B R O U T I N E _______________________________________
F000:F0DE
F000:F0DE
F000:F0DE Compare_$GAFR proc near ; CODE XREF: Find_$GAFR+5p
F000:F0DE mov di, bx
F000:F0E0 mov si, offset aGafr ; "$GAFR"
F000:F0E3 mov cx, 5
F000:F0E6 repe cmpsb ; Compare Strings
F000:F0E8 retn ; Return Near from Procedure
F000:F0E8 Compare_$GAFR endp
F000:F0E8
Ну и по ходу, пара процедур связанных с флэшкой и выводом сообщений об авторековери:
F000:F0E9
F000:F0E9 ; _______________ S U B R O U T I N E _______________________________________
F000:F0E9
F000:F0E9
F000:F0E9 Flash_ID proc near ; CODE XREF: F000:ED2Ap
F000:F0E9 xor ax, ax ; Logical Exclusive OR
F000:F0EB mov ds, ax
F000:F0ED assume ds:nothing
F000:F0ED mov es, ax
F000:F0EF assume es:nothing
F000:F0EF mov ax, ds:0FFBC0000h
F000:F0F5 call FlashID_Comp ; Call Procedure
F000:F0F8 jnb AutoRecovery ; Jump if Not Below (CF=0)
F000:F0FA mov esi, 0FFFF0000h
F000:F100 mov byte ptr [esi+5555h], 0AAh
F000:F108 mov byte ptr [esi+2AAAh], 55h
F000:F110 mov byte ptr [esi+5555h], 0F0h ; Software ID Exit
F000:F118 call Flash_IO ; Call Procedure
F000:F11B mov byte ptr [esi+5555h], 0AAh
F000:F123 mov byte ptr [esi+2AAAh], 55h
F000:F12B mov byte ptr [esi+5555h], 90h ; Software ID Entry
F000:F133 call Flash_IO ; Call Procedure
F000:F136 mov ax, [esi]
F000:F139 mov byte ptr [esi+5555h], 0AAh
F000:F141 mov byte ptr [esi+2AAAh], 55h
F000:F149 mov byte ptr [esi+5555h], 0F0h ; Software ID Exit
F000:F151 call FlashID_Comp ; Call Procedure
F000:F154 jnb AutoRecovery ; Jump if Not Below (CF=0)
F000:F156 lea ax, ds:aUnknownFlashMe ; "Unknown Flash Memory !"
F000:F15A mov cx, 16h
F000:F15D nop ; No Operation
F000:F15E mov dx, 0FF02h
F000:F161 call VideoOut ; Call Procedure
F000:F164 jmp short Flash_ID_Retn ; Jump
F000:F166
F000:F166 AutoRecovery: ; CODE XREF: Flash_ID+Fj
F000:F166 ; Flash_ID+6Bj
F000:F166 mov al, 52h
F000:F168 out 80h, al ; manufacture's diagnostic checkpoint
F000:F16A lea ax, ds:aBiosAutoRecove ; "BIOS Auto-Recovering "
F000:F16E mov cx, 15h
F000:F171 nop ; No Operation
F000:F172 mov dx, 0FF02h
F000:F175 call VideoOut ; Call Procedure
F000:F178
F000:F178 loc_FF178: ; CODE XREF: Flash_ID+95j
F000:F178 mov ax, cs:word_FF33F
F000:F17C call ax ; Indirect Call Near Procedure
F000:F17E jb loc_FF178 ; Jump if Below (CF=1)
F000:F180 mov al, 53h
F000:F182 out 80h, al ; manufacture's diagnostic checkpoint
F000:F184
F000:F184 Flash_ID_Retn: ; CODE XREF: Flash_ID+7Bj
F000:F184 retn ; Return Near from Procedure
F000:F184 Flash_ID endp
F000:F184
F000:F184 ; ---------------------------------------------------------------------------
F000:F185 aBiosAutoRecove db 'BIOS Auto-Recovering ' ; DATA XREF: Flash_ID+81t
F000:F19A a_scanningBiosI db '.Scanning BIOS Image in Hard Drive ...'
F000:F19A ; DATA XREF: F000:F1DCt
F000:F1C0 ; ---------------------------------------------------------------------------
F000:F1C0
F000:F1C0 ScaningHD: ; CODE XREF: F000:F206p
F000:F1C0 pushad ; Push all General Registers (use32)
F000:F1C2 mov ebx, esi
F000:F1C5 sub ebx, 20000h ; Integer Subtraction
F000:F1CC mov eax, ebx
F000:F1CF and bx, 3FFFh ; Logical AND
F000:F1D3 jnz NoScan_Retn ; Jump if Not Zero (ZF=0)
F000:F1D5 shr eax, 0Eh ; Shift Logical Right
F000:F1D9 inc ax ; Increment by 1
F000:F1DA out 80h, al ; manufacture's diagnostic checkpoint
F000:F1DC lea ax, ds:a_scanningBiosI ; ".Scanning BIOS Image in Hard Drive ..."
F000:F1E0 mov cx, 1
F000:F1E3 mov dx, 0FE01h
F000:F1E6 call VideoOut ; Call Procedure
F000:F1E9
F000:F1E9 NoScan_Retn: ; CODE XREF: F000:F1D3j
F000:F1E9 popad ; Pop all General Registers (use32)
F000:F1EB retn ; Return Near from Procedure
F000:F1EC ; ---------------------------------------------------------------------------
F000:F1EC mov esi, 20000h
F000:F1F2 mov edi, 0FFF00000h
F000:F1F8 mov edx, 0C0000h
F000:F1FE mov bx, 40h
F000:F201
F000:F201 loc_FF201: ; CODE XREF: F000:F21Dj
F000:F201 call Erase_Sector ; Call Procedure
F000:F204 jb Prog_Err ; Jump if Below (CF=1)
F000:F206 call ScaningHD ; Call Procedure
F000:F209 mov ecx, 1000h
F000:F20F
F000:F20F loc_FF20F: ; CODE XREF: F000:F21Aj
F000:F20F call Prog_Byte ; Call Procedure
F000:F212 jb Prog_Err ; Jump if Below (CF=1)
F000:F214 inc edx ; Increment by 1
F000:F216 inc esi ; Increment by 1
F000:F218 dec ecx ; Decrement by 1
F000:F21A jnz loc_FF20F ; Jump if Not Zero (ZF=0)
F000:F21C dec bx ; Decrement by 1
F000:F21D jnz loc_FF201 ; Jump if Not Zero (ZF=0)
F000:F21F clc ; Clear Carry Flag
F000:F220 retn ; Return Near from Procedure
F000:F221
F000:F221
F000:F221 Prog_Err: ; CODE XREF: F000:F204j
F000:F221 ; F000:F212j
F000:F221 stc ; Set Carry Flag
F000:F222 retn ; Return Near from Procedure
F000:F223
F000:F223 ; _______________ S U B R O U T I N E _______________________________________
F000:F223
F000:F223
F000:F223 Erase_Sector proc near ; CODE XREF: F000:F201p
F000:F223 push edi
F000:F225 call sub_FF27C ; Call Procedure
F000:F228 mov byte ptr es:[edi+0F5555h], 0AAh
F000:F231 mov byte ptr es:[edi+0F2AAAh], 55h
F000:F23A mov byte ptr es:[edi+0F5555h], 80h
F000:F243 mov byte ptr es:[edi+0F5555h], 0AAh
F000:F24C mov byte ptr es:[edi+0F2AAAh], 55h
F000:F255 add edi, edx ; Add
F000:F258 mov byte ptr es:[edi], 30h ; Sector-Erase
F000:F25D call Flash_IO ; Call Procedure
F000:F260 call Flash_IO ; Call Procedure
F000:F263 call Flash_IO ; Call Procedure
F000:F266 call sub_FF2E6 ; Call Procedure
F000:F269 mov ax, es:[edi]
F000:F26D out 0EBh, al
F000:F26F cmp ax, 0FFFFh ; Compare Two Operands
F000:F272 jnz loc_FF278 ; Jump if Not Zero (ZF=0)
F000:F274 pop edi
F000:F276 clc ; Clear Carry Flag
F000:F277 retn ; Return Near from Procedure
F000:F278
F000:F278 loc_FF278: ; CODE XREF: Erase_Sector+4Fj
F000:F278 pop edi
F000:F27A stc ; Set Carry Flag
F000:F27B retn ; Return Near from Procedure
F000:F27B Erase_Sector endp
F000:F27B
F000:F27C
F000:F27C ; _______________ S U B R O U T I N E _______________________________________
F000:F27C
F000:F27C
F000:F27C sub_FF27C proc near ; CODE XREF: Erase_Sector+2p
F000:F27C push edi
F000:F27E push ax
F000:F27F add edi, edx ; Add
F000:F282 and edi, 0FF000h ; Logical AND
F000:F289 or edi, 0FFB00002h ; Logical Inclusive OR
F000:F290 xor al, al ; Logical Exclusive OR
F000:F292 mov es:[edi], al
F000:F296 out 0EBh, al
F000:F298 pop ax
F000:F299 pop edi
F000:F29B retn ; Return Near from Procedure
F000:F29B sub_FF27C endp
F000:F29B
F000:F29C
F000:F29C ; _______________ S U B R O U T I N E _______________________________________
F000:F29C
F000:F29C
F000:F29C Prog_Byte proc near ; CODE XREF: F000:F20Fp
F000:F29C pushad ; Push all General Registers (use32)
F000:F29E mov cx, 3E7h
F000:F2A1
F000:F2A1 loc_FF2A1: ; CODE XREF: Prog_Byte+41j
F000:F2A1 push edi
F000:F2A3 mov byte ptr es:[edi+0F5555h], 0AAh
F000:F2AC mov byte ptr es:[edi+0F2AAAh], 55h
F000:F2B5 mov byte ptr es:[edi+0F5555h], 0A0h ; Byte-Program
F000:F2BE add edi, edx ; Add
F000:F2C1 mov al, [esi]
F000:F2C4 mov es:[edi], al
F000:F2C8 push cx
F000:F2C9 call sub_FF2E6 ; Call Procedure
F000:F2CC pop cx
F000:F2CD mov ah, es:[edi]
F000:F2D1 pop edi
F000:F2D3 mov al, [esi]
F000:F2D6 out 0EBh, al
F000:F2D8 cmp al, ah ; Compare Two Operands
F000:F2DA jz loc_FF2E2 ; Jump if Zero (ZF=1)
F000:F2DC dec cx ; Decrement by 1
F000:F2DD jnz loc_FF2A1 ; Jump if Not Zero (ZF=0)
F000:F2DF stc ; Set Carry Flag
F000:F2E0 jmp short loc_FF2E3 ; Jump
F000:F2E2
F000:F2E2
F000:F2E2 loc_FF2E2: ; CODE XREF: Prog_Byte+3Ej
F000:F2E2 clc ; Clear Carry Flag
F000:F2E3
F000:F2E3 loc_FF2E3: ; CODE XREF: Prog_Byte+44j
F000:F2E3 popad ; Pop all General Registers (use32)
F000:F2E5 retn ; Return Near from Procedure
F000:F2E5 Prog_Byte endp
F000:F2E5
F000:F2E6
;--------------------------------------------------------------------------------------
А вот тут можно опредиль какие типы флэшки поддерживает данный БИОС - часто справшивают, какую ставить
Вот чё получилось, скажу сразу асм я знаю на уровне Z-80, так что силно не пинайте, но суть похоже такая.
1. Ищется $GAFR в последнем секторе. Если нашли то берётся адрес на винте начала образа и
2. Начинается попытка распаковать сохранённый на винте образ. Если не получилось - то никакого авторековери...
3. Если распаковалось - то сравнивается версия. Если она совпала с той, что прописана во флэшке - то начинается восстановление.
HPA начиная с 117302879 сектора.
Вот последний сектор на HDD у GA-8IPE1000 Rev. 3.1, BIOS 8ipekg.f5 :
где видно в смещении 0x01Ah байты 06 FD E6 5F что в десятичной с/с будет ровно 117302879 т.е. начало образа BIOS.
Вторая строчка в смещении 0x100h точная копия версии из самого БИОСА.
Вот бут от GA-8IPE1000MK BIOS pe1000mk.f13 :
Собсно основной поиск на винте...
Ну и по ходу, пара процедур связанных с флэшкой и выводом сообщений об авторековери:
А вот тут можно опредиль какие типы флэшки поддерживает данный БИОС - часто справшивают, какую ставить