Восстановление данных. Практическое руководство
$FILE_NAMEАтрибут полного имени файла хранит имя файла в соответствующем пространстве имен. Таких атрибутов у файла может быть и несколько (например, имя Win32 и имя MS-DOS). Здесь же хранятся и жесткие ссылки (hard link), если они есть.
Структура атрибута полного имени приведена в табл. 6.9.
Таблица 6.9. Структура атрибута
<i>$FILE_NAME</i>
Смещение Размер Описание - - Стандартный атрибутный заголовок (standard attribute header) 00h8 Ссылка (file reference) на материнский каталог 08h8 — время создания (creation) файлаC10h8 — время последнего изменения (altered) файлаA18h8 — время последнего изменения файловой записи (MFT changed)M20h8 — время последнего чтения (read) файлаR28h8 Выделенный размер (allocated size) файла 30h8 Реальный размер (real size) файла 38h4 Флаг (см. табл. 6.7) 3Ch4 Используется HPFS 40h1 Длина имени в символах — L41h1 Пространство имен файла (filename namespace) 42h2L Имя файла в формате UNICODE без завершающего нуля Списки отрезков
Тела нерезидентных атрибутов хранятся на диске в одной или нескольких кластерных цепочках, называемых отрезками (runs). Отрезком называется последовательность смежных кластеров, характеризующаяся номером начального кластера и длиной. Совокупность отрезков называется списком (run-list или data run).
Внутренний формат представления списков не то, чтобы сложен, но простым его тоже на назовешь. Для экономии места длина отрезка и номер начального кластера хранятся в полях переменной длины. Если размер отрезка умещается в байт (т.е. его значение не превышает 255), то он займет один байт. По аналогии, если размер отрезка требует для своего представления двойного слова, то он займет двойное слово.
Сами же поля размеров хранятся в 4-битных ячейках, называемых нибблами (nibble) или полубайтами. Шестнадцатеричная система счисления позволяет легко переводить байты в нибблы и наоборот. Младший ниббл равен (
), а старший — (X & 15). Иначе говоря, младший ниббл соответствует младшему шестнадцатеричному разряду байта, а старший — старшему. Например,X / 16состоит из двух нибблов, причем младший равен69h, а старший —9h.6hСписок отрезков представляет собой массив структур, каждая из которых описывает характеристики "своего" отрезка. Структура элемента списка отрезков показана в табл. 6.10. В конце списка находится завершающий ноль. Первый байт структуры состоит из двух нибблов: младший задает длину поля начального кластера отрезка (условно обозначаемого буквой
), а старший — количество кластеров в отрезке (F). Затем идет поле длины отрезка. В зависимости от значенияLоно может занимать от одного до восьми байт (поля большей длины недопустимы). Первый байт поля стартового кластера файла расположен по смещениюLбайт от начала структуры (что соответствует1+Lнибблам). Кстати говоря, в документации Linux-NTFS Project (версия 0.4) поля размеров начального кластера и количества кластеров в отрезке перепутаны местами.2+2*LТаблица 6.10. Структура одного элемента списка отрезков
Смещение в нибблах Размер в нибблах Описание 0 1 Размер поля длины ( )L1 1 Размер поля начального кластера ( )S2 2* LКоличество кластеров в отрезке 2+2* L2* SНомер начального кластера отрезка Покажем, как с этим работать на практике. Предположим, что мы имеем следующий список отрезков, соответствующий нормальному не фрагментированному файлу (что может быть проще!):
. Попробуем его декодировать?21 18 34 56 00Начнем с первого байта —
. Младший полубайт (21h) описывает размер поля длины отрезка, старший (01h) — размер поля начального кластера. Следующие несколько байт представляют поле длины отрезка, размер которого в данном случае равен одному байту —02h. Два других байта (18h) задают номер начального кластера отрезка. Нулевой байт на конце сигнализирует о том, что это последний отрезок в файле. Таким образом, наш файл состоит из одного-единственного отрезка, начинающегося с кластера34h 56hи заканчивающегося кластером5634h.5634h + 18h == 564Ch