1. NTFS 中所有都是文件,包括無數據,都是以文件形式進行訪問。
元數據文件包括:
$Mft $MftMirr $LogFile $Volume $AttrDef $BitMap $Boot $BadClus $Quota $UpCase $Cairo。
2. 普通文件(目錄)的信息都是通過屬性/值對來表示的。
3. $MFT 中記錄了所有文件的文件記錄,文件記錄大小一般為 1K。也就是每個文件都會在 $MFT 文件中存放一份記錄,且這個文件記錄一般為 1K 大小。
文件記錄里一般也是屬性-值對來組織。
4. 文件屬性包括
#define$UNUSED (0X0)
#define$STANDARD_INFORMATION (0x10)
#define$ATTRIBUTE_LIST (0x20)
#define$FILE_NAME (0x30)
#define$OBJECT_ID (0x40)
#define$SECURITY_DESCRIPTOR (0x50)
#define$VOLUME_NAME (0x60)
#define$VOLUME_INFORMATION (0x70)
#define$DATA (0x80)
#define$INDEX_ROOT (0x90)
#define$INDEX_ALLOCATION (0xA0)
#define$BITMAP (0xB0)
#define$SYMBOLIC_LINK (0xC0)
#define$EA_INFORMATION (0xD0)
#define$EA (0xE0)
#ifdef_CAIRO_
#define$PROPERTY_SET (0xF0)
#endif // _CAIRO_
#define$FIRST_USER_DEFINED_ATTRIBUTE (0x100)
#define $END (0xFFFFFFFF)
5. 如果一個數據屬性太大而導致一個文件記錄不夠存儲,則會使用行串(run)來組織,一般一個文件的數據就是由這些行串表來組織起來的。對于非數據屬性,也可以這么做。
其實準確地說,并不一定是一個數據屬性,而是一個非駐留屬性,即文件記錄并不能記錄一個屬性的所有內容時,那么文件記錄中只會保留屬性頭和行串信息,在數據區域里,這些行串信息所代表的數據,才表示這個屬性。
6. 如果一個文件記錄不能存儲下所有屬性或屬性頭,也就是一個文件的屬性太多時(常常是因為數據區太碎,導致屬性頭中的行串太多),則其它屬性會分配其它文件記錄來存儲,在 $ATTRIBUTE_LIST 里面會有串聯信息(文件引用)。那么第一個 MFT 記錄被稱為 base file record。
7. 文件(記錄)引用:指該文件在 MFT 中的位置。
8. 文件目錄,對于小的文件目錄,它的子文件及目錄的文件引用信息被存放在 $INDEX_ROOT 屬性中(不是 $DATA),對于大目錄,用 B-樹用來存放這些信息。B-樹中的每一項,除了包含文件名(目錄名)外,還包含相應的文件記錄引用以及時間戳和大小等。$INDEX_ALLOCATION 記錄了這些緩沖的行串信息。位圖屬性記錄中緩沖區中哪些 VNC 被使用。所以 $INDEX_ROOT, $INDEX_ALLOCATION, $BITMAP 構建了這個 B-樹。
9. $INDEX_ALLOCATION 記錄了目錄項的所有行串。
10. 行串表示為<Header Length Offset> ,表達式為 <0xXY Legnth(占用 x 個簇) Offset(y 起始簇號)>,比如: 0x31 0x06 0x12 0x34 0x56 ,表示 Length 為一個字節,偏移為 3 個字節,即表示從 簇號為 0x563412 開始的 0x06 個簇的空間。
行串計算的偏移是相對的,且是有符號的,第二個行串的偏移是根據第一個行串的偏移得來的。即拿第二個行串的偏移加上第一個行串的偏移,才得到第二個行串的真正偏移。
下一篇 AHCI模式安裝XP以及驅動下載