解讀NTFS

NTFS是一個比FAT複雜的多的文件系統,我們一起努力來把它完整的解讀出來。
        NTFS 的引導扇區也是完成引導和定義分區參數,和FAT分區不同,FAT分區的BOOT記錄正常,就顯示分區沒有錯誤,即使文件不正確,而NTFS分區的 BOOT不是分區的充分條件,它要求必須MFT中的系統記錄如$MFT等正常該分區才能正常訪問。其BPB參數如下表所示。
        字節偏移 長度 常用值 意義
        0x0B 字 0x0002 每扇區字節數
        0x0D 字節 0x08 每簇扇區數
        0x0E 字 0x0000 保留扇區
        0x10 3字節 0x000000 總爲0
        0x13 字 0x0000 NTFS未使用,爲0
        0x15 字節 0xF8 介質描述
        0x16 字 0x0000 總爲0
        0x18 字 0x3F00 每磁盤扇區數
        0x1A 字 0xFF00 磁頭數
        0x1C 雙字 0x3F000000 隱含扇區
        0x20 雙字 0x00000000 NTFS未使用,爲0
        0x28 8字節 0x4AF57F0000000000 扇區總數
        0x30 8字節 0x0400000000000000 $MFT的邏輯簇號
        0x38 8字節 0x54FF070000000000 $MFTMirr的邏輯簇號
        0x40 雙字 0xF6000000 每MFT記錄簇數
        0x44 雙字 0x01000000 每索引簇數
        0x48 8字節 0x14A51B74C91B741C 卷標
        0x50 雙字 0x00000000 檢驗和
        MFT中的文件記錄大小一般是固定的,不管簇的大小是多少,均爲1KB。文件記錄在MFT文件記錄數組中物理上是連續的,且從 0開始編號,所以,NTFS是預定義文件系統。MFT僅供系統本身組織、架構文件系統使用,這在NTFS中稱爲元數據(metadata,是存儲在捲上支 持文件系統格式管理的數據。它不能被應用程序訪問,只能爲系統提供服務)。其中最基本的前16個記錄是操作系統使用的非常重要的元數據文件。這些元數據文 件的名字都以“$”開始,所以是隱藏文件,在Windows 2000/XP中不能使用dir命令(甚至加上/ah參數)像普通文件一樣列出。在WINHEX中帶有NFI.EXE,用此工具可以顯示這些記錄與文件的 對應關係,下一次再詳細解釋。
        這些元數據文件是系統驅動程序管理卷所必需的,Windows 2000/XP給每個分區賦予一個盤符並不表示該分區包含有Windows 2000/XP可以識別的文件系統格式。如果主文件表損壞,那麼該分區在Windows 2000/XP下是無法讀取的。爲了使該分區能夠在Windows 2000/XP下能被識別,就必須首先建立Windows 2000/XP可以識別的文件系統格式即主文件表,這個過程可通過高級格式化該分區來完成。Windows以簇號來定位文件在磁盤上的存儲位置,在FAT 格式的文件系統中,有關簇號的指針包含在FAT表中,在NTFS中,有關簇號的指針則包含在$MFT及$MFTMirr文件中。
        NTFS使用邏輯簇號(Logical Cluster Number,LCN)和虛擬簇號(Virtual Cluster Number,VCN)來對簇進行定位。LCN是對整個卷中所有的簇從頭到尾所進行的簡單編號。用卷因子乘以LCN,NTFS就能夠得到捲上的物理字節偏 移量,從而得到物理磁盤地址。VCN則是對屬於特定文件的簇從頭到尾進行編號,以便於引用文件中的數據。VCN可以映射成LCN,而不必要求在物理上連 續。
        在NTFS捲上,跟隨在BPB後的數據字段形成一個擴展BPB。這些字段中的數據使得 Ntldr能夠在啓動過程中找到主文件表MFT(Master File Tabl )。在NTFS捲上,MFT並不象在FAT 16卷和FAT 32捲上一樣,被放在一個預定義的扇區中。由於這個原因,如果在MTF的正常位置中有壞扇區的話,就可以把MFT移到別的位置。但是,如果該數據被破壞, 就找不到MFT的位置,Windows 2000假設該卷沒有被格式化。
        因此,如果一個ntfs的卷提示未格式化,可能並未破壞MFT,依據BPB的各字段的意思是可以重建BPB的。
        NTFS的缺省簇的大小
        卷大小                                      每簇的扇區         缺省的簇大小 
        小於等於512MB                                      1                   512字節 
        513MB~1024MB(1GB)                          2                 1024字節(1KB) 
        1025MB~2048MB(2GB)                        4                 2048字節(2KB)
        大於等於2049MB                                    8                                    4KB
        從上面可以看出,也就是說不管驅動器多大 NTFS 簇的大小不會超過 4KB
        NTFS文檔:文檔屬性定義
        每個文檔屬性都由以下部分組成:
        一個由該屬性的實際值組成的被稱爲“流”的重要的字節序列,元數據可訪問該流。
        文件中的每個文件屬性都可能會有一個名字:在這種情況下,在命令行方式下可以通過語法“文件名:屬性名”來訪問該流(這也是文 件名中不能使用“:”的原因)。Windows NT® 使用以下在元數據文件$AttrDef中預定義的文件屬性列表(一般會有一個未命名流,爲缺省流,未命名流只能有一個,而命名流可以有多個,NTFS支持 多流文件):
        10 $STANDARD_INFORMATION (標準信息)
        20 $ATTRIBUTE_LIST (屬性列表)
        30 $FILE_NAME (文件名)
        40 $VOLUME_VERSION (卷版本)
        50 $SECURITY_DEscriptOR (安全描述符)
        60 $VOLUME_NAME (卷名)
        70 $VOLUME_INFORMATION (卷信息)
        80 $DATA (數據)
        90 $INDEX_ROOT (索引根)
        A0 $INDEX_ALLOCATION (索引分配)
        B0 $BITMAP (位圖)

        C0 $SYMBOLIC_LINK(符號鏈接)
        D0 $EA_INFORMATION (?信息)
        E0 $EA
        屬性流結構
        每個文件屬性都分爲兩部分:儘管這兩部分屬性在文件記錄的屬性列表中以倒序方式進行記錄,但是爲了更好的理解它,讓我們按下面的順序進行介紹: 

        內容部分:
        它的結構總是以屬性名開始(N字節長),在屬性名之後定義該屬性是否爲常駐屬性。當文件屬性的數據流就存儲在其屬性名後時,它 就是常駐屬性,這樣,對於那些流較小且不會增長的文件屬性就可以提供更佳的訪問次數。如果一個文件屬性是非常駐的,那麼其流就存儲在一個或多個擴展或稱爲 運行中。運行是一個在邏輯簇號上連續的區域。爲訪問這些運行,NTFS緊跟在文件屬性名後存儲有一個稱爲運行列表的表。
        頭部:
        從頭部開始的偏移長度描述:
        0 4 Type (類型)
        4 4 Length (長度)
        8 1 Non-resident flag (非常駐標誌)
        9 1 N=Name length (文件名長度)
        A 2 Offset to the content part (相對內容部分的偏移值)
        C 2 Compressed flag (壓縮標誌)
        E 2 Identificator (標識)
        文件名長度:
        00 表示文件屬性沒有命名。 
        壓縮標誌:在NTFS中,數據壓縮是在文件屬性級別上實現的,這就意味着,如果出現意外,你也不會釋放出很多的數據。這樣,儘管只是對文件進行壓縮,但壓縮文件同時就意味着其屬性數據也一樣被壓縮。從現在開始, 其頭部的安排依賴文件的常駐屬性:
        對一個常駐屬性來說,從頭部開始的偏移描述如下:
        10 4 Length of the stream (流長度)
        14 2 Offset to the stream (流偏移)
        16 2 Indexed flag (索引標誌)
        索引標誌:
        文件屬性通過一個索引入口進行索引。
        對於一個非常駐的文件屬性,從頭部開始的偏移描述如下:
        10 8 Starting VCN (起始VCN)
        18 8 Last VCN (結束VCN)
        20 2 Offset to the runlist (運行列表偏移)
        22 2? Number of compression engine ? (壓縮引擎號)
        28 8 Allocated size of the stream (爲流分配的單元大小)
        30 8 Real size of the stream (實際的流大小)
        38 8 Initialized data size of the stream (流已初始化大小)
        VCN :Virtual Cluster Number(虛擬簇號)的縮略詞。VCN是一個與非常駐屬性相關聯的概念。VCN從文件屬性流的第一個運行的第一個簇(VCN 0)到最後一個運行的最後一個簇進行編號。 當某個運行列表非常大,文件屬性不能放在一個文件記錄中時,描述文件的文件屬性就會存儲在幾個文件記錄中,運行列表也分成幾個小片。起始VCN域和結束 VCN域都用於定位其文件記錄指示—即運行列表—運行所指定的VCN 。
        注:如果屬性可以放在一個文件記錄內,則結束VCN域(這種情況下沒有使用)可能是“00 00 00 00 00 00 00 00”。
        壓縮引擎的數量:
        爲達到最好的壓縮比率,NTFS可以根據不同類型的數據使用不同的壓縮引擎。當前的壓縮引擎使用值04。
        爲流分配的單元大小:
                它幾倍於捲上用來存儲文件屬性流所描述的分配空間。
                如果流沒有壓縮,它就是數倍於簇空間大小的實際大小,相反,則比較小。
        流的實際大小:
                文件屬性流在壓縮前的大小。 
        流的初始化大小: 
                這是文件屬性流的壓縮後的大小(總是低於分配大小)。如果此流未被壓縮,就是它的實際大小 。
        注意: 
                常駐文件屬性從不被壓縮(也沒有壓縮引擎號域),因爲它的流太小。
        信息是足夠的:名字長+內容部分的偏移值 =到流的偏移值(常駐屬性)或者到運行列表的偏移值(非常駐悔改)。
 
NTFS文件系統結構分析
        在NTFS文件系統中,文件存取是按簇進行分配,一個簇必需是物理扇區的整數倍,而且總是2的整數次方。NTFS文件系統並不 去關心什麼是扇區,也不會去關心扇區到底有多大(如是不是512字節),而簇大小在使用格式化程序時則會由格式化程序根據卷大小自動的進行分配。
        文件通過主文件表(MFT)來確定其在磁盤上的存儲位置。主文件表是一個對應的數據庫,由一系列的文件記錄組成--卷中每一個文件都有一個文件記錄(對於大型文件還可能有多個記錄與之相對應)。主文件表本身也有它自己的文件記錄。
        NTFS捲上的每個文件都有一個64位(bit)稱爲文件引用號(File Reference Number,也稱文件索引號)的唯一標識。文件引用號由兩部分組成:一是文件號,二是文件順序號。文件號爲48位,對應於該文件在MFT中的位置。文件 順序號隨着每次文件記錄的重用而增加,這是爲NTFS進行內部一致性檢查而設計的。
        NTFS使用邏輯簇號(Logical Cluster Number,LCN)和虛擬簇號(Virtual Cluster Number,VCN)來進行簇的定位。LCN是對整個卷中所有的簇從頭到尾所進行的簡單編號。卷因子乘以LCN,NTFS就能夠得到捲上的物理字節偏移 量,從而得到物理磁盤地址。VCN則是對屬於特定文件的簇從頭到尾進行編號,以便於引用文件中的數據。VCN可以映射成LCN,而不必要求在物理上連續。
        NTFS的目錄只是一個簡單的文件名和文件引用號的索引,如果目錄的屬性列表小於一個記錄的長度,那麼該目錄的所有信息都存儲在主文件表的記錄中,對於大於記錄的目錄則使用B+樹進行管理。

        主文件表中的基本文件記錄中有一個指針指向一個存儲非常駐索引緩衝--包括該目錄下所有下一級子目錄和文件的外部簇,而B+樹結構便於大型目錄中文件和子目錄的快速查找。
        在NTFS中,所有存儲在捲上的數據都包含在文件中,包括用來定位和獲取文件的數據結構,引導程序和記錄這個卷的記錄(NTFS元數據)的位圖,這體現了 NTFS的原則:磁盤上的任何事物都爲文件。在文件中存儲一切使得文件系統很容易定位和維護數據,而在NTFS中,卷中所有存放的數據均在一個叫做MFT 的文件記錄數組中,稱爲主文件表(Master File Table),MFT是由高級格式化產生的。而MFT則由文件記錄(File Record)數組構成。File Record的大小一般是固定的,不管簇的大小是多少,均爲1KB,這個概念相當於Linux中的inode(i節點)。File Record在MFT文件記錄數組中物理上是連續的,且從0開始編號。MFT僅供系統本身組織、架構文件系統使用,這在NTFS中稱爲元數據 (metadata)。其中最基本的前16個記錄是操作系統使用的非常重要的元數據文件。這些NTFS主文件表的重要的元數據文件都是以$(美元符號)開 始的名字,所以是隱藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah參數)像普通文件一樣列出這些元數據文件。實際上File System Driver(ntfs.sys)維護了一個系統變量NTFS Protect System Files用於隱藏這些元數據。但是微軟公司也提供了一個OEM TOOL,叫做NFI.EXE,用此工具可以轉儲NTFS主文件表的重要的元數據文件(元數據:是存儲在捲上支持文件系統格式管理的數據。它不能被應用程 序來訪問,它只能爲系統提供服務),使用NFI顯示結果如下:
C:/>nfi C: |MORE

        而這些元數據文件文件是系統驅動程序裝配卷所必需的,WINDOWS 2000給每個分區賦予一個盤符並不表示該分區包含有WINDOWS 2000可以識別的文件系統格式,如果一旦主文件表損壞,那麼該分區在WINDOWS 2000下是無法讀取的。爲了使該分區能夠在WINDOWS 2000下能被識別,也就是必須首先建立WINDOWS 2000可以識別的文件系統格式即主文件表,這可通過高級格式化該分區來完成。衆所周知,Windows以簇號來定位文件在磁盤存儲的位置,在FAT格式 的文件系統中有關簇號的指針是包含在FAT表中的,而在NTFS中有關簇號的指針是包含在$MFT及$MFTMirr文件中的。
 
NTFS元文件

 
伴隨着以上這些新增功能的是更多的用於存放與功能相關的數據的元文件。最後,在下面的表中羅列出NTFS5中所有的元文件:

 
        每個MFT記錄都對應着不同的文件,如果一個文件有很多屬性或是分散成很多碎片,就很可能需要多個文件記錄。這時,存放其文件記錄位置的第一個記錄就叫做“基文件記錄”(base file record)。
        MFT中的第1個記錄就是MFT自身。由於MFT文件本身的重要性,爲了確保文件系統結構的可靠性,系統專門爲它準備了一個鏡像文件($MftMirr),也就是MFT中的第2個記錄。
        第3個記錄是日誌文件($LogFile)。該文件是NTFS爲實現可恢復性和安全性而設計 的。當系統運行時,NTFS就會在日誌文件中記錄所有影響NTFS卷結構的操作,包括文件的創建和改變目錄結構的命令,例如複製,從而在系統失敗時能夠恢 復NTFS卷。
        第4個記錄是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一個標明該磁盤是否損壞的標誌位(NTFS系統以此決定是否需要調用Chkdsk程序來進行修復)。
        第5個記錄是屬性定義表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件屬性,並指出它們是否可以被索引和恢復等。
        第6個記錄是根目錄(/),其中保存了存放於該卷根目錄下所有文件和目錄的索引。在訪問了一個文件後,NTFS就保留該文件的MFT引用,第二次就能夠直接進行對該文件的訪問。
        第7個記錄是位圖文件($Bitmap)。NTFS卷的分配狀態都存放在位圖文件中,其中每 一位(bit)代表卷中的一簇,標識該簇是空閒的還是已被分配了的,由於該文件可以很容易的被擴大,所以NTFS的卷可以很方便的動態的擴大,而FAT格 式的文件系統由於涉及到FAT表的變化,所以不能隨意的對分區大小進行調整。
        第8個記錄是引導文件($Boot),它是另一個重要的系統文件,存放着Windows 2000/XP的引導程序代碼。該文件必須位於特定的磁盤位置才能夠正確地引導系統。該文件是在Format程序運行時創建的,這正體現了NTFS把磁盤 上的所有事物都看成是文件的原則。這也意味着雖然該文件享受NTFS系統的各種安全保護,但還是可以通過普通的文件I/O操作來修改。
        第9個記錄是壞簇文件($BadClus),它記錄了磁盤上該卷中所有的損壞的簇號,防止系統對其進行分配使用。
        第10個記錄是安全文件($Secure),它存儲了整個卷的安全描述符數據庫。NTFS文件和目錄都有各自的安全描述符,爲了節省空間,NTFS將具有相同描述符的文件和目錄存放在一個公共文件中。
        第11個記錄爲大寫文件($UpCase,upper case file),該文件包含一個大小寫字符轉換表。
        第12個記錄是擴展元數據目錄($Extended metadata directory)。
        第13個記錄是重解析點文件($Extend/$Reparse)。
        第14個記錄是變更日誌文件($Extend/$UsnJrnl)。
        第15個記錄是配額管理文件($Extend/$Quota)。
        第16個記錄是對象ID文件($Extend/$ObjId)。
        第17~23記錄是是系統保留記錄,用於將來擴展。
        MFT的前16個元數據文件是如此重要,爲了防止數據的丟失,NTFS系統在該卷文件存儲部分的正中央對它們進行了備份,參見下圖。

 
        NTFS把磁盤分成了兩大部分,其中大約12%分配給了MFT,以滿足其不斷增長的文件數 量。爲了保持MFT元文件的連續性,MFT對這12%的空間享有獨佔權。餘下的88%的空間被分配用來存儲文件。而剩餘磁盤空間則包含了所有的物理剩餘空 間--MFT剩餘空間也包含在裏面。MFT空間的使用機制可以這樣來描述:當文件耗盡了存儲空間時,Windows操作系統會簡單地減少MFT空間,並把 它分配給文件存儲。當有剩餘空間時,這些空間又會重新被劃分給MFT。雖然系統盡力保持MFT空間的專用性,但是有時不得不做出犧牲。儘管MFT碎片有時 是無法忍受的,卻無法阻止它的發生。
        那麼NTFS到底是怎麼通過MFT來訪問卷的呢?首先,當NTFS訪問某個卷時,它必須“裝 載”該卷:NTFS會查看引導文件(在圖中的$Boot元數據文件定義的文件),找到MFT的物理磁盤地址。然後它就從文件記錄的數據屬性中獲得VCN到 LCN的映射信息,並存儲在內存中。這個映射信息定位了MFT的運行(run或extent)在磁盤上的位置。接着,NTFS再打開幾個元數據文件的 MFT記錄,並打開這些文件。如有必要NTFS開始執行它的文件系統恢復操作。在NTFS打開了剩餘的元數據文件後,用戶就可以開始訪問該捲了。
 
文件和目錄記錄
        NTFS將文件作爲屬性/屬性值的集合來處理,這一點與其他文件系統不一樣。文件數據就是未命名屬性的值,其他文件屬性包括文件名、文件擁有者、文件時間標記等。下圖顯示了一個用於小文件的MFT記錄。
 
        每個屬性由單個的流(stream)組成,即簡單的字符隊列。嚴格地說,NTFS並不對文件 進行操作,而只是對屬性流進行讀寫。NTFS提供對屬性流的各種操作:創建、刪除、讀取(字節範圍)以及寫入(字節範圍)。讀寫操作一般是針對文件的未命 名屬性的,對於已命名的屬性則可以通過已命名的數據流句法來進行操作。
        一個文件通常佔用一個文件記錄。然而,當一個文件具有很多項屬性值或很零碎的時候,就可能需 要佔用一個以上的文件記錄。這種情況下,第一個文件記錄是其基本的文件記錄,存儲有該文件需要的其它文件記錄的位置。小文件和文件夾(典型的如1500字 節或更少)將全部存儲在文件的MFT記錄裏。

       文件夾記錄包括索引信息,小文件夾記錄完全存儲在MFT結構內,然而大的文件夾則被組織成B+樹結構,用一個指針指向一個外部簇,該簇用來存儲那些MFT內存儲不了的文件夾的屬性。
       NTFS捲上文件的常用屬性在下表中列出(並不是所有文件都有所有這些屬性)。

 
常駐屬性與非常駐屬性
       當一個文件很小時,其所有屬性和屬性值可存放在MFT的文件記錄中。當屬性值能直接存放在 MFT中時,該屬性就稱爲常駐屬性(resident attribute)。有些屬性總是常駐的,這樣NTFS纔可以確定其他非常駐屬性。例如,標準信息屬性和根索引就總是常駐屬性。
       每個屬性都是以一個標準頭開始的,在頭中包含該屬性的信息和NTFS通常用來管理屬性的信息。該頭總是常駐的,並記錄着屬性值是否常駐、對於常駐屬性,頭中還包含着屬性值的偏侈量和屬性值的長度。
       如果屬性值能直接存放在MFT中,那麼NTFS對它的訪問時間就將大大縮短。NTFS只需訪問磁盤一次,就可立即獲得數據;而不必像FAT文件系統那樣,先在FAT表中查找文件,再讀出連續分配的單元,最後找到文件的數據。
       小文件或小目錄的所有屬性,均可以在MFT中常駐。小文件的未命名屬性可以包括所有文件數據。建立一個小文件如下圖所示:
 
該文件的內容



文件屬性
 
        如通過NFI查看文件“新建 文本文檔.txt”的文件記錄號爲36,顯示內容如下:
        File 36
        /新建 文本文檔.txt
        $STANDARD_INFORMATION (resident)
        $FILE_NAME (resident)
        $FILE_NAME (resident)
        $DATA (resident)
        從顯示內容可以看出文件的全部屬性都是常駐屬性,包括DATA屬性,沒有非常駐屬性,所以,用WINHEX打開MFT,查看該文件記錄,有如下圖的內容
 
        小文件的文件記錄
        小目錄的索引根屬性可以包括其中所有文件和子目錄的索引。參見下圖
 
        小目錄的MFT記錄
        大文件或大目錄的所有屬性,就不可能都常駐在MFT中。如果一個屬性(如文件數據屬性)太大而不能存放在只有1KB的MFT文件記錄中,那麼NTFS將從 MFT之外分配區域。這些區域通常稱爲一個運行(run)或一個盤區(extent),它們可用來存儲屬性值,如文件數據。如果以後屬性值又增加,那麼 NTFS將會再分配一個運行,以便用來存儲額外的數據。值存儲在運行中而不是在MFT文件記錄中的屬性稱爲非常駐屬性(nonresident attribute)。NTFS決定了一個屬性是常駐還是非常駐的;而屬性值的位置對訪問它的進程而言是透明的。
        當一個屬性爲非常駐時,如大文件的數據,它的頭部包含了NTFS需要在磁盤上定位該屬性值的有關信息。下圖顯示了一個存儲在兩個運行中的非常駐屬性。 
        存儲在兩個運行中的非常駐屬性
        在標準屬性中,只有可以增長的屬性纔是非常駐的。對文件來說,可增長的屬性有數據、屬性列表等。標準信息和文件名屬性總是常駐的。
        一個大目錄也可能包括非常駐屬性(或屬性部分),參見下圖。在該例中,MFT文件記錄沒有足夠空間來存儲大目錄的文件索引。其中,一部分索引存放在索引根 屬性中,而另一部分則存放在叫作“索引緩衝區”(index buffer)的非常駐運行中。這裏,索引根、索引分配以及位圖屬性都是簡化表示的,這些屬性將在後面詳細介紹。對目錄而言,索引根的頭及部分值應是常駐 的。 

        大目錄的MFT記錄
        當一個文件(或目錄)的屬性不能放在一個MFT文件記錄中,而需要分開分配時,NTFS通過VCN-LCN之間的映射關係來記錄運行(run)或盤區情 況。LCN用來爲整個卷中的簇按順序從0到n進行編號,而VCN則用來對特定文件所用的簇按邏輯順序從0到m進行編號。下圖顯示了一個非常駐數據屬性的運 行所使用的VCN與LCN編號。
 
非常駐數據屬性的VCN
        當該文件含有超過2個運行時,則第三個運行從VCN8開始,數據屬性頭部含有前兩個運行VCN的映射,這便於NTFS對磁盤文件分配的查詢。爲了便於NTFS快速查找,具有多個運行文件的常駐數據屬性頭中包含了VCN-LCN的映射關係,參見下圖

非常駐數據屬性的VCN-LCN映射
        雖然數據屬性常常因太大而存儲在運行中,但是其他屬性也可能因MFT文件記錄沒有足夠空間而需要存儲在運行中。另外,如果一個文件有太多的屬性而不能存放 在MFT記錄中,那麼第二個MFT文件記錄就可用來容納這些額外的屬性(或非常駐屬性的頭)。在這種情況下,一個叫作“屬性列表”(attribute list)的屬性就加進來。屬性列表包括文件屬性的名稱和類型代碼以及屬性所在MFT的文件引用。屬性列表通常用於太大或太零散的文件,這種文件因 VCN-LCN映射關係太大而需要多個MFT文件記錄。具有超過200個運行的文件通常需要屬性列表。
        MFT文件記錄結構分析
        主文件表MFT的文件記錄由記錄頭和屬性列表組成,由“FF FF FF FF”結束,一般大小爲1K,或一個簇大小(這樣一般就更大),記錄頭包括以下一些域:
        偏移     長度(字節)       屬性
        0X00         4                       標誌,一定是“FILE”
        0X04         2                       更新序列US的偏移
        0X06         2                       更新序列號USN的大小與數組,包括第一個字節
        0X08         8                       日誌文件序列號LSN
        0X10         2                       序列號(SN)
        0X12         2                       硬連接數
        0X14         2                       第一個屬性的偏移地址
        0X16         2                       標誌,1表示記錄正在使用,2表示該記錄爲目錄
        0X18         4                       記錄頭和屬性的總長度,即文件記錄的實際長度,
        0X1C         4                       總共分配給記錄的長度
        0X20         8                       基本文件記錄中的文件索引號
        0X28         2                       下一屬性ID
        0X2A         2                       XP中使用,邊界
        0X2C         4                       XP中使用,本文件記錄號
        每次記錄被修改都將導致日誌文件序列號$LogFile Sequence Number(LSN)發生變化。
        序列號Sequence Number(SN)用於記錄主文件表記錄被重複使用的次數。
        硬連接數Hard Link Count記錄硬連接的數目,只出現在基本文件記錄中。
        文件記錄的實際長度是文件記錄在磁盤上實際佔用的字節空間。
        基本文件記錄中的文件索引號,對於基本文件記錄,其值爲0,如果不爲0,則是一個主文件表的文件索引號,指向所屬的基本文件記錄中的文件記錄號,在基本文件記錄中包含有擴展文件記錄的信息,存儲在“屬性列表ATTRIBUTE_LIST”屬性中。
        屬性列表是可變長度區,以“FF FF FF FF”結束,對於1K長度的MFT記錄,屬性列表的起始偏移爲0x30。
        索引記錄結構分析
        第一個索引記錄都是由一個標準的索引頭和一些包含索引鍵和索引數據的塊組成的。索引記錄的大小在引導記錄 $Boot中定義,一般總是4KB。
        標準索引頭的結構如下:
        偏移     大小        說明
        0X00   4              總是“INDX”
        0X04   2              更新序號偏移
        0X06   2              更新序列號USN的大小與排列,包括第一個字節
        0X08   8             日誌文件序列號LSN
        0X10   8             該索引緩衝在索引分配中的索引VCN
        0X18   4             索引入口的偏移(相對於0X18)
        0X1C   4            索引入口的大小(相對於0X18)
        0X20   4             索引入口的分配大小(相對於0X18)
        0X24   1             非頁級節點爲1(有子索引)
        0X25   3             總是0
        0X28   2             更新序列號
        0X2A   2S-2       更新序列排列
        常用索引列表
        名稱                        索引               說明
        $I30                        文件名            目錄使用
        $SDH                     安全描述        $SECURE
        $SII                         安全IDS         $SECURE
        $O                          對象IDS          $OBJID
        $O                          所有者IDS      $QUOTA
        $Q                          配額                 $QUOTA
        $R                          重解析點         $REPARSE
        再具體的就不再分析了,請自己查找操作系統的資料。
發佈了2 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章