Поделиться через


структура 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 нижнего порядка.

Алгоритм распаковки выглядит следующим образом:

  1. Инициализируйте NextVcn значением , Attribute->LowestVcn а CurrentLcn — значением 0.
  2. Инициализируйте указатель потока байтов на (PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset.
  3. Задайте для свойства CurrentVcn значение NextVcn.
  4. Считывает следующий байт из потока. Если значение равно 0, то прервать; else извлеките v и l , как описано выше.
  5. Интерпретировать следующие виртуальные байты как подписанное количество с байтами нижнего порядка. Распакуйте его с расширением на 64 бита и добавьте в NextVcn.
  6. Интерпретировать следующие l-байты как подписанное количество с первым байтом нижнего порядка. Распакуйте его на 64 бит и добавьте в CurrentLcn. Если при этом возвращается значение CurrentLcn 0, то VCN из CurrentVcn в NextVcn–1 будут нераспределены.
  7. Обновите кэшированные сведения о сопоставлении из CurrentVcn, NextVcn и CurrentLcn.
  8. Перейдите к шагу 3.

См. также раздел

Таблица главных файлов