我正在编写一些代码来解析NTFS卷中磁盘上的MFT。这很简单,但有一个特殊的角落案例引起了我的注意,我在互联网上找不到明确的答案。
对于NTFS中的普通文件,如果文件具有的属性多于单个记录所能容纳的属性(例如,如果文件具有许多硬链接,则具有多个$FILE_NAME属性;或者,如果文件具有许多备用数据流,则具有许多$DATA属性),则单个文件可以具有多个MFT记录。
参考号为0的$MFT文件保存了MFT本身的数据运行。通常情况下,它是没有子项的单个记录。$MFT文件可以有子记录吗?如果有可能,你怎么知道在哪里可以找到它们?这些子记录是否必须以非常低的引用编号存储,以便您可以可靠地访问它们,而不必解析$MFT以了解它们在磁盘上的位置?
发布于 2015-06-04 22:10:05
有一种特殊类型的属性,称为$ATTRIBUTE_LIST。一个文件或目录最多可以有65536个属性,它们不可能包含在单个MFT条目中。它基本上包含文件的所有属性的列表,除了他自己。列表中的每个条目都包含属性类型和查找该属性的位置的MFT引用。这就是文件记录头中的基本文件引用字段的作用。
如果列表对于MFT条目来说太大,则该属性可能会变得非常驻留,并且将通过解释该属性的数据运行来找到该列表。
因为$ATTRIBUTE_LIST的类型是32,所以它通常放在$STANDARD_INFORMATION属性之后,并且将包含具有更大类型的属性(如$FILE_NAME或$DATA)。
当文件变得非常零碎时,$DATA属性运行列表将无法放入单个MFT条目中。这也是使用$ATTRIBUTE_LIST在多个条目中存储$DATA属性的情况。
$MFT条目很少会出现这种问题,因为分配算法就是为了防止这种情况而设计的。但是,如果一个卷的$MFT变得非常碎片化,它可以有多个条目来存储它的$DATA。
发布于 2021-01-28 21:47:51
是的,我相信这就是ERROR_DISK_TOO_FRAGMENTED/STATUS_MFT_TOO_FRAGMENTED的用途。
详述:
MFT文件几乎肯定会有子记录。如果您需要构建这样的卷,只需打开\$MFT (在内存磁盘上执行,除非您想弄乱一个物理卷……)然后FSCTL_MOVE_FILE每个条目,在卷的开始和结束之间交替。您将严重分割MFT并使其生成一个$ATTRIBUTE_LIST,这样它甚至不再适合16条初始记录中的最后4条记录。它会溢出到后面的插槽中。
然而,逻辑规定MFT需要是可引导的。因此,我只能得出结论,$ATTRIBUTE_LIST条目所描述的每个子项都必须位于前一个盘区的插槽中。因此,可能会遇到这样一种情况:卷有足够的空闲空间来增长MFT,但没有空闲插槽来描述MFT的下一个扩展区。我认为这是一种驱动程序会返回STATUS_MFT_TOO_FRAGMENTED的情况。
祝你好运,为这个写一个高效的解析器,它相当乏味。
(注:分割$ATTRIBUTE_LIST本身也是可能的,但也比较困难。但是我read它的运行列表必须放在一条记录中,所以这对片段的数量施加了硬限制。)
https://stackoverflow.com/questions/30424102
复制相似问题