Может ли файл NTFS $MFT иметь дочерние записи?

Я пишу некоторый код для анализа через MFT на диске в томах NTFS. Это просто, но один конкретный угловой случай попался мне на глаза, и я не могу найти четкого ответа в Интернете.

Для обычных файлов в NTFS можно иметь несколько записей MFT для одного файла, если файл имеет больше атрибутов, чем может поместиться в одной записи (например, много атрибутов $FILE_NAME, если файл имеет много жестких ссылок или много Атрибуты $DATA, если у него много альтернативных потоков данных).

Файл $MFT со ссылочным номером 0 содержит прогоны данных для самого MFT. Обычно это одна запись без детей. Возможно ли, чтобы файл $MFT имел дочерние записи? Если бы это было возможно, как бы вы узнали, где их найти? Должны ли эти дочерние записи храниться с очень низкими ссылочными номерами, чтобы вы могли надежно добраться до них, не анализируя уже $MFT, чтобы узнать, где они находятся на диске?

3 ответа

Существует специальный тип атрибута, который называется $ATTRIBUTE_LIST, Файл или каталог может иметь до 65536 атрибутов, и они не могут вписаться в одну запись MFT. В основном он содержит список всех атрибутов файла, кроме него самого. Каждая запись в списке содержит тип атрибута и ссылку MFT о том, где найти атрибут. Для этого и используется поле ссылки на базовый файл в заголовке записи файла.

Если список становится слишком большим для записи MFT, атрибут может стать нерезидентным, и список будет найден путем интерпретации прогона данных атрибута.

Потому что тип $ATTRIBUTE_LIST 32, он обычно размещается сразу после $STANDARD_INFORMATION атрибут и будет содержать атрибуты с большими типами (например, $FILE_NAME или же $DATA).

Когда файл становится очень фрагментированным, $DATA список запуска атрибута не помещается в одну запись MFT. Это также тот случай, когда $ATTRIBUTE_LIST будет использоваться для хранения $DATA атрибут в нескольких записях.

$MFT запись редко имеет эту проблему, так как распределение алогрита предназначено для предотвращения этого. Но если $MFT для тома становится очень фрагментированным, он может иметь более одной записи, чтобы сохранить его $DATA,

тл;др: да; Я считаю, что это то, что ERROR_DISK_TOO_FRAGMENTED/ предназначены для.

Чтобы уточнить:

Файл MFT наверняка может иметь дочерние записи. Если вам нужно построить что-то подобное, просто откройте \$MFT(сделайте это на RAM-диске, если не хотите испортить физический том...), а затем FSCTL_MOVE_FILEкаждую запись, чередуя начало и конец тома. Вы серьезно фрагментируете MFT и заставляете его генерировать , так что он больше не будет вписываться даже в последние 4 из 16 исходных записей. Он переполнится в более поздние слоты.

Однако логика подсказывает, что MFT должен быть самозагружаемым. Таким образом, я могу только заключить, что каждый дочерний элемент, описанный записью, должен находиться в слоте из предыдущего экстента. Таким образом, можно столкнуться с ситуацией, когда на томе достаточно свободного места для расширения MFT, но нет свободных слотов для описания следующего экстента MFT. Я думаю, что это одна из ситуаций, когда водитель вернется STATUS_MFT_TOO_FRAGMENTED.

Удачи в написании эффективного синтаксического анализатора для этого, это довольно утомительно.

(nb Возможно, но сложнее фрагментировать $ATTRIBUTE_LISTсебя тоже. Но я читал , что его список выполнения должен умещаться в одну запись, так что это накладывает жесткое ограничение на количество фрагментов.)

Да точно.

Я оказался на диске с 18-гигабайтным файлом $MFT. Поскольку Windows разбивает файл $MFT на фрагменты размером 200 МБ, в записи №1 файла $MFT не хватило места для хранения всех наборов данных внутри атрибута $Data.

Я нашел их в файловой записи №15 (одна из «неиспользуемых» файловых записей, если вы прочитали всю документацию по NTFS в Интернете). Эта запись файла содержала заголовок и единственный атрибут $Data (0x80) со 104 (!) запусками данных.

Другие вопросы по тегам