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:
- Inicialice NextVcn en
Attribute->LowestVcn
y CurrentLcn en 0. - Inicialice el puntero de secuencia de bytes a
(PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset
. - Establezca CurrentVcn en NextVcn.
- Lea el siguiente byte de la secuencia. Si es 0, entonces rompa; else extraiga v y l como se ha descrito anteriormente.
- 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.
- 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.
- Actualice la información de asignación almacenada en caché de CurrentVcn, NextVcn y CurrentLcn.
- Vaya al paso 3.
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de