estructura de ATTRIBUTE_RECORD_HEADER

[Esta estructura solo es válida para la versión 3 de los volúmenes NTFS; puede modificarse en versiones futuras].

Representa un registro de atributo.

Sintaxis

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;

Miembros

TypeCode

Código de tipo de atributo.

Valor Significado
$STANDARD_INFORMATION
0x10
Atributos de archivo (como solo lectura y archivo), marcas de tiempo (como la creación de archivos y la última modificación) y el recuento de vínculos duros.
$ATTRIBUTE_LIST
0x20
Lista de atributos que componen el archivo y la referencia de archivo del registro de archivo MFT en el que se encuentra cada atributo.
$FILE_NAME
0x30
Nombre del archivo, en caracteres Unicode.
$OBJECT_ID
0x40
Identificador de objeto de 64 bytes asignado por el servicio de seguimiento de vínculos.
$VOLUME_NAME
0x60
Etiqueta de volumen. Presente en el archivo $Volume.
$VOLUME_INFORMATION
0x70
Información del volumen. Presente en el archivo $Volume.
$DATA
0x80
Contenido del archivo.
$INDEX_ROOT
0x90
Se usa para implementar la asignación de nombres de archivo para directorios grandes.
$INDEX_ALLOCATION
0xA0
Se usa para implementar la asignación de nombres de archivo para directorios grandes.
$BITMAP
0xB0
Índice de mapa de bits para un directorio grande.
$REPARSE_POINT
0xC0
Datos del punto de reanálisis.

 

RecordLength

Tamaño del registro de atributo, en bytes. Este valor refleja el tamaño necesario para la variante de registro y siempre se redondea al límite cuadrátero más cercano.

FormCode

Código de formulario de atributo.

Valor Significado
RESIDENT_FORM
0x00
El valor está incluido en el registro de archivo y sigue inmediatamente el encabezado del registro de atributo.
NONRESIDENT_FORM
0x01
El valor está incluido en otros sectores del disco.

 

NameLength

Tamaño del nombre de atributo opcional, en caracteres o 0 si no hay ningún nombre de atributo. La longitud máxima del nombre del atributo es de 255 caracteres.

NameOffset

Desplazamiento del nombre del atributo desde el principio del registro de atributo, en bytes. Si el miembro NameLength es 0, este miembro no está definido.

Marcas

Marcas de atributo.

ATTRIBUTE_FLAG_COMPRESSION_MASK (0x00FF)

ATTRIBUTE_FLAG_SPARSE (0x8000)

ATTRIBUTE_FLAG_ENCRYPTED (0x4000)

Instancia

Instancia única de este atributo en el registro de archivo.

Forma

Si el miembro FormCode es RESIDENT_FORM, la unión es una estructura Residente . Si FormCode es NONRESIDENT_FORM, la unión es una estructura Nonresident .

Residente

ValueLength

Tamaño del valor del atributo, en bytes.

ValueOffset

Desplazamiento al valor desde el principio del registro de atributo, en bytes.

Reserved

Reservado.

Nonresident

LowestVcn

Número de clúster virtual (VCN) más bajo cubierto por este registro de atributo.

HighestVcn

El VCN más alto cubierto por este registro de atributo.

MappingPairsOffset

Desplazamiento a la matriz de pares de asignación desde el principio del registro de atributo, en bytes. Para obtener más información, vea la sección Comentarios.

Reserved

Reservado.

AllocatedLength

Tamaño asignado del archivo, en bytes. Este valor es incluso un múltiplo del tamaño del clúster. Este miembro no es válido si el miembro LowestVcn no es cero.

FileSize

Tamaño del archivo (byte más alto que se puede leer más 1), en bytes. Este miembro no es válido si LowestVcn no es cero.

ValidDataLength

Longitud de datos válida (byte inicializado más 1) más 1, en bytes. Este valor se redondea al límite del clúster más cercano. Este miembro no es válido si LowestVcn es distinto de cero.

TotalAllocated

El total asignado para el archivo (la suma de los clústeres asignados).

Comentarios

Tenga en cuenta que no hay ningún archivo de encabezado asociado para esta estructura.

Esta definición de estructura solo es válida para la versión principal 3 y la versión secundaria 0 o 1, según lo indicado por FSCTL_GET_NTFS_VOLUME_DATA.

Los registros de atributo siempre se alinean en un límite cuadrátero.

Si el atributo no esidentident, el encabezado de registro de atributo contiene una lista de información de recuperación que proporciona una asignación entre VCN y el número de clúster lógico (LCN) para el atributo. Si la información de recuperación no cabe en el segmento de archivo base, se puede almacenar en un segmento de registro de archivo externo por sí mismo. Si todavía no cabe en un segmento de registro de archivo externo, hay un aprovisionamiento en la lista de atributos para contener varias entradas para un atributo que requiere información adicional de recuperación.

La matriz de pares de asignación se almacena en un formato comprimido y supone que el sistema descomprime y almacena en caché la información. Consta de una serie de pares NextVcn/CurrentLcn. Por ejemplo, si un archivo tiene una sola ejecución de 8 clústeres a partir de LCN 128 y el archivo se inicia en LowestVcn 0, la matriz de pares de asignación tiene solo una entrada, que es NextVcn=8 y CurrentLcn=128. La matriz es una secuencia de bytes que almacena los cambios en las variables de trabajo cuando se procesan secuencialmente. La secuencia de bytes se interpretará como una secuencia terminada en cero de triples, como se indica a continuación:

count byte = v + (l * 16)

donde v es el número de bytes VCN de orden bajo modificado y l es el número de bytes LCN de orden bajo cambiado.

El algoritmo de descompresión es el siguiente:

  1. Inicialice NextVcn en Attribute->LowestVcn y CurrentLcn en 0.
  2. Inicialice el puntero de secuencia de bytes a (PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset.
  3. Establezca CurrentVcn en NextVcn.
  4. Lea el siguiente byte de la secuencia. Si es 0, entonces rompa; else extraiga v y l como se ha descrito anteriormente.
  5. Interprete primero los bytes v siguientes como una cantidad firmada, con el byte de orden bajo. Desempaquete el inicio de sesión extendido en 64 bits y agréguelo a NextVcn.
  6. Interprete los siguientes bytes l como una cantidad firmada, con el byte de orden bajo primero. Desempaquete el inicio de sesión extendido en 64 bits y agréguelo a CurrentLcn. Si esto genera un CurrentLcn de 0, los VCN de CurrentVcn a NextVcn–1 no se asignan.
  7. Actualice la información de asignación almacenada en caché de CurrentVcn, NextVcn y CurrentLcn.
  8. Vaya al paso 3.

Consulte también

Tabla de archivos maestros