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 个簇的空间。
行串计算的偏移是相对的,且是有符号的,第二个行串的偏移是根据第一个行串的偏移得来的。即拿第二个行串的偏移加上第一个行串的偏移,才得到第二个行串的真正偏移。