天天看點

擴充int 13H/調用規範 /大硬碟讀寫中斷/FAT NTFS檔案結構

 第一部分 簡 介

一. 硬碟結構簡介

1. 硬碟參數釋疑

到目前為止,人們常說的硬碟參數還是古老的 CHS (Cylinder/Head/Sector)參數。那麼為什麼要使用這些參數,它們的意義是什麼?它們的取值範圍是什麼?

很久以前(long long ago ...),硬碟的容量還非常小的時候,人們采用與軟碟類似的結構生産硬碟。也就是硬碟盤片的每一條磁道都具有相同的扇區數。由此産生了所謂的3D參數 (Disk Geometry)。即磁頭數(Heads),柱面數(Cylinders),扇區數(Sectors),以及相應的尋址方式。

其中:

磁頭數(Heads) 表示硬碟總共有幾個磁頭,也就是有幾面盤片,最大為 255 (用 8 個二進制位存儲);

柱面數(Cylinders) 表示硬碟每一面盤片上有幾條磁道,最大為 1023(用 10 個二進制位存儲);

扇區數(Sectors) 表示每一條磁道上有幾個扇區, 最大為 63 (用 6個二進制位存儲)。

每個扇區一般是 512個位元組,理論上講這不是必須的,但好象沒有取别的值的。

是以磁盤最大容量為:

255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes ) 或硬碟廠商常用的機關:

255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )

在 CHS 尋址方式中,磁頭,柱面,扇區的取值範圍分别為 0到 Heads - 1, 0到 Cylinders - 1,1到 Sectors (注意是從1開始)。

2. 基本 Int 13H 調用簡介

BIOS Int 13H 調用是 BIOS 提供的磁盤基本輸入輸出中斷調用,它可以完成磁盤(包括硬碟和軟碟)的複位,讀寫,校驗,定位,診斷,格式化等功能。它使用的就是 CHS 尋址方式,是以最大識能通路 8 GB 左右的硬碟( 本文中如不作特殊說明,均以 1M = 1048576 位元組為機關)。

3. 現代硬碟結構簡介

在老式硬碟中,由于每個磁道的扇區數相等,是以外道的記錄密度要遠低于内道,是以會浪費很多磁盤空間 (與軟碟一樣)。為了解決這一問題,進一步提高硬碟容量,人們改用等密度結構生産硬碟。也就是說,外圈磁道的扇區比内圈磁道多。采用這種結構後,硬碟不再具有實際的3D參數,尋址方式也改為線性尋址,即以扇區為機關進行尋址。

為了與使用3D尋址的老軟體相容 (如使用BIOS Int13H接口的軟體),在硬碟控制器内部安裝了一個位址翻譯器,由它負責将老式3D參數翻譯成新的線性參數。這也是為什麼現在硬碟的3D參數可以有多種選擇的原因 (不同的工作模式,對應不同的3D參數,如 LBA,LARGE,NORMAL)。

4. 擴充 Int 13H 簡介

雖然現代硬碟都已經采用了線性尋址,但是由于基本 Int 13H 的制約,使用 BIOS Int 13H 接口的程式,如 DOS 等還隻能通路 8 G 以内的硬碟空間。為了打破這一限制,Microsoft 等幾家公司制定了擴充 Int 13H 标準(Extended Int13H),采用線性尋址方式存取硬碟,是以突破了 8 G 的限制,而且還加入了對可拆卸媒體 (如活動硬碟) 的支援。

二. Boot Sector 結構簡介

1. Boot Sector 的組成

Boot Sector 也就是硬碟的第一個扇區,它由 MBR (Master Boot Record),DPT (Disk Partition Table) 和 Boot Record ID 三部分組成。

MBR 又稱作主引導記錄占用 Boot Sector 的前 446 個位元組 ( 0 to 0x1BD ),存放系統主引導程式 (它負責從活動分區中裝載并運作系統引導程式)。

DPT 即主分區表占用 64 個位元組 (0x1BE to 0x1FD),記錄了磁盤的基本分區資訊。主分區表分為四個分區項,每項 16 位元組,分别記錄了每個主分區的資訊(是以最多可以有四個主分區)。

Boot Record ID 即引導區标記占用兩個位元組 (0x1FE and 0x1FF),對于合法引導區,它等于 0xAA55,這是判别引導區是否合法的标志。

Boot Sector 的具體結構如下圖所示:

Offset 0000H

Offset 01BDH

Offset 01BEH

Offset 01CDH

Offset 01CEH

Offset 01DDH

Offset 01DEH

Offset 01EDH

Offset 01EEH

Offset 01FDH

Offset 01FEH

Offset 01FFH

Master Boot Record

主引導記錄(446位元組)

分區資訊1

分區資訊2

分區資訊3

分區資訊4

校驗字0xAA55

2. 分區表結構簡介

分區表由四個分區項構成,每一項的結構如下:

BYTE State : 分區狀态,0 = 未激活,0x80 = 激活 (注意此項)

BYTE StartHead : 分區起始磁頭号

WORD StartSC : 分區起始扇區和柱面号,底位元組的低6位為扇區号,高2位為柱面号的第 9,10位,高位元組為柱面号的低 8位

BYTE Type : 分區類型,如 0x0B = FAT32,0x83 = Linux 等,00表示此項未用(注1)

BYTE EndHead : 分區結束磁頭号

WORD EndSC : 分區結束扇區和柱面号,定義同前

DWORD Relative : 線上性尋址方式下的分區相對扇區位址 (對于基本分區即為絕對位址)

DWORD Sectors : 分區大小 (總扇區數)

注意:在 DOS / Windows 系統下,基本分區必須以柱面為機關劃分( Sectors * Heads 個扇區),如對于 CHS 為 764/255/63 的硬碟,分區的最小尺寸為 255 * 63 * 512 / 1048576 = 7.844 MB。

3. 擴充分區簡介

由于主分區表中隻能分四個分區,無法滿足需求,是以設計了一種擴充分區格式。基本上說,擴充分區的資訊是以連結清單形式存放的,但也有一些特别的地方。

首先,主分區表中要有一個基本擴充分區項,所有擴充分區都隸屬于它,也就是說其他所有擴充分區的空間都必須包括在這個基本擴充分區中。對于DOS / Windows 來說,擴充分區的類型為 0x05。

除基本擴充分區以外的其他所有擴充分區則以連結清單的形式級聯存放,後一個擴充分區的資料項記錄在前一個擴充分區的分區表中,但兩個擴充分區的空間并不重疊。

擴充分區類似于一個完整的硬碟,必須進一步分區才能使用。但每個擴充分區中隻能存在一個其他分區。此分區在 DOS/Windows 環境中即為邏輯盤。是以每一個擴充分區的分區表 (同樣存儲在擴充分區的第一個扇區中)中最多隻能有兩個分區資料項(包括下一個擴充分區的資料項)。

擴充分區和邏輯盤關系請參考 注1。

第二部分 技術資料

第一章 擴充 Int13H 技術資料

一. 簡介

設計擴充 Int13H 接口的目的是為了擴充 BIOS 的功能,使其支援多于1024柱面的硬碟,以及可移動媒體的鎖定,解鎖及彈出等功能。

二. 資料結構

1. 資料類型約定

BYTE 1 位元組整型 ( 8 位 )

WORD 2 位元組整型 ( 16 位 )

DWORD 4 位元組整型 ( 32 位 )

QWORD 8 位元組整型 ( 64 位 )

2. 磁盤位址資料包 Disk Address Packet (DAP)

DAP 是基于絕對扇區位址的,是以利用 DAP,Int13H 可以輕松地逾越 1024 柱面的限制,因為它根本就不需要 CHS 的概念。

DAP 的結構如下:

struct DiskAddressPacket

{

BYTE PacketSize; // 資料包尺寸(16位元組)

BYTE Reserved; // ==0

WORD BlockCount; // 要傳輸的資料塊個數(以扇區為機關)

DWORD BufferAddr; // 傳輸緩沖位址(segment:offset)

QWORD BlockNum; // 磁盤起始絕對塊位址

};

PacketSize 儲存了 DAP 結構的尺寸,以便将來對其進行擴充。在目前使用的擴充 Int13H 版本中 PacketSize 恒等于 16。如果它小于16,擴充 Int13H 将傳回錯誤碼( AH=01,CF=1 )。

BlockCount 對于輸入來說是需要傳輸的資料塊總數,對于輸出來說是實際傳輸的資料塊個數。BlockCount = 0 表示不傳輸任何資料塊。

BufferAddr 是傳輸資料緩沖區的 32 位位址 (段位址:偏移量)。資料緩沖區必須位于正常記憶體以内(1M)。

BlockNum 表示的是從磁盤開始算起的絕對塊位址(以扇區為機關),與分區無關。第一個塊位址為 0。一般來說,BlockNum 與 CHS 位址的關系是:

BlockNum = ( cylinder * NumberOfHeads + head ) * SectorsPerTrack + sector - 1;

其中 cylinder,head,sector 是 CHS 位址,NumberOfHeads 是磁盤的磁頭數,SectorsPerTrack 是磁盤每磁道的扇區數。

也就是說 BlockNum 是沿着 扇區->磁道->柱面 的順序記數的。這一順序是由磁盤控制器虛拟的,磁盤表面資料塊的實際排列順序可能與此不同(如為了提高磁盤速度而設定的間隔因子将會打亂扇區的排列順序)。

3. 驅動器參數資料包 Drive Parameters Packet

驅動器參數資料包是在擴充 Int13H 的取得驅動器參數子功能調用中使用的資料包。格式如下:

struct DriveParametersPacket

{

WORD InfoSize; // 資料包尺寸 (26 位元組)

WORD Flags; // 資訊标志

DWORD Cylinders; // 磁盤柱面數

DWORD Heads; // 磁盤磁頭數

DWORD SectorsPerTrack; // 每磁道扇區數

QWORD Sectors; // 磁盤總扇區數

WORD SectorSize; // 扇區尺寸 (以位元組為機關)

};

資訊标志用于傳回磁盤的附加資訊,每一位的定義如下:

0 位:

0 = 可能發生 DMA 邊界錯誤

1 = DMA 邊界錯誤将被透明處理

如果這位置 1,表示 BIOS 将自動處理 DMA 邊界錯誤,也就是說錯誤代碼 09H 永遠也不會出現.

1 位:

0 = 未提供 CHS 資訊

1 = CHS 資訊合法

如果塊裝置的傳統 CHS 幾何資訊不适當的話,該位将置 0.

2 位:

0 = 驅動器不可移動

1 = 驅動器可移動

3 位: 表示該驅動器是否支援寫入時校驗.

4 位:

0 = 驅動器不具備媒體更換檢測線

1 = 驅動器具備媒體更換檢測線

5 位:

0 = 驅動器不可鎖定

1 = 驅動器可以鎖定

要存取驅動器号大于 0x80 的可移動驅動器,該位必須置 1(某些驅動器号為 0 到 0x7F 的裝置也需要置位)

6 位:

0 = CHS 值是目前存儲媒體的值 (僅對于可移動媒體),如果驅動器中有存儲媒體,CHS 值将被傳回.

1 = CHS 值是驅動器支援的最大值 (此時驅動器中沒有媒體).

7 - 15 位: 保留,必須置 0.

三. 接口規範

1. 寄存器約定

在擴充 Int13H 調用中一般使用如下寄存器約定:

ds:si ==> 磁盤位址資料包( disk address packet )

dl ==> 驅動器号

ah ==> 功能代碼 / 傳回碼

在基本 Int13H 調用中,0 - 0x7F 之間的驅動器号代表可移動驅動器0x80 - 0xFF 之間的驅動器号代表固定驅動器。但在擴充 Int13H 調用中0x80 - 0xFF 之間還包括一些新出現的可移動驅動器,比如活動硬碟等。這些驅動器支援先進的鎖定,解鎖等功能。

ah 傳回的錯誤碼除了标準 Int13H 調用規定的基本錯誤碼以外,又增加了以下錯誤碼:

B0h 驅動器中的媒體未被鎖定

B1h 驅動器中的媒體已經鎖定

B2h 媒體是可移動的

B3h 媒體正在被使用

B4h 鎖定記數溢出

B5h 合法的彈出請求失敗

2. API 子集介紹

1.x 版的擴充 Int13H 調用中規定了兩個主要的 API 子集。

第一個子集提供了通路大硬碟所必須的功能,包括 檢查擴充 In13H是否存在( 41h ),擴充讀( 42h ),擴充寫( 43h ),校驗扇區( 44h ),擴充定位( 47h ) 和 取得驅動器參數( 48h )。

第二個子集提供了對軟體控制驅動器鎖定和彈出的支援,包括 檢查擴充Int13H 是否存在( 41h ),鎖定/解鎖驅動器( 45h ),彈出驅動器( 46h ),取得驅動器參數( 48h ),取得擴充驅動器改變狀态( 49h ),int 15h。

如果使用了調用規範中不支援的功能,BIOS 将傳回錯誤碼 ah = 01h,CF = 1。

3. API 詳解

1) 檢驗擴充功能是否存在

入口:

AH = 41h

BX = 55AAh

DL = 驅動器号

傳回:

CF = 0

AH = 擴充功能的主版本号

AL = 内部使用

BX = AA55h

CX = API 子集支援位圖

CF = 1

AH = 錯誤碼 01h,無效指令

這個調用檢驗對特定的驅動器是否存在擴充功能。如果進位标志置 1則此驅動器不支援擴充功能。如果進位标志為 0,同時 BX = AA55h,則存在擴充功能。此時 CX 的 0 位表示是否支援第一個子集,1位表示是否支援第二個子集.

對于 1.x 版的擴充 Int13H 來說,主版本号 AH = 1。AL 是副版本号,但這僅限于 BIOS 内部使用,任何軟體不得檢查 AL 的值。

2) 擴充讀

入口:

AH = 42h

DL = 驅動器号

DS:DI = 磁盤位址資料包(Disk Address Packet)

注意:實際使用應當是ds:si ==> 磁盤位址資料包( disk address packet ),以下各子功能同此。

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用将磁盤上的資料讀入記憶體。如果出現錯誤,DAP 的 BlockCount項中則記錄了出錯前實際讀取的資料塊個數。

3) 擴充寫

入口:

AH = 43h

AL

0 位 = 0 關閉寫校驗

1 打開寫校驗

1 - 7 位保留,置 0

DL = 驅動器号

DS:DI = 磁盤位址資料包(DAP)

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用将記憶體中的資料寫入磁盤。如果打開了寫校驗選項,但 BIOS不支援,則會傳回錯誤碼 AH = 01h,CF = 1。功能 48h 可以檢測BIOS是否支援寫校驗。

如果出現錯誤,DAP 的 BlockCount 項中則記錄了出錯前實際寫入的資料塊個數。

4) 校驗扇區

入口:

AH = 44h

DL = 驅動器号

DS:DI = 磁盤位址資料包(Disk Address Packet)

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用校驗磁盤資料,但并不将資料讀入記憶體.如果出現錯誤,DAP 的BlockCount 項中則記錄了出錯前實際校驗的資料塊個數。

5) 鎖定/解鎖驅動器

入口:

AH = 45h

AL

= 0 鎖定驅動器

= 1 驅動器解鎖

= 02 傳回鎖定/解鎖狀态

= 03h-FFh - 保留

DL = 驅動器号

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用用來縮定指定驅動器中的媒體.

所有标号大于等于 0x80 的可移動驅動器必須支援這個功能。如果在支援可移動驅動器控制功能子集的固定驅動器上使用這個功能調用,将會成功傳回。

驅動器必須支援最大255次鎖定,在所有鎖定被解鎖之前,不能在實體上将驅動器解鎖。解鎖一個未鎖定的驅動器,将傳回錯誤碼 AH= B0h。如果鎖定一個已鎖定了255次的驅動器,将傳回錯誤碼 AH = B4h。

鎖定一個沒有媒體的驅動器是合法的。

6) 彈出可移動驅動器中的媒體

入口:

AH = 46h

AL = 0 保留

DL = 驅動器号

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用用來彈出指定的可移動驅動器中的媒體.

所有标号大于等于 0x80 的可移動驅動器必須支援這個功能。如果在支援可移動驅動器控制功能子集的固定驅動器上使用這個功能調用,将會傳回錯誤碼 AH = B2h (媒體不可移動)。如果試圖彈出一個被鎖定的媒體将傳回錯誤碼 AH = B1h (媒體被鎖定)。

如果試圖彈出一個沒有媒體的驅動器,則傳回錯誤碼 Ah = 31h (驅動器中沒有媒體)。

如果試圖彈出一個未鎖定的可移動驅動器中的媒體,Int13h會調用 Int15h(AH = 52h) 來檢查彈出請求能否執行。如果彈出請求被拒絕則傳回錯誤碼(同Int15h)。如果彈出請求被接受,但出現了其他錯誤,則傳回錯誤碼 AH = B5h。

7) 擴充定位

入口:

AH = 47h

DL = 驅動器号

DS:DI = 磁盤位址資料包(Disk Address Packet)

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用将磁頭定位到指定扇區。

8) 取得驅動器參數

入口:

AH = 48h

DL = 驅動器号

DS:DI = 傳回資料緩沖區位址

傳回:

CF = 0,AH = 0 成功

CF = 1,AH = 錯誤碼

這個調用傳回指定驅動器的參數。

9) 取得擴充驅動器媒體更換檢測線狀态

入口:

AH = 49h

DL = 驅動器号

傳回:

CF = 0,AH = 0 媒體未更換

CF = 1,AH = 06h 媒體可能已更換

這個調用傳回指定驅動器的媒體更換狀态.

這個調用與 Int13h AH = 16h 子功能調用相同,隻是允許任何驅動器标号。如果對一台支援可移動媒體功能子集的固定驅動器使用此功能,則永遠傳回 CF = 0,AH = 0。

簡單地将可移動媒體鎖定再解鎖就可以激活檢測線,而無須真正更換媒體。

10) Int 15h 可移動媒體彈出支援

入口:

AH = 52h

DL = 驅動器号

傳回:

CF = 0,AH = 0 彈出請求可能可以執行

CF = 1,AH = 錯誤碼 B1h 或 B3h 彈出請求不能執行

這個調用是由 Int13h AH=46h 彈出媒體功能調用内部使用的。

'==================

FAT檔案系統的結構:

3.1 FAT12,FAT16:

DBR--FAT1--FAT2--DFT--DATA

DBR隻占1個扇區,DFT為根目錄表,根目錄下的DIR項數固定,一般為512項,每項占32位元組,即DIR占32個扇區

則一個檔案的邏輯扇區号:

邏輯扇區号=1+2*FAT占用的扇區數+DIR占用的扇區數+(起始簇号-2)*每簇扇區數

3.2FAT32:

DBR和其後的保留扇區--FAT1--FAT2-DATA

在DBR使用3個扇區,實際隻使用第1個扇區,2,3扇區也寫入55AA标志,之後有保留扇區,一般為20h或21h,其中第6扇區是DBR的備份。同時DIR當作檔案處理,不在固定位置,也沒有固定大小

則檔案的邏輯扇區号:

邏輯扇區号=保留扇區數+2*FAT占用扇區數+(起始簇号-2)*每簇扇區數

此時因為DIR不固定,要在BPB中讀出DIR的入口簇。

對于一個确定的分區,可通過邏輯位址來通路該分區中的扇區。邏輯位址從0開始。

在98和dos下可用debug的L指令來通路:

L [address] [drive] [firstsector] [number]

讀邏輯盤的扇區,扇區号為邏輯位址,0為DBR即BOOT區

drive按A,B,C,D排序,對應0,1,2,3...

對應W指令:

W [address] [drive] [firstsector] [number]

W若不帶參數,或隻有位址參數,則按BX:CX寄存器指出的位元組,從内

         存向磁盤寫入資料。此時的檔案名是此指令前最後一個使用過的檔案名

         ,或者是N指令中指定的檔案,如果沒有使用過N指令,則使用Debug命

        令行中指定的檔案。

DBR(dos boot record)作業系統可通路的第一個扇區。包括一個引導程式和BPB(bios parameter block)的本分區參數記錄表。

FAT(file allocation table)fat中的記錄和磁盤上的簇對應。FAT2為FAT1的備份。FAT的格式有多種,其中FAT16是指檔案配置設定表使用16位表示一個簇,FAT12,FAT32同理。可知FAT16最多能管理65536個簇,而每簇最大32kb,是以FAT16每個分區最大2GB。

(注:FAT的0,1簇保留,0位元組表示磁盤類型,簇号從2開始。)

DFT(檔案目錄表)根目錄區,隻存在FAT12和FAT16中,緊跟在FAT2後。根目錄下的檔案和子目錄在DFT中都有一個‘目錄登記項'每個項占32位元組,項數在BPB中說明。FAT32中DFT無固定位置,把DFT當作一個普通檔案處理,在BPB中指出DFT首簇位址。

長檔案名規則:

目錄項儲存該檔案的短檔案名,長檔案名用若幹個長檔案名目錄向儲存,長檔案名目錄項倒序排列在檔案短目錄項前面,采用雙位元組unicode内碼儲存,每項最多13個内碼,首位元組是順序位元組,指明是長檔案名的第幾項,11位元組為0F,12位元組指明類型,13位元組為校驗和,26,27位元組為0。

--------------------------------------------------------------------------

3.3 FAT檔案系統的的一些參數:

3.3.1 FAT16的BPB:

偏移 長度 說明
00 3 JMP指令;跳轉到引導程式。後随一個空操作。(不屬BPB)
03 8 OEM标志(FAT16為MSWIN4.0)
0B 2 每扇區位元組數
0D 1 每簇扇區數
0E 2 dos保留扇區數
10 1 FAT數
11 2 根目錄項數,如512
13 2 扇區數(小于32M的分區)
15 1 媒體描述符
16 2 每FAT扇區數
18 2 每磁道扇區數(邏輯參數)
1A 2 磁頭數(邏輯參數
1C 4 隐含扇區(即分區表中的8-11位元組——本分區之前已用扇區數)***
20 4 扇區數(即分區表中的12-15位元組)
24 1 BIOS裝置号(hex:HD=8x)
25 1 未使用
26 1 擴充引導标記
27 4 卷序列号(随機)
2B 11 卷标,分區辨別,如:WIN98
36 8 檔案系統格式:FAT16

3.3.2 FAT32的BPB:

偏移 長度 說明
00 3 JMP指令
03 8 OEM标志(FAT32為MSWIN4.1)
0B 2 每位元組扇區數
0D 1 每簇扇區數
0E 2 dos保留扇區數,FAT32中一般是32
10 1 FAT數
11 2 根目錄項數,一般為0,未使用
13 2 扇區數(小于32M的分區,FAT32中不再使用)
15 1 媒體描述符
16 2 每FAT扇區數(FAT32下不用)
18 2 每磁道扇區數(邏輯參數)
1A 2 磁頭數(邏輯參數)
1C 4 隐含扇區(即分區表中的8-11位元組——本分區之前已用扇區數)***
20 4 扇區數(即分區表中的12-15位元組)
24 4 每FAT扇區數
28 2 标記
2A 2 版本
2C 4 根目錄首簇位址
30 2 DBR占用的扇區數
32 2 備份DBR位址
34 12 保留
40 1 BIOS裝置号(hex:HD=8x)
41 1 未使用
42 1 擴充引導标記
43 4 卷序列号(随機)
47 11 卷标,分區辨別,如:WIN2000
52 8 檔案系統格式:FAT32

3.3.3 磁媒體描述符:

十六進制 說明
F8 硬碟
F9 雙面5in軟碟(15扇區高密度)雙面3in軟碟
FA 雙面3in RAM虛拟盤
FC 單面5in軟碟(9扇區高密度) 雙面8in盤
FD 雙面5in盤(9扇區低密度)
FE 單面8in盤(單、雙密度)單面5in盤(8扇區低密度)
FF 雙面5in盤(8扇區低密)

3.3.4 FAT中每個簇号可取的表項值及含義:

表項值(12位) 表項值(16位) 表項值(32位) 簇描述含義
000H  0000H 00000000H 未使用的簇
002H-FEFH 0002H-FFEFH 00000002H-FFFFFFEFH 已配置設定的簇(可見簇号從2開始)
FF0H-FF6H  FFF0H-FFF6H FFFFFFF0H-FFFFFFF6H 保留
FF7H FFF7H FFFFFFF7H 壞簇
FF8H-FFFH FFF8H-FFFFH FFFFFFF8H-FFFFFFFFH 檔案結束簇

3.3.5 FAT16的FDT字段含義:

偏移 長度 說明
0-7 8 檔案名
8-10 3 擴充名
11 1 屬性位元組(00000000讀寫,00000001隻讀,00000010隐藏,00000100系統,00001000卷标,00010000子目錄,00100000檔案)
12-21 10 保留未用
22-23 2 檔案建立時間(hhhhh mmmmmm sssss)
24-25 2 檔案建立時間(yyyyyyy mmmm ddddd)
26-27 2 表示檔案的首簇号
28-31 4 檔案長度

3.3.6 FAT32的FDT字段含義:

偏移 長度 說明
0-7 8 檔案名
8-10 3 擴充名
11 1 屬性位元組(同FAT16,但為0FH時,表示該項為長檔案名記錄項)
12-13 2 種類、校驗和
13-15 3 檔案建立時間(hhhhh mmmmmm sssss,後8位為毫秒數)
16-17 2 檔案建立時間(yyyyyyy mmmm ddddd)
18-19 2 最新通路日期,定義同16-17
20-21 2 起始簇的高16位
22-23 2 最新修改時間(hhhhh mmmmmm sssss)
24-25 2 最新修改日期,定義同16-17
26-27 2 起始簇的低16位
28-31 4 檔案長度

通過以上資訊,經過debug的L指令即可讀出FAT系統中任意檔案的内容。

--------------------------------------------------------------------------

4.NTFS檔案系統的結構:

分區引導扇區——MFT(主檔案表)——系統檔案——檔案區域

在NTFS中,磁盤上的任何事物都為檔案。

檔案通過MFT來确定其在磁盤上的存儲位置。主檔案表是一個與檔案相對應的資料庫,由一系列檔案記錄組成——卷中每個檔案都有一個檔案記錄(對于大型檔案可能有多個記錄與之對應)。主檔案表自身也有它自己的記錄。MFT的檔案記錄大小一般是固定的,不管簇的大小是多少,均為1k。MFT僅供系統本身組織架構檔案系統使用,被稱為中繼資料,不能被應用程式通路。其中最基本的前16個記錄是作業系統使用的非常重要的中繼資料檔案。這些檔案都以‘$'開始,是隐藏檔案,不能用dir指令列出。不過有個工具nfi.exe可以轉儲重要的中繼資料檔案。

NTFS使用邏輯簇号LCN和虛拟簇号VCN來對簇進行定位。LCN是對整個卷從頭到尾的編号,相當于FAT系統的邏輯簇号。VCN是對特定檔案的簇從頭到尾進行編号。VCN可以映射成LCN。

NTFS把磁盤分成兩大部分,大約12%配置設定給MFT,餘下的用來存儲檔案。

NTFS通過MFT通路卷的過程如下:

  • 首先必須裝載該卷——檢視引導檔案($Boot中繼資料檔案),找到MFT的實體位址;
  • 然後從檔案記錄的資料屬性中獲得VCN到LCN的映射資訊,并存儲在記憶體中。這個映射資訊定位了MFT的運作(run或extent,見常駐屬性與非常駐屬性)在磁盤上的位置;
  • 接着再打開幾個中繼資料檔案的MFT記錄,并打開這些檔案。此後,使用者就可以通路該卷了。

NTFS将檔案作為‘屬性/屬性值'的集合來處理。檔案資料就是未命名屬性的值。一個檔案通常占用一個檔案記錄。但當一個檔案具有很多項屬性值或很零碎的時候,就可能需要占用一個以上的檔案記錄。這種情況下,第一個檔案記錄是其基本的檔案記錄,存儲有該檔案需要的其他檔案記錄的位置。小檔案和檔案夾将全部存儲在檔案的MFT記錄裡。

NTFS的檔案夾隻是一個簡單的檔案名和檔案引用号的索引,如果目錄清單小于一個記錄的長度,那麼,該檔案夾的所有資訊都存儲在主檔案表的記錄中。對于大于記錄的檔案夾則使用B+樹進行管理,并用一個指針指向一個外部簇,該簇用來存儲那些MFT記憶體儲不了的檔案夾的屬性。

當一個檔案很小時,其所有屬性和屬性值都可以存放在MFT的檔案記錄中。當屬性值能直接存放在MFT中時,該屬性就稱為常駐屬性(resident attribute)。有些屬性總是常駐的,這樣NTFS才可以确定其他非常駐屬性。

大檔案或大目錄的所有屬性,就不可能常駐在MFT中。如果一個屬性太大而不能存放在隻有1KB大小的MFT檔案記錄中,那麼NTFS将從MFT之外為之配置設定區域。這些區域通常稱為一個運作(run)或一個盤區(extent),它們可用來存儲屬性值,如檔案資料。如果以後屬性值又增加,那麼,NTFS将回再配置設定一個運作,以便用來存儲額外的資料。值存儲在運作中而不是在MFT檔案記錄中的屬性稱為非常駐屬性。

在标準屬性中,隻有可以增長的屬性才是非常駐的。對檔案來說,可增長屬性有資料、屬性清單等。

4.1 NTFS的BPB:

偏移 長度 說明
00 3 JMP指令
03 8 OEM标志
0B 2 每扇區位元組數
0D 1 每簇扇區數
0E 2 保留扇區
10 3 總為0
13 2 NTFS未使用,總為0
15 1 媒體描述
16 2 總為0
18 2 每磁道扇區數
1A 2 磁頭數
1C 4 隐含扇區
20 4 NTFS未使用,總為0
24 4 NTFS未使用,總為0
28 8 扇區總數
30 8 $MFT的邏輯簇号
38 3 $MFTMirr的邏輯簇号
40 4 每MFT記錄簇數
44 4 每索引簇數
48 8 卷标
50 4 校驗和

4.2 NTFS元檔案:

序号 元檔案 功能
$MFT 主檔案表本身
1 $MFTMirr 主檔案表的部分鏡像(内容就是前16個檔案記錄)
2 $LogFile 日志檔案
3 $Volume 卷檔案
4 $AttrDef 屬性定義清單
5 $Root 根目錄
6 $Bitmap 位圖檔案
7 $Boot 引導檔案
8 $BadClus 壞簇檔案
9 $Secure 安全檔案
10 $UpCase 大寫檔案
11 $Extend metadata directory 擴充中繼資料目錄
12 $Extend/$Reparse 重解析點檔案
13 $Extend/$UsnJrnl 變更日志檔案
14 $Extend/Quota 配額管理檔案
15 $Extend/$ObjId 對象ID檔案
16-23 保留
23+ 使用者檔案和目錄

4.3 MFT的結構:

偏移 長度 屬性
00 4 标志,一定是‘FILE'
04 2 更新序列US的偏移
06 2 更新序列号USN的大小與數組,包括第一個位元組
08 8 日志檔案序列号
10 2 序列号(SN)
12 2 硬連接配接數
14 2 第一個屬性的偏移位址
16 2 标志,1表示記錄正在使用,2表示該記錄為目錄
18 4 記錄頭和屬性的總長度,即檔案記錄的實際長度
1C 4 總共配置設定給記錄的長度
20 8 基本檔案記錄中的檔案索引号
28 2 下一屬性ID
2A 2 Windows XP中使用,邊界
2C 4 Windows XP中使用,檔案記錄号

4.4 标準索引頭結構:

偏移 長度 屬性
00 4 總是‘INDEX'
04 2 更新序号偏移
06 2 更新序列号USN的大小與排列,包括第一個位元組
08 8 日志檔案序列号LSN
10 8 該索引緩沖在索引配置設定中的索引VCN
18 4 索引入口偏移(相對18)
1C 4 索引入口的大小(相對18)
20 4 索引入口的配置設定大小(相對18)
24 1 非頁級接點為1(有子索引)
25 3 總是0
28 2 更新序列号
2A 2S-2 更新序列排列

4.5 常用索引表:

名稱 索引 說明
$I30 檔案名 目錄使用
$SDH 安全描述 $Secure
$SII 安全IDS $Secure
$O 對象Ids $ObjId
$O 所有者 $Quota
$Q 配額 $Quota
$R 重解析點 $Reparse

4.6 NTFS卷上常用的屬性說明:

屬性名 屬性描述
$VOLUME_INFORMATION 卷資訊,僅存在于$Volume中繼資料檔案中
$VOLUME_NAME 卷名稱或辨別,僅存在于$Volume中繼資料檔案中
$STANDARD_INFORMATION 标準資訊,包括基本檔案屬性,如隻讀、存檔;時間标記;有多少目錄指向本檔案(即硬連接配接數)
$FILE_NAME 檔案名,以Unicode表示
$SECURITY_DESCRIPTOR 安全描述符。(2000/XP将所有的檔案安全描述符放在$Secure中繼資料檔案中,早期版本将它與檔案目錄放在一起)
$DATA 檔案資料
$INDEX_ROOT 索引根
$INDEX_ALLOCATION 索引配置設定
$BITMAP 位圖
$ATTRIBUTE_LIST 屬性清單
$OBJECT_ID 對象ID:一個具有64個位元組的辨別符,其中最低16位元組對卷來說是唯一的
$REPARSE_POINT 重解析點
$EA 擴充屬性
$EA_INFORMATION 擴充屬性資訊
$LOGGED_UTILITY_STREAM EFS加密屬性