當需要在已安裝 Windows 2000/XP 的電腦上再安裝 Windows 98/DOS 等舊版系統時,原有的 NTLDR 無法識別較舊的系統。第三方工具(BootMagic, System Commander)透過將硬碟分割為多個主分區(多「C」盤),修改 MBR 分區表的啟動標誌位實現多重引導。本文深入剖析其核心原理,並提供完整的組合語言實作程式碼。
| 區域 | 大小 | 說明 |
|---|---|---|
| 主引導扇區 (MBR) | 1 扇區 (512 位元組) | 偏移 00H-1BDH: MBR 程式碼 (446 bytes) 偏移 1BEH-1FDH: 分區表 (64 bytes, 4 項 × 16 bytes) 偏移 1FEH-1FFH: 結束標誌 55AAh |
| 主分區引導扇區 | 1 扇區 | 各主分區第一扇區 |
| FAT/根目錄/資料區 | 依分區大小 | 檔案系統資料 |
| 擴展分區表/邏輯分區 | 鏈結結構 | 超過 4 分區時使用 |
| 偏移 | 大小 | 含義 |
|---|---|---|
| 00H | 1 byte | 啟動標誌:80h=可啟動, 00h=不可啟動 |
| 01H | 1 byte | 起始磁頭號 |
| 02H | 1 byte | 高 2 位=起始柱面高位, 低 6 位=起始扇區號 |
| 03H | 1 byte | 起始柱面低位 |
| 04H | 1 byte | 系統標誌:04h=FAT16, 0Bh=FAT32, 07h=NTFS, 83h=Linux, 05h/0Fh=擴展分區 |
| 05H-07H | 3 bytes | 結束磁頭/柱面/扇區 (同起始格式) |
| 08H-0BH | 4 bytes | LBA 起始扇區號 |
| 0CH-0FH | 4 bytes | 總扇區數 |
只需修改分區表項目偏移 00H 的啟動標誌位:將欲啟動分區的標誌設為 80h,其餘設為 00h。BIOS 讀取 MBR 後,會將控制權移交給標誌為 80h 的分區引導扇區。
SYSGUIDE.DAT,寫入 0 磁道 0 柱面 1 扇區)SYSGUIDE.EXE,DOS/Windows 下執行)SYSGUIDE.DAT 寫入 MBR; 讀取分區表至 0000:1000h
mov ax,0201h; mov cx,0001h; mov dx,0080h; mov bx,1000h; int 13h
; 讀取原 MBR 備份至 0000:7C00h
mov ax,0201h; mov cx,0006h; mov dx,0080h; mov bx,7c00h; int 13h
readkey:
mov ah,00h; int 16h
cmp al,'1'; je number1
cmp al,'2'; je number2
cmp al,'3'; je number3
cmp al,'4'; je number4
jmp readkey
number1: ; 選擇分區 1
mov al,[11c2h] ; 讀取分區 1 系統標誌 (偏移 1BEh+4)
cmp al,00h; je error1
cmp al,05h; je error1
cmp al,0fh; je error1
mov ah,80h
mov [11beh],ah ; 分區 1 標誌=80h
mov [11ceh],00h ; 分區 2 標誌=00h
mov [11deh],00h ; 分區 3 標誌=00h
mov [11eeh],00h ; 分區 4 標誌=00h
jmp ok
; number2/3/4 類似,修改對應偏移
ok:
; 寫回修改後的分區表到 MBR (0,0,1) 和備份 (0,0,6)
mov ax,0301h; mov cx,0001h; mov dx,0080h; mov bx,1000h; int 13h
mov cx,0040h; mov di,7dbeh; mov si,11beh; repnz movsw ; 複製分區表到備份區
mov ax,0301h; mov cx,0006h; mov dx,0080h; mov bx,7c00h; int 13h
; 跳轉執行原 MBR
mov bx,7c00h; jmp bx
GUIDE.EXE (切勿直接執行)SYSGUIDE.DAT:
DEBUG GUIDE.EXE
-R CX
-1BD
-N SYSGUIDE.DAT
-W
-Q
SYSGUIDE.EXESYSGUIDE.DAT 和 SYSGUIDE.EXE 放同目錄SYSGUIDE.EXE 選 1 安裝分區表項目偏移 04H 的系統標誌位 (04h/0Bh/07h/83h...) 即可識別檔案系統類型。讀取此位元組,配合分區大小、位置,即可在選單顯示「Windows XP (NTFS)」、「Windows 98 (FAT32)」、「Linux (Ext2)」等友善名稱,而非單調的「分區 1/2/3/4」。