структура ATTRIBUTE_RECORD_HEADER
[Эта структура допустима только для томов NTFS версии 3; она может быть изменена в будущих версиях.]
Представляет запись атрибута.
Синтаксис
typedef struct _ATTRIBUTE_RECORD_HEADER {
ATTRIBUTE_TYPE_CODE TypeCode;
ULONG RecordLength;
UCHAR FormCode;
UCHAR NameLength;
USHORT NameOffset;
USHORT Flags;
USHORT Instance;
union {
struct {
ULONG ValueLength;
USHORT ValueOffset;
UCHAR Reserved[2];
} Resident;
struct {
VCN LowestVcn;
VCN HighestVcn;
USHORT MappingPairsOffset;
UCHAR Reserved[6];
LONGLONG AllocatedLength;
LONGLONG FileSize;
LONGLONG ValidDataLength;
LONGLONG TotalAllocated;
} Nonresident;
} Form;
} ATTRIBUTE_RECORD_HEADER, *PATTRIBUTE_RECORD_HEADER;
Члены
-
Код типа
-
Код типа атрибута.
Значение Значение - $STANDARD_INFORMATION
- 0x10
Атрибуты файлов (например, только для чтения и архива), метки времени (например, создание файла и последнее изменение) и количество жестких ссылок. - $ATTRIBUTE_LIST
- 0x20
Список атрибутов, составляющих файл, и ссылка на файл записи MFT-файла, в которой находится каждый атрибут. - $FILE_NAME
- 0x30
Имя файла в символах Юникода. - $OBJECT_ID
- 0x40
64-байтовый идентификатор объекта, назначенный службой отслеживания ссылок. - $VOLUME_NAME
- 0x60
Метка тома. Присутствует в файле $Volume. - $VOLUME_INFORMATION
- 0x70
Сведения о томе. Присутствует в файле $Volume. - $DATA
- 0x80
Содержимое файла. - $INDEX_ROOT
- 0x90
Используется для реализации выделения имен файлов для больших каталогов. - $INDEX_ALLOCATION
- 0xA0
Используется для реализации выделения имен файлов для больших каталогов. - $BITMAP
- 0xB0
Индекс растрового изображения для большого каталога. - $REPARSE_POINT
- 0xC0
Данные точки повторного анализа. -
RecordLength
-
Размер записи атрибута в байтах. Это значение отражает требуемый размер для варианта записи и всегда округляется до ближайшей границы четырех слов.
-
Код формы
-
Код формы атрибута.
Значение Значение - RESIDENT_FORM
- 0x00
Значение содержится в записи файла и сразу после заголовка записи атрибута. - NONRESIDENT_FORM
- 0x01
Значение содержится в других секторах диска. -
NameLength
-
Размер необязательного имени атрибута в символах или 0, если имя атрибута отсутствует. Максимальная длина имени атрибута — 255 символов.
-
NameOffset
-
Смещение имени атрибута от начала записи атрибута в байтах. Если элемент NameLength равен 0, этот элемент не определен.
-
Flags
-
Флаги атрибутов.
-
ATTRIBUTE_FLAG_COMPRESSION_MASK (0x00FF)
-
ATTRIBUTE_FLAG_SPARSE (0x8000)
-
ATTRIBUTE_FLAG_ENCRYPTED (0x4000)
-
-
Экземпляр
-
Уникальный экземпляр этого атрибута в записи файла.
-
Form
-
Если элемент FormCode является RESIDENT_FORM, объединение является резидентной структурой. Если FormCode NONRESIDENT_FORM, объединение является структурой nonresident .
-
Резидент
-
-
ValueLength
-
Размер значения атрибута в байтах.
-
ValueOffset
-
Смещение значения от начала записи атрибута в байтах.
-
Reserved
-
Зарезервировано.
-
-
Иногородним
-
-
LowestVcn
-
Наименьший номер виртуального кластера (VCN), охватываемый этой записью атрибута.
-
HighestVcn
-
Наибольшее значение VCN, покрываемое этой записью атрибута.
-
MappingPairsOffset
-
Смещение массива пар сопоставления от начала записи атрибута в байтах. Дополнительные сведения см. в подразделе "Примечания".
-
Reserved
-
Зарезервировано.
-
AllocatedLength
-
Выделенный размер файла в байтах. Это значение четно кратно размеру кластера. Этот элемент недопустим, если элемент LowestVcn не является нулевым.
-
FileSize
-
Размер файла (самый высокий байт, который можно считать плюс 1) в байтах. Этот элемент недопустим, если тип LowestVcn не является нулевым.
-
ValidDataLength
-
Допустимая длина данных (самый высокий инициализированный байт плюс 1) в байтах. Это значение округляется до ближайшей границы кластера. Этот элемент недопустим, если параметр LowestVcn не является нулевым.
-
ВсегоРаспределено
-
Общий объем, выделенный для файла (сумма выделенных кластеров).
-
-
Комментарии
Обратите внимание, что для этой структуры нет связанного файла заголовка.
Это определение структуры допустимо только для основной версии 3 и дополнительной версии 0 или 1, как сообщает FSCTL_GET_NTFS_VOLUME_DATA.
Записи атрибутов всегда выравниваются по границе четырех слов.
Если атрибут не является идентификатором, заголовок записи атрибута содержит список сведений о получении, который обеспечивает сопоставление между VCN и логическим номером кластера (LCN) для атрибута. Если сведения о извлечении не помещаются в базовый сегмент файла, они могут храниться в сегменте записи внешнего файла самостоятельно. Если он по-прежнему не помещается в один сегмент записей внешнего файла, в списке атрибутов есть подготовка, содержащая несколько записей для атрибута, требующего дополнительных сведений о получении.
Массив пар сопоставления хранится в сжатом виде и предполагает, что данные распаковываются и кэшируются системой. Он состоит из серии пар NextVcn/CurrentLcn. Например, если файл имеет один запуск из 8 кластеров, начиная с LCN 128, а файл начинается с LowestVcn 0, то массив пар сопоставления содержит только одну запись: NextVcn=8 и CurrentLcn=128. Массив представляет собой поток байтов, в котором сохраняются изменения рабочих переменных при последовательной обработке. Поток байтов должен интерпретироваться как поток тройных значений с нулевым завершением, как показано ниже.
count byte = v + (l * 16)
где v — количество измененных байтов VCN нижнего порядка, а l — число измененных байтов LCN нижнего порядка.
Алгоритм распаковки выглядит следующим образом:
- Инициализируйте NextVcn значением ,
Attribute->LowestVcn
а CurrentLcn — значением 0. - Инициализируйте указатель потока байтов на
(PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset
. - Задайте для свойства CurrentVcn значение NextVcn.
- Считывает следующий байт из потока. Если значение равно 0, то прервать; else извлеките v и l , как описано выше.
- Интерпретировать следующие виртуальные байты как подписанное количество с байтами нижнего порядка. Распакуйте его с расширением на 64 бита и добавьте в NextVcn.
- Интерпретировать следующие l-байты как подписанное количество с первым байтом нижнего порядка. Распакуйте его на 64 бит и добавьте в CurrentLcn. Если при этом возвращается значение CurrentLcn 0, то VCN из CurrentVcn в NextVcn–1 будут нераспределены.
- Обновите кэшированные сведения о сопоставлении из CurrentVcn, NextVcn и CurrentLcn.
- Перейдите к шагу 3.
См. также раздел