Файловая система NTFS извне и изнутри

       

структура файловой записи


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

Следом за сигнатурой идет 16-разрядный указатель, содержащий смещение последовательности обновления (update sequence, см. "последовательности обновления"). Под "указателем" здесь и до конца раздела подразумевается смещение от начала сектора, отсчитываемое от нуля и выраженное в байтах. В NT и W2K это поле всегда равно 002Ah, поэтому для поиска файловых записей можно использовать сигнатуру "FILE*\x00", что уменьшает вероятность ложных срабатываний. Правда, в XP и более старших системах, последовательность обновления хранится по смещению 002Dh и поэтому сигнатура приобретает следующий вид "FILE-\x00".

Размер заголовка (кстати сказать, варьирующийся от одной операционной системы к другой) в явном виде нигде не хранится, вместо этого в заголовке присутствует указатель на первый атрибут, содержащий его смещение в байтах относительно начала FILE Record, расположенный по смещению 14h байт от начла сектора. Смещения последующих атрибутов (если они есть) определяются путем сложения размеров всех предыдущих атрибутов (размер каждого из атрибутов содержится в его заголовке) со смещением первого атрибута. За концом последнего атрибута находится маркер конца – FFFFFFFFh.

В добавок к этому длина файловой записи хранится в двух полях – 32-разрядное поле реального размера (real size), находящееся по смещению 18h байт от начала сектора, содержит совокупный размер заголовка, всех его атрибутов и маркера конца, округленный по 8 байтной границе. 32-разрядное поле выделенного размера (allocated size), находящееся по смещению 1Сh байт от начала сектора, содержит действительный размер файловой записи в байтах, округленный по размеру сектора. Документация Linux-NTFS Project (версия 0.4) утверждает, что allocated size должен быть кратен размеру кластера, однако, в действительности это не так. В частности, на моей машине, allocated size равен четвертинке кластера.


16- разрядное поле флагов, находящееся по смещению 16h байт от начала сектора, в подавляющем большинстве случаев принимает одно из трех следующих значений: 00h – данная файловая запись не используется или ассоциированный с ней файл/каталог удален, 01h – файловая запись используется и описывает файл, 02h – файловая запись используется и описывает каталог.

64-разрядное поле, находящееся по смещению 20h байт от начала сектора содержит индекс базовой файловой записи. Для первой файловой записи это поле всегда равно нулю, а для всех последующих, расширенных (extra) записей – индексу первой файловой записи. Расширенные файловые записи могут находится в любых частях MFT, не обязательно рядом с основной записью. А коль скоро так, необходим какой-то механизм, обеспечивающий быстрый поиск расширенных файловых записей, принадлежащих данному файлу (просматривать весь MFT целиком не предлагать). И этот механизм основан на ведении списков атрибутов $ATTRIBUTE_LIST. Список атрибутов представляет собой специальный атрибут, добавляемый к первой файловой записи и содержащий индексы расширенных записей. Формат списка атрибутов приведен в разделе "типы атрибутов".

Остальные поля заголовка файловой записи не столь важны и поэтому здесь не рассматриваются. При необходимости обращайтесь к документации "Linux-NTFS Project".



смещение

размер

ОС

описание

00h

4

любая

сигнатура (magic number) 'FILE'

04h

2

любая

смещение номера последовательности обновления (update sequence number)

06h

2

любая

размер в словах номера последовательности обновления и массива обновления (Update Sequence Number & Array), условно (S)

08h

8

любая

номер последовательности файла транзакций ($LogFile Sequence Number или сокращенно LSN)

10h

2

любая

номер последовательности (sequence number)

12h

2

любая

счетчик жестких ссылок (hard link)

14h

2

любая

смещение первого атрибута (attribute)

16h

2

любая

флаги (flags)

значение

описание

0x00

файловая запись не используется

0x01

файловая запись используется и описывает файл (file)

0x02

файловая запись используется и описывает каталог (directory)

0x04

только Бил Гейтс знает

0x08

только Бил Гейтс знает

18h

4

любая

реальный размер (real size) файловой записи

1Ch

4

любая

выделенный размер (allocated size) файловой записи

20h

8

любая

ссылка (file reference) на базовую файловую запись (base FILE record) или ноль, если данная файловая запись базовая

28h

2

любая

идентификатор следующего атрибута (next attribute ID)

2Ah

2

XP

для выравнивания

2Ch

4

XP

индекс данной файловой записи (number of this MFT record)

2

любая

номер последовательности обновления (update sequence number)

2S-2

любая

массив последовательности обновления (update sequence array)


Содержание раздела