Книга: Восстановление данных. Практическое руководство
Атрибуты
Атрибуты
Структурно всякий атрибут состоит из атрибутного заголовка (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) |
- 1.3.5. Методы и атрибуты
- 2. Домены и атрибуты
- 4. Виртуальные атрибуты
- У файла и каталога есть атрибуты (например: Скрытый, Только чтение). Как ими управлять из командной строки?
- 20.2.1. Атрибуты cookie: срок хранения и область видимости
- Атрибуты и свойства
- 9.1.1.1. После fork(): общие и различные атрибуты
- 9.1.4.4. Атрибуты, наследуемые exec()
- Дополнительные атрибуты файла
- Атрибуты процесса
- Атрибуты пользователя
- Атрибуты файлов и управление каталогами