首页 > 代码库 > NTFS 文件系统基础知识

NTFS 文件系统基础知识

        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 个簇的空间。

        行串计算的偏移是相对的,且是有符号的,第二个行串的偏移是根据第一个行串的偏移得来的。即拿第二个行串的偏移加上第一个行串的偏移,才得到第二个行串的真正偏移。

NTFS 文件系统基础知识