Книга: Восстановление данных. Практическое руководство

Атрибуты

Атрибуты

Структурно всякий атрибут состоит из атрибутного заголовка (attribute header) и тела атрибута (attribute body). Заголовок атрибута всегда хранится в файловой записи, расположенной внутри MFT. Тела резидентных атрибутов хранятся там же. Нерезидентные атрибуты хранят свое тело вне MFT, в одном или нескольких кластерах, перечисленных в заголовке данного атрибута в специальном списке. Если 8-разрядное поле, расположенное по смещению 08h байт от начала атрибутного заголовка, равно нулю, то атрибут считается резидентным, а если единице, то атрибут нерезидентен. Любые другие значения недопустимы.

Первые четыре байта атрибутного заголовка определяют его тип. Тип атрибута, в свою очередь, определяет формат представления тела атрибута. В частности, тело атрибута данных (тип: 80h$DATA) представляет собой "сырую" последовательность байт. Тело атрибута стандартной информации (тип: 10h$STANDARD_INFORMATION) описывает время его создания, права доступа и т.д. Более подробно эта тема будет рассмотрена далее в данной главе.

Следующие четыре байта заголовка содержат длину атрибута, выражаемую в байтах. Длина нерезидентного атрибута равна сумме длин его тела и заголовка, а длина резидентного атрибута равна длине его заголовка. Если к смешению атрибута добавить его длину, мы получим указатель на следующий атрибут (или маркер конца, если текущий атрибут — последний в цепочке).

Длина тела резидентных атрибутов, выраженная в байтах, хранится в 32- разрядном поле, расположенном по смещению 10h байт от начала атрибутного заголовка. 16-разрядное поле, следующее за его концом, хранит смещение резидентного тела, отсчитываемое от начала атрибутного заголовка. С нерезидентными атрибутами в этом плане все намного сложнее, и для хранения длины их тела используется множество полей. Реальный размер тела атрибута (real size of attribute), выраженный в байтах, хранится в 64-разрядном поле, находящемся по смещению 30h байт от начала атрибутного заголовка. Следующее за ним 64-разрядное поле хранит инициализированный размер потока (initialized data size of the stream), выраженный в байтах. Судя по всему, инициализированный размер потока всегда равен реальному размеру тела атрибута. 64-разрядное поле, расположенное по смещению 28h байт от начала атрибутного заголовка, хранит выделенный размер (allocated size of attribute), выраженный в байтах и равный реальному размеру тела атрибута, округленному до размера кластера (в большую сторону).

Два 64-разрядных поля, расположенные по смещениям 10h и 18h байт от начала атрибутного заголовка, задают первый (starting VCN) и последний (last VCN) номера виртуального кластера, принадлежащего телу нерезидентного атрибута. Виртуальные кластеры представляют собой логические номера кластеров, не зависящие от своего физического расположения на диске. В подавляющем большинстве случаев номер первого кластера тела нерезидентного атрибута равен нулю, а последний — количеству кластеров, занятых телом атрибута, уменьшенному на единицу. 16-разрядное поле, расположенное по смещению 20h от начала атрибутного заголовка, содержит указатель на массив Data Runs, расположенный внутри этого заголовка и описывающий логический порядок размещения нерезидентного тела атрибута на диске.

Каждый атрибут имеет свой собственный идентификатор (attribute ID), уникальный для данной файловой записи и хранящийся в 16-разрядном поле, расположенном по смещению 0Eh от начала атрибутного заголовка.

Если атрибут имеет имя (attribute Name), то 16-разрядное поле, расположенное по смещению 0Ah байт от атрибутного заголовка, содержит указатель на него. Для безымянных атрибутов оно равно нулю (большинство атрибутов имен не имеют). Имя атрибута хранится в атрибутном заголовке в формате UNICODE, а его длина определяется 8-разрядным полем, расположенным по смещению 09h байт от начала атрибутного заголовка.

Если тело атрибута сжато, зашифровано или разрежено, 16-разрядное поле флагов, расположенное по смещению 0Ch байт от начала атрибутного заголовка, не равно нулю.

Основные поля резидентных и нерезидентных атрибутов кратко описаны в табл. 6.4 и 6.5. Остальные поля не играют существенной роли, и потому здесь они не рассматриваются.

Таблица 6.4. Структура резидентного атрибута

Смещение Размер (байт) Значение Описание
00h 4 Тип атрибута (например, 0x10, 0x60, 0xB0)
04h 4 Длина атрибута, включая этот заголовок
08h 1 00h Флаг нерезидентности (non-resident flag)
09h 1 N Длина имени атрибута (ноль, если атрибут безымянный)
0Ah 2 18h Смещение имени (ноль, если атрибут безымянный)
0Ch 2 00h Флаги
Значение Описание
0001h Сжатый атрибут (compressed)
4000h Зашифрованный атрибут (encrypted)
8000h Разреженный атрибут (sparse)
0Eh 2 Идентификатор атрибута (attribute ID)
10h 4 L Длина тела атрибута, без заголовка
14h 2 2N+18h Смещение тела атрибута
16h 1 Индексный флаг
17h 1 00h Используется для выравнивания
18h 2N UNICODE Имя атрибута (если есть)
2N+18h L Тело атрибута

Таблица 6.5. Структура нерезидентного атрибута

Смещение Размер (байт) Значение Описание
00h 4 Тип атрибута (например, 0x20, 0x80)
04h 4 Длина атрибута, включая этот заголовок
08h 1 01h Флаг нерезидентности (non-resident flag)
09h 1 N Длина имени атрибута (ноль, если атрибут безымянный)
0Ah 2 40h Смещение имени (ноль, если атрибут безымянный)
0Ch 2 Флаги
Значение Описание
0001h Сжатый атрибут (compressed)
4000h Зашифрованный атрибут (encrypted)
8000h Разреженный атрибут (sparse)
0Eh 2 Идентификатор атрибута (attribute ID)
10h 8 Начальный виртуальный кластер (starting VCN)
18h 8 Конечный виртуальный кластер (last VCN)
20h 2 2N+40h Смещение списка отрезков (data runs)
22h 2 Размер блока сжатия (compression unit size), округленный до 4 байт в большую сторону
24h 4 00h Используется для выравнивания
28h 8 Выделенный размер (allocated size), округленный до размера кластера
30h 8 Реальный размер (real size)
38h 8 Инициализированный размер потока (initialized data size of the stream)
40h 2N UNICODE Имя атрибута (если есть)
2N+40h Список отрезков (data runs)

Оглавление книги


Генерация: 0.109. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз