2009 г.
Записки исследователя NTFS
Artem Baranov
Назад Содержание
Распространенные атрибуты
Ниже даны характеристики основных атрибутов, которые используются в 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 |
Зашифрованный |
Атрибут $STANDART_INFORMATION всегда резидентен. Атрибут содержит основную информацию о файле и существует для каждого файла и каталога. Обычно $STANDART_INFORMATION располагается первым атрибутом в списке. Поля временных штампов присутствуют также и в атрибуте $FILE_NAME. Идентификатор безопасности используется как индекс в файле $Secure.
Атрибут $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. За ними идет не используемая область из нескольких записей и далее пользовательские файлы и каталоги. Структура и описание метафайлов даны в следующей таблице.
Индекс MFT |
Имя файла |
Описание |
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 |
Записи не используются. |
… |
Пользовательские файлы и каталоги. |
Метафайлы в NTFS могут быть и дополнительными или необязательными. Такие файлы хранятся в директории $Extend и за ними строго не закреплены индексы в MFT. К дополнительным метафайлам относятся $Quota – информация о дисковых квотах, $Reparse – используется для точек разбора (reparse point), $ObjId – позволяет связывать идентификатор объекта файла с записью MFT.
Метафайлы $Secure, $Extend, а также все дополнительные появились начиная с NTFS v3.0, т. е. с Windows 2000.
Ссылки
- Zachary, G. Pascal (1994). Showstopper! The Breakneck Race to Create Windows NT and the Next Generation at Microsoft. Warner Books. ISBN 0-02-935671-7.
- Кастер, Хелен (1996). Основы Windows NT и NTFS. Русская редакция. ISBN 5-7502-0023-X.
Назад Содержание