|
看到坛子上有不少朋友在手工定位文件时,遇到90属性和A0属性的问题,特分享一下个人经验,相信看完以下内容,会有收获!
详细了解0X90属性中的索引头和索引部分。
偏移 大小 意义
0X00 4 属性号
0X04 4 属性长度
0X08 1 常驻标志
0X09 1 名称长度
0X0A 2 名称偏移
0X0C 2 标志(常驻属性不能压缩)
0X0E 2 属性ID
0X10 4 属性长度(不含头)
0X14 2 属性偏移
0X16 1 索引标志
0X17 1 填充
0X18 8 属性名
0X20 4 索引属性类型
0X24 4 排序规则
0X28 4 索引项分配大小
0X2C 1 每索引记录的簇数
0X2D 3 填充
0X30 4 每索引的偏移
0X34 4 索引项的总大小
0X38 4 索引项的分配
0X3C 1 标志,(0X01大索引)
0X3C 3 填充
表11 索引根属性中索引头部分结构
偏移 大小 意义
0X00 8 文件的MFT记录号
0X08 2 索引项大小
0X0A 2 名称偏移
0X0C 4 索引标志+填充
0X10 8 父目录的MFT文件参考号
0X18 8 文件创建时间
0X20 8 文件修改时间
0X28 8 文件最后修改时间
0X30 8 文件最后访问时间
0X38 8 文件分配大小
0X40 8 文件实际大小
0X48 8 文件标志
0X50 1 文件名长度(F)
0X51 1 文件名命名空间
0X52 2F 文件名(填充到8字节)
0X52+2F P
0X52 +P+2F 8 子节点索引缓存的VCL
表12 索引项结构
索引根属性就是由索引头和这一个个的索引项组成。每个索引项对应一个文件。当文件被删除,索引项也会随之消失。
那么您还记不记得,索引根属性是在MFT记录里的。当索引项越来越多,1K的空间当然无法存储该属性的。那么这个时候,NTFS系统是如何处理的呢?
也许,您会想到,它可能和数据流的方法一样。通过数据运行索引到外部的数据区。如果您想到这一层,那么恭喜您,您已经开始熟悉NTFS系统。NTFS的确是这么做的。但是,与数据属性(0X80)有一点小小的区别。它并非简单的在0X90属性中添加一个运行。这是因为目录可能很大,而通过目录查找文件需要一个有效的算法。NTFS中,系统利用B+树的方法查找文件(这是一个较为复杂的问题,后面有详细介绍)。于是,当索引项太大,不能全部存储在MFT记录中时,就会有两个附加的属性出现:索引分配属性(0XA0),用于描述B+树目录的子节点;索引位图属性(0XB0),用于描述索引分配属性使用的虚拟簇号。我需要保存在MFT外部的索引称作“外部索引”。0XA0属性的结构与0X80属性完全一致。因此您可以参见表9。我们把这种有0XA0属性的目录称作大目录。大目录的MFT记录可能如下(在此只提出重要的属性,真实的MFT记录可能还包含别的属性)
属性头
0X10属性头
0X10属性
0X30属性头
0X30属性
0X90属性头(索引头)
0X90属性 (可能为空,也可能含有子项目。为1级节点)
注意:90H属性的最后8位是它的子节点VCN,可以根据该簇号和运行定位它的子节点。
0XA0属性头
0XA0属性
0XB0属性头
0XB0属性
FF FF FF FF 82 79 47 11
表12 大目录典型MFT记录
0XA0属性的运行记录了外部索引分配的空间。目录的外部索引是以一个索引块为单位分配的(与簇的概念类似)。一般来说,一个索引块占4K的空间。索引块以“INDEX”开头,其头部的固定结构如下:
偏移 大小 意义
0X00 4 INDEX
0X04 2 更新序列号的偏移
0X06 2 更新序列号与更新数组(以字节为单位)
0X08 8 日志文件序列号
0X10 8 本索引缓存在索引分配中的VCN
0X18 4 索引项的偏移(以字节为单位,相对0x18偏移到索引项)
0X1C 4 总的索引项的大小(相对0X18偏移到结尾)
0X20 4 索引项分配大小
0X24 1 如果不是叶节点,置1,表示还有子节点
0X25 3 用0填充
0X28 2 更新序列(重要:与每扇区最后2个字节的值一致)
0X2A 2S-1 更新序列数组
表13 索引区头部结构
索引块头部之后,连接的是索引目录项,其结构与前面介绍的索引项目是一致的。这里不重复介绍。
3.2 文件的查找方式
文件的索引延展到外部是分层次的。其层级结构图如下。
理论上说,3级目录可以容纳几千个文件。已经足够满足现在的需求。
简单的介绍一下目录的生成方式。目录一定是从小目录到大目录(因为文件需要一个个的拷贝)。小目录的结构很简单,前面也已经做了详细的分析。此时再不断增加文件,目录会有以下几个步骤的变化。
1、 一级大目录(仅有一个索引块)
索引块既是叶节点。它的VCL为0。一个索引块只能存放20-30个文件。索引块中的索引项,以文件名按照字母大小排列。
2、 二级大目录(有多个索引块)
当文件继续增加,一个索引块不能满足要求,此时再增加一个索引块,VCL为1,并在0X90属性中增加一个索引项目,为了描述,我把这个项目叫做基点。仍然对所有的项目按字母大小排序,其字母比基点小的排在VCL为0的索引块中,否则排在VCL为1的索引块中。当文件继续增加,会再次开辟一个VCL为2的索引块,工作方式同上。
3、三级大目录
二级目录有一个限制,那就是,每增加一个索引块,0X90属性就要增加一个项目。而0X90属性是在MFT中,其大小有限制,因此,不能无限的扩大二级目录。此时,系统很聪明地把一个外部的索引块当做基点。索引块的头部0X24的值置1,表示不是叶节点。
NTFS的目录结构是一个很复杂的部分,总的来说是利用平衡B+树的方式来安排每一个目录项的,但是,也不是标准的。您可以借助winhex进一步分析NTFS的目录结构。
四 总结
现在,相信您已经对NTFS磁盘格式有一个大致的了解了,您会发现,FAT格式的是如此之简陋和无效率。想象一下,对文件的查询,NTFS的目录结构(包含排序)将会节约多少时间!
这里只是简单介绍了NTFS的底层磁盘结构,WINDOWS还为它量身定做了磁盘的自修复等功能,有兴趣的朋友还可以研究。
|
|