Windows 98 保留了大量 DOS 時代的核心資料結構,透過 DEBUG 工具與中斷呼叫(INT 21h AH=52h 取得 EMB)可直接檢視記憶體管理區塊 (MCB)、磁碟參數表 (DPT)、磁碟路徑表 (DPAT)、控制代碼參數區 (HPA/HPT) 等關鍵結構。本文詳細記錄實際除錯過程與資料解析,為理解 Win98 核心架構提供第一手資料。
呼叫 INT 21h AH=52h 後,ES:BX 指向 EMB。關鍵欄位偏移與含義:
| 偏移 | 欄位 | 範例值 | 說明 |
|---|---|---|---|
| 00h | First MCB | 0211:0000 | 第一個記憶體控制區塊位址 |
| 02h | FILES 鏈頭 | 00C9:00CC | 檔案控制代碼鏈表頭 |
| 06h | STDIN 裝置標題 | 0070:0016 | 標準輸入裝置驅動程式標題 |
| 0Ah | BUFFERS 鏈頭 | 00C9:006D | 磁碟緩衝區鏈表頭 |
| 0Eh | FCBS 鏈頭 | D2E7:0000 | FCB 控制區塊鏈表頭 |
| 12h | 邏輯磁碟機號 | 05 | 當前預設磁碟機 |
| 13h | 裝置驅動鏈頭 | D181:0000 | 字元/區塊裝置驅動程式鏈表 |
| 17h | DPT 鏈頭 | 00C9:1346 | 磁碟參數表鏈表頭 |
| 1Bh | STDOUT 裝置標題 | 0070:004C | 標準輸出裝置驅動程式標題 |
| 1Fh | 每緩衝區位元組 | 0200 | 扇區大小 (512 bytes) |
| 21h | DPAT 首址 | D597:0000 | 磁碟路徑表起始位址 |
| 25h | 最大 FCB 數 | 0000 | DOS 不自動關閉的 FCB 數 |
| 27h | 最後磁碟機號 | 1A | 支援最大磁碟機代號 (Z:) |
從 EMB 的 DPT 鏈頭 (00C9:1346) 遍歷鏈表,每個 DPT 約 30h 位元組。關鍵欄位 (以 C: 磁碟為例):
| 偏移 | 欄位 | 值 | 說明 |
|---|---|---|---|
| 00h | BPB 序號 | 02 | 同一實體裝置上的邏輯磁碟機索引 |
| 01h | 邏輯磁碟機號 | 02 (C:) | 0=A:, 1=B:, 2=C:, 3=D:, 4=E: |
| 02h | 每扇區位元組 | 0200h | 512 bytes |
| 04h | 每叢集扇區數 | 1Fh (32) | 叢集大小 = 32 * 512 = 16KB |
| 05h | 叢集扇區數 log2 | 05 | 2^5 = 32 |
| 06h | 保留扇區數 | 0100h | 1 個 (開機磁區) |
| 08h | FAT 複本數 | 02 | 雙 FAT |
| 09h | 根目錄項目數 | 0200h (512) | |
| 0Bh | 資料區起始扇區 | 0201h | 含開機磁區 + 2 FAT + 根目錄 |
| 0Dh | 資料區叢集總數 | EF2Eh | |
| 0Fh | 每 FAT 扇區數 | 00F0h | |
| 11h | 根目錄起始扇區 | E100h | |
| 13h | 裝置驅動標題指標 | 7000:5E01 | 硬碟驅動程式同一標題 |
| 17h | 媒體描述符 | F8h | 固定磁碟 |
| 18h | DPT 使用旗標 | 00 | 0=使用中 |
| 19h | 下一個 DPT 指標 | 00C9:13FD | 指向 D: 磁碟 DPT |
| 1Dh | 當前目錄起始叢集 | 0200h | |
| 21h | 可用叢集數 | FFFFFFFFh | 未知/未計算 |
關鍵觀察:
從 EMB 的 DPAT 首址 (D597:0000) 遍歷,每項對應一個邏輯磁碟機:
| 磁碟機 | 路徑字串 | 對應 DPT 位址 |
|---|---|---|
| A: | A:\ | 00C9:1346 |
| B: | B:\ | 00C9:1383 |
| C: | C:\WIN98\FILES\MSI\SOFTCOOLER\ | 00C9:13C0 |
| D: | D:\ | 00C9:13FD |
| E: | E:\ | 00C9:143A |
| F: | F:\ | (無實際內容) |
| G: | G:\ | (無實際內容) |
分析:C: 磁碟機路徑指向特定目錄而非根目錄,反映 SUBST/ASSIGN 或啟動參數影響。F:, G: 雖在 DPAT 中佔位,但無對應 DPT,非真實邏輯分割區。
FILES 環境鏈頭 (00C9:00CC) 指向 HPA 鏈表。每個 HPA 管理一組檔案控制代碼:
HPA 結構:
- 下一個 HPA 位址 (DWORD)
- 本 HPA 所含 HPT 數量 (WORD)
- ... (其他旗標)
HPT 結構 (每個開啟檔案一個):
- 旗標 (01h=開啟)
- 開啟模式 (80h=FCB 模式)
- 檔案屬性
- 裝置屬性
- DPT 位址
- 起始叢集
- 時間/日期
- 檔案長度
- 讀寫指標
- 當前叢集/邏輯扇區/目錄項號
- 檔案名 (11 位元組,空白填充,Win98 預設隱藏)
| CONFIG.SYS 設定 | HPA 數量 | 第一 HPA (系統) | 第二 HPA (使用者) | 第三 HPA (保留) | 第四 HPA |
|---|---|---|---|---|---|
| FILES=9 (N<30) | 4 | 5 (標準裝置) | N-5 | 30-N | 固定值 Ah |
| FILES=30 (預設) | 3 | 5 | 25 (23h) | Ah | - |
| FILES=40 (N>30) | 3 | 5 | N-5 (35) | Ah | - |
| FILES=50 | 3 | 5 | 45 (2Dh) | Ah | - |
結論:Win98 內部最少維護 30 個 HPT (5 系統 + 25 使用者) 以滿足視窗系統需求;FILES= 只影響使用者可用 HPT 數量,最後一個 HPA 的計數值 (Ah) 似為無意義填充。
從 EMB 取得首個 MCB (0211:0000),每個 MCB 16 位元組:
| 偏移 | 欄位 | 值範例 | 說明 |
|---|---|---|---|
| 00h | 標記 | 4Dh ('M') / 5Ah ('Z') | 'M'=中間區塊, 'Z'=最後區塊 |
| 01h | 擁有者 | 0008h (系統), 2C05h (程式) | 0008h=系統; 其他=PSP 區段位址 |
| 03h | 區塊大小 (段落數) | 02C7h, 0004h, 00FEh... | 以 16 位元組段落為單位 |
| 05h | 名稱/PSP 內容 | "SD", "MM", "SC:DMA", "COMMAND", "MP=C:\PW..." | 系統區塊無名稱; 程式區塊存 PSP 環境字串 |
遍歷範例:
0211:0000 M 0008 02C7 "SD" -> 系統資料區
04D9:0000 M 0008 0004 "MM" -> 系統模組
04DE:0000 M 2C05 0001 "COMMAND" -> COMMAND.COM
04E0:0000 M 2C06 000D "MP=C:\PW" -> 環境變數
051C:0000 M 2C05 002D ... -> 程式區塊
...
08E1:0000 Z E208 971D "DEBUG" -> 最後區塊 (DEBUG.EXE)
下一個 MCB 計算:Next_MCB = Current_MCB_Segment + 1 + Block_Size_In_Paragraphs (段落位址算術) 或以線性位址 (Segment*16 + 16 + Size*16) 計算。
Win98 圖形介面下無法正確讀取 BUFFERS 鏈 (僅顯示 2 個),需在純 DOS/命令提示字元模式下檢視。結構特徵:
Next_Offset (WORD) | Prev_Offset (WORD)使用 INT 13h AH=02h 讀取實體磁碟第 0 軌 0 磁頭 1 扇區 (MBR),分割區表位於偏移 1BEh:
| 分割區 | 啟動旗標 | 起始 (CHS) | 類型 | 結束 (CHS) | 相對扇區 (LBA) | 總扇區數 | 容量估算 |
|---|---|---|---|---|---|---|---|
| 1 (C:) | 80h (啟動) | 0/0/1 | 06h (FAT16 大容量) | FE/79/3F | 3Fh (63) | 1DE7BBh | ~1 GB |
| 2 (擴充) | 00h | 0/7A/1 | 05h (擴充 DOS) | FE/6D/BF | 1DE7FAh | 7A90F4h | ~4 GB |
驗證:分割區 2 相對扇區 = 分割區 1 相對扇區 + 分割區 1 總扇區 (3Fh + 1DE7BBh = 1DE7FAh) ✓。MBR 結束標記 55AAh 正確。
透過裝置驅動程式控制取得 (C: 磁碟):
| 欄位 | 值 | 說明 |
|---|---|---|
| 作業系統版本 | MSWIN4.1 | Windows 98 = 4.10 |
| 每扇區位元組 | 0200h | 512 |
| 每叢集扇區 | 20h (32) | |
| 保留扇區 | 0100h | 1 |
| FAT 數 | 02 | |
| 根目錄項數 | 0200h (512) | |
| 媒體描述符 | F8h | 固定磁碟 |
| 每 FAT 扇區數 | 00F0h | |
| 每軌扇區數 | 3Fh (63) | |
| 磁頭數 | FFh (255) | |
| 隱藏扇區數 | 3Fh (63) | MBR 佔用 |
| 總扇區數 (4 位元組) | 1DBBE7h | 與分割區 1 總扇區數一致 |
註:高版本 DOS/Win9x 因磁碟容量超過 65535 扇區,總扇區數改用 4 位元組儲存於隱藏扇區數之後。
EMB 為核心樞紐,串聯 MCB (記憶體)、DPT/DPAT (磁碟幾何與路徑)、HPA/HPT (檔案控制代碼)、BUFFERS (磁碟快取)、DPB (驅動程式參數)。這些結構繼承自 DOS 並擴充支援長檔名、FAT32、大磁碟、圖形介面等特性。透過 DEBUG 直接檢視記憶體,可獲得最真實的核心運行狀態,對於系統程式設計、逆向工程、故障分析具有不可替代的價值。