首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Windows 98 核心記憶體與磁碟管理結構深度分析:MCB、DPT、DPAT、HPA、DPB 完整解析

     編輯:關於C++

前言:透過 DEBUG 窺探 Win98 核心資料結構

Windows 98 保留了大量 DOS 時代的核心資料結構,透過 DEBUG 工具與中斷呼叫(INT 21h AH=52h 取得 EMB)可直接檢視記憶體管理區塊 (MCB)、磁碟參數表 (DPT)、磁碟路徑表 (DPAT)、控制代碼參數區 (HPA/HPT) 等關鍵結構。本文詳細記錄實際除錯過程與資料解析,為理解 Win98 核心架構提供第一手資料。

環境管理區塊 (EMB) - 核心資料結構入口

呼叫 INT 21h AH=52h 後,ES:BX 指向 EMB。關鍵欄位偏移與含義:

偏移欄位範例值說明
00hFirst MCB0211:0000第一個記憶體控制區塊位址
02hFILES 鏈頭00C9:00CC檔案控制代碼鏈表頭
06hSTDIN 裝置標題0070:0016標準輸入裝置驅動程式標題
0AhBUFFERS 鏈頭00C9:006D磁碟緩衝區鏈表頭
0EhFCBS 鏈頭D2E7:0000FCB 控制區塊鏈表頭
12h邏輯磁碟機號05當前預設磁碟機
13h裝置驅動鏈頭D181:0000字元/區塊裝置驅動程式鏈表
17hDPT 鏈頭00C9:1346磁碟參數表鏈表頭
1BhSTDOUT 裝置標題0070:004C標準輸出裝置驅動程式標題
1Fh每緩衝區位元組0200扇區大小 (512 bytes)
21hDPAT 首址D597:0000磁碟路徑表起始位址
25h最大 FCB 數0000DOS 不自動關閉的 FCB 數
27h最後磁碟機號1A支援最大磁碟機代號 (Z:)

磁碟參數表 (DPT) - 每個邏輯磁碟機一個

從 EMB 的 DPT 鏈頭 (00C9:1346) 遍歷鏈表,每個 DPT 約 30h 位元組。關鍵欄位 (以 C: 磁碟為例):

偏移欄位值說明
00hBPB 序號02同一實體裝置上的邏輯磁碟機索引
01h邏輯磁碟機號02 (C:)0=A:, 1=B:, 2=C:, 3=D:, 4=E:
02h每扇區位元組0200h512 bytes
04h每叢集扇區數1Fh (32)叢集大小 = 32 * 512 = 16KB
05h叢集扇區數 log2052^5 = 32
06h保留扇區數0100h1 個 (開機磁區)
08hFAT 複本數02雙 FAT
09h根目錄項目數0200h (512)
0Bh資料區起始扇區0201h含開機磁區 + 2 FAT + 根目錄
0Dh資料區叢集總數EF2Eh
0Fh每 FAT 扇區數00F0h
11h根目錄起始扇區E100h
13h裝置驅動標題指標7000:5E01硬碟驅動程式同一標題
17h媒體描述符F8h固定磁碟
18hDPT 使用旗標000=使用中
19h下一個 DPT 指標00C9:13FD指向 D: 磁碟 DPT
1Dh當前目錄起始叢集0200h
21h可用叢集數FFFFFFFFh未知/未計算

關鍵觀察:

  • Win98 DPT 結構比舊版 DOS 多一個「使用旗標」欄位 (偏移 18h),導致後續欄位整體後移一位。
  • A:, B: 磁碟機未使用時,部分欄位 (如每叢集扇區數) 顯示無效值 (FEh/00h)。
  • C:, D:, E: 共用同一硬碟驅動程式標題指標 (7000:5E01),媒體描述符均為 F8h。

磁碟路徑表 (DPAT) - 邏輯磁碟機路徑對應

從 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,非真實邏輯分割區。

控制代碼參數區 (HPA) 與參數表 (HPT)

FILES 環境鏈頭 (00C9:00CC) 指向 HPA 鏈表。每個 HPA 管理一組檔案控制代碼:

HPA 結構:
- 下一個 HPA 位址 (DWORD)
- 本 HPA 所含 HPT 數量 (WORD)
- ... (其他旗標)

HPT 結構 (每個開啟檔案一個):
- 旗標 (01h=開啟)
- 開啟模式 (80h=FCB 模式)
- 檔案屬性
- 裝置屬性
- DPT 位址
- 起始叢集
- 時間/日期
- 檔案長度
- 讀寫指標
- 當前叢集/邏輯扇區/目錄項號
- 檔案名 (11 位元組,空白填充,Win98 預設隱藏)

FILES= 設定對 HPA 結構的影響

CONFIG.SYS 設定HPA 數量第一 HPA (系統)第二 HPA (使用者)第三 HPA (保留)第四 HPA
FILES=9 (N<30)45 (標準裝置)N-530-N固定值 Ah
FILES=30 (預設)3525 (23h)Ah-
FILES=40 (N>30)35N-5 (35)Ah-
FILES=503545 (2Dh)Ah-

結論:Win98 內部最少維護 30 個 HPT (5 系統 + 25 使用者) 以滿足視窗系統需求;FILES= 只影響使用者可用 HPT 數量,最後一個 HPA 的計數值 (Ah) 似為無意義填充。

記憶體控制區塊 (MCB) - 記憶體管理鏈表

從 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) 計算。

磁碟緩衝區 (BUFFERS) - 循環雙向鏈表

Win98 圖形介面下無法正確讀取 BUFFERS 鏈 (僅顯示 2 個),需在純 DOS/命令提示字元模式下檢視。結構特徵:

  • 每個緩衝區頭部 4 位元組:Next_Offset (WORD) | Prev_Offset (WORD)
  • 同一段址 (26D7h),形成循環雙向鏈表
  • 首尾相連:第一個緩衝區的 Prev 指向最後一個,最後一個的 Next 指向第一個
  • 緩衝區內容包含:磁碟資料、對應 DPT 指標 (00C9:1346)、狀態旗標

硬碟分割區表 - 主開機磁區 (MBR) 解析

使用 INT 13h AH=02h 讀取實體磁碟第 0 軌 0 磁頭 1 扇區 (MBR),分割區表位於偏移 1BEh:

分割區啟動旗標起始 (CHS)類型結束 (CHS)相對扇區 (LBA)總扇區數容量估算
1 (C:)80h (啟動)0/0/106h (FAT16 大容量)FE/79/3F3Fh (63)1DE7BBh~1 GB
2 (擴充)00h0/7A/105h (擴充 DOS)FE/6D/BF1DE7FAh7A90F4h~4 GB

驗證:分割區 2 相對扇區 = 分割區 1 相對扇區 + 分割區 1 總扇區 (3Fh + 1DE7BBh = 1DE7FAh) ✓。MBR 結束標記 55AAh 正確。

磁碟參數區塊 (DPB) - 裝置驅動程式內部參數

透過裝置驅動程式控制取得 (C: 磁碟):

欄位值說明
作業系統版本MSWIN4.1Windows 98 = 4.10
每扇區位元組0200h512
每叢集扇區20h (32)
保留扇區0100h1
FAT 數02
根目錄項數0200h (512)
媒體描述符F8h固定磁碟
每 FAT 扇區數00F0h
每軌扇區數3Fh (63)
磁頭數FFh (255)
隱藏扇區數3Fh (63)MBR 佔用
總扇區數 (4 位元組)1DBBE7h與分割區 1 總扇區數一致

註:高版本 DOS/Win9x 因磁碟容量超過 65535 扇區,總扇區數改用 4 位元組儲存於隱藏扇區數之後。

總結:Win98 核心資料結構圖譜

EMB 為核心樞紐,串聯 MCB (記憶體)、DPT/DPAT (磁碟幾何與路徑)、HPA/HPT (檔案控制代碼)、BUFFERS (磁碟快取)、DPB (驅動程式參數)。這些結構繼承自 DOS 並擴充支援長檔名、FAT32、大磁碟、圖形介面等特性。透過 DEBUG 直接檢視記憶體,可獲得最真實的核心運行狀態,對於系統程式設計、逆向工程、故障分析具有不可替代的價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved