Распространенные атрибуты
Ниже даны характеристики основных атрибутов, которые используются в NTFS для описания файлов и каталогов. Обратите внимание, что это формат тел атрибутов соответствующих типов.
Атрибут $FILE_NAME.
Идентификатор 0x30.
0x0 | MFT_REF | Ссылка на родительский каталог (в котором хранится файл). |
0x8 | ULARGE_INTEGER | Время создания. |
0x10 | ULARGE_INTEGER | Время последней модификации атрибута с данными. |
0x18 | ULARGE_INTEGER | Время последней модификации данной записи. |
0x20 | ULARGE_INTEGER | Время последнего доступа к записи. |
0x28 | ULARGE_INTEGER | Размер выделенного дискового пространства для основного атрибута $DATA (кратно размеру кластера). |
0x30 | ULARGE_INTEGER | Реальный размер основного атрибута $DATA. |
0x38 | ULONG | Атрибуты файла. |
0x3C | ULONG | Тип точки разбора. |
0x40 | UCHAR | Длина имени файла в символах. |
0x41 | UCHAR | Пространство имен (0 – POSIX, 1 - Win32, 2 - DOS). |
0x42+ | WCHAR | Имя файла. |
Атрибут $FILE_NAME всегда резидентен. Он служит для двух функций. Во-первых, хранит имя файла в записи MFT, причем атрибутов $FILE_NAME у файла может быть несколько (NT эмулирует различные подсистемы DOS и POSIX, в том числе и на уровне файлов). Для MS-DOS атрибут будет хранить имя в формате 8.3, для POSIX символы имени файла с учетом регистра и стандартное имя для Win32 подсистемы. Один атрибут может содержать имя сразу для двух подсистем (обычно, 3 – Win32|DOS, если имя влезает в формат 8.3). Во-вторых, атрибут используется для организации индекса в структуре каталогов, где он выступает как индексный элемент. Заметьте, ошибочным является утверждение, что индексы дублируют только один $FILE_NAME для файла, как раз наоборот, если файл имеет в записи MFT один $FILE_NAME для DOS и другой для Win32, то оба они будут дублироваться и в индексах.
Атрибут $STANDART_INFORMATION
Идентификатор 0x10.
0x0 | ULARGE_INTEGER | Время создания. |
0x8 | ULARGE_INTEGER | Время последней модификации атрибута с данными. |
0x10 | ULARGE_INTEGER | Время последней модификации данной записи. |
0x18 | ULARGE_INTEGER | Время последнего доступа к записи. |
0x20 | ULONG | Атрибуты файла (см. следующую таблицу). |
0x24 | ULONG | Максимальное количество версий. |
0x28 | ULONG | Номер версии. |
0x2C | ULONG | Идентификатор класса. |
0x30 | ULONG | Идентификатор владельца. (начиная с w2k) |
0x34 | ULONG | Идентификатор безопасности. (начиная с w2k) |
0x38 | ULARGE_INTEGER | Изменение квоты. (начиная с w2k) |
0x40 | ULARGE_INTEGER | Номер USN. (начиная с w2k) |
Возможны следующие атрибуты файла:
0x1 | Только чтение |
0x2 | Скрытый |
0x4 | Системный |
0x20 | Архивный |
0x80 | Устройство |
0x100 | Временный |
0x200 | Разреженный |
0x400 | Точка подключения |
0x800 | Сжатый |
0x1000 | Автономный |
0x2000 | Содержимое не индексируется |
0x4000 | Зашифрованный |
Атрибут $DATA.
Атрибут $DATA (идентификатор 0x80) в своем теле содержит данные файла и может быть как резидентным, если атрибут умещается в MFT-записи, так и нерезидентным. На уровне атрибута $DATA реализуются Alternate Data Streams или альтернативные потоки данных. Поток в NTFS – это данные файла. По умолчанию, все записываемые данные в файл попадают в безымянный поток $DATA. Альтернативные потоки – это дополнительные атрибуты $DATA для файла, в которых также могут храниться данные. Главный безымянный поток обычно следует последним в списке атрибутов, а все последующие альтернативные потоки будут добавляться за ним. NTFS адресует потоки (атрибуты $DATA) по их именам (имена атрибутов). Смещение имени потока вычисляется также как смещение имени любого атрибута, как сумма смещения заголовка атрибута со смещением имени, которое указывается в заголовке (при присутствии значения длины имени, при его отсутствии мы имеем дело в неименованным потоком).
Жесткие связи.
Жесткие связи (hard links) – механизм POSIX, который позволяет из разных каталогов обращаться к одному файлу. На уровне NTFS, жесткая ссылка – это дополнительный атрибут $FILE_NAME в MFT-записи файла и такой же атрибут в родительской директории самой ссылки (в этом случае структура INDEX_ENTRY_HEADER_DIR в поле ссылки на файл содержит ссылку на MFT запись для самого файла).
Жесткие связи создаются на уже существующий файл и их количество указывается в заголовке MFT записи файла в поле link_count. Если на файл нет жестких связей, это поле равно единице. Если link_count больше единицы тогда количество связей определяется как link_count минус 1. Отличие атрибута $FILE_NAME, который описывает жесткую ссылку в MFT записи, от атрибута, который описывает одно из имен файла, в том, что поле родительской директории содержит ссылку на родительскую директорию самой ссылки, а не ссылку на директорию, которой принадлежит файл.
Для перечисления всех жестких ссылок на файл нужно получить их количество как MFT_RECORD.link_count – 1 и ссылку на родительский каталог файла. Если кол-во ссылок больше нуля, тогда пройтись по всем атрибутам $FILE_NAME и сравнить значения полей родительских ссылок с ссылкой на родительский каталог файла. В случае несоответствия, мы имеем дело с жесткой ссылкой.
Метафайлы.
Первые 11 записей MFT описывают основные метафайлы NTFS. За ними идет не используемая область из нескольких записей и далее пользовательские файлы и каталоги. Структура и описание метафайлов даны в следующей таблице.
0 | $Mft | Описывает местоположение MFT файла. При поиске записей через их индексы считывается атрибут $DATA. Стартовый адрес тела атрибута $DATA совпадает с местоположением самого $Mft. В случае, если MFT занимает один отрезок, т.е. не фрагментирован, его можно индексировать как линейный массив, но как правило, MFT фрагментирован, поэтому для поиска записи по индексу нужно искать соответствующий отрезок. |
1 | $MftMirr | Копия первых четырех записей MFT. |
2 | $LogFile | Файл журнала транзакций. Содержит информацию для восстановления NTFS после сбоя. |
3 | $Volume | Содержит информацию о томе, такую как метка тома и версия тома. |
4 | $AttrDef | Определяет имена и идентификаторы атрибутов. |
5 | . | Корневой каталог. Все метафайлы содержатся в корневом каталоге. |
6 | $Bitmap | Файл распределения кластеров на томе. В каждом бите тела содержит статус выделения кластера. Читается также как атрибут $BITMAP для каталогов, но в роли индекса индексной записи выступает номер кластера. |
7 | $Boot | Описывает загрузочный сектор. Стартовый адрес тела нерезидентного атрибута $DATA равен нулю, что соответствует началу тома, где бут сектор, собственно, и расположен. |
8 | $BadClus | Содержит информацию о плохих кластерах тома. |
9 | $Secure | Содержит дескрипторы защиты для всех файлов тома. |
10 | $Upcase | Предназначен для сопоставления имен с буквами в верхнем регистре. |
11 | $Extend | Каталог расширенных метаданных, таких как квоты, точки разбора и идентификаторы объектов. |
12 - 15 | Записи пустые. | |
16 - 24 | Записи не используются. | |
… | Пользовательские файлы и каталоги. |
Метафайлы $Secure, $Extend, а также все дополнительные появились начиная с NTFS v3.0, т. е. с Windows 2000.