NTFS $ MFT文件可以有子记录吗?

时间:2015-05-24 13:34:47

标签: file ntfs ntfs-mft

我正在编写一些代码来解析NTFS卷中磁盘上的MFT。这很简单,但是一个特殊的角落案件引起了我的注意,我无法在互联网上的任何地方找到明确的答案。

对于NTFS中的普通文件,如果文件的属性多于单个记录中的属性,则可以为单个文件提供多个MFT记录(例如,如果文件具有多个硬链接,则可以使用多个$ FILE_NAME属性) ,如果它有许多备用数据流,则为多个$ DATA属性。

引用号为0的$ MFT文件保存了MFT本身的数据运行。通常它是一个没有孩子的单一记录。 $ MFT文件是否可以拥有子记录?如果有可能,你怎么知道在哪里找到它们?这些子记录是否必须以非常低的参考号存储,以便您可以可靠地访问它们而无需已经解析$ MFT已知它们在磁盘上的位置?

2 个答案:

答案 0 :(得分:3)

有一种称为$ATTRIBUTE_LIST的特殊属性。文件或目录最多可包含65536个属性,并且它们不可能适合单个MFT条目。它基本上包含除自己之外的所有文件属性的列表。列表中的每个条目都包含属性类型以及查找属性的位置的MFT参考。这就是文件记录头中的基本文件引用字段的用途。

如果列表对于MFT条目来说太大,则该属性可以变为非驻留,并且可以通过解释属性的数据运行来找到列表。

由于$ATTRIBUTE_LIST的类型为32,因此它通常位于$STANDARD_INFORMATION属性之后,并且将包含具有更多类型的属性(例如$FILE_NAME$DATA)。

当文件变得非常碎片化时,$DATA属性运行列表将不适合单个MFT条目。这也是$ATTRIBUTE_LIST将用于在多个条目中存储$DATA属性的情况。

$MFT条目很少出现此问题,因为分配算法旨在防止这种情况。但是,如果卷的$MFT变得非常碎片,则可以有多个条目来存储它的$DATA

答案 1 :(得分:1)

tl;dr:是的;我相信这就是 class yourController extends Controller { public function loadViewData(){ $viewData = []; // Check for flash errors if (session('error')) { $viewData['error'] = session('error'); $viewData['errorDetail'] = session('errorDetail'); } // Check for logged on user if (session('userName')) { $viewData['userName'] = session('userName'); $viewData['userEmail'] = session('userEmail'); $viewData['userTimeZone'] = session('userTimeZone'); } return $viewData; /ERROR_DISK_TOO_FRAGMENTED 的用途。

详细说明:

MFT 文件肯定可以有子记录。如果您需要构建这样的一个,只需打开 STATUS_MFT_TOO_FRAGMENTED(在 RAM 磁盘上进行,除非您想弄乱物理卷...)然后 \$MFT 每个条目,在开头之间交替和卷的结尾。您将严重分割 MFT 并使其生成 FSCTL_MOVE_FILE,这样它甚至不再适合 16 个初始记录中的最后 4 个。它将溢出到后面的插槽中。

然而,逻辑规定 MFT 需要可引导。因此,我只能得出结论,$ATTRIBUTE_LIST 条目描述的每个子项都必须位于前一个范围的槽中。因此,可能会遇到这样的情况:卷有足够的可用空间来增长 MFT,但没有可用插槽来描述 MFT 的下一个范围。我认为这是驱动程序返回 $ATTRIBUTE_LIST 的一种情况。

祝你好运为此编写一个高效的解析器,这相当乏味。

(nb 对 STATUS_MFT_TOO_FRAGMENTED 本身进行分段也是可能的但更难。但是我 read 其运行列表必须适合单个记录,因此这对分段的数量施加了硬限制.)