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文件系统中,每一个文件或目录都拥有一个MFT记录,MFT记录中记录了文件或目录的基本信息,对于普通文件来说,一般拥有文件序号,文件名,创建时间,文件大小,文件属性,文件数据地址索引等基本文件信息,而一个目录除了拥有基本文件信息,还拥有其目录下的文件索引项信息,文件与其父目录之间通过该文件的MFT记录中的父目录信息和目录中的索引项来建立隶属关系,这两种信息唯一地确定了文件与父目录之间的对应关系,由此可知,要在一个指定目录下生成一个文件,除了要创建目标文件本身的MFT记录,还需在其父目录的MFT记录或者其索引分配中建立目标文件的索引。在NTFS系统中,文件索引是一个比较复杂的内容,文件的索引采用了树型结构,这给NTFS系统带来了查找文件速度快的优点,但却给当索引结点增加或减少时,如何维护树的平衡带来了难题。在NTFS系统中,小目录的索引直接存放在目录本身MFT记录的90H属性中,而大目录的索引则需另外开辟新的索引分配区来存放相关的索引。原程序中只考虑了小目录的情况,即将文件的索引直接存放在90H属性中,并不考虑大目录的索引情况。除此之外,NTFS系统对于每一个文件操作都会写入日志文件中,以便一致性检查,但由于这方面的内容尚未研究清楚,本程序中也未涉及这方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值