ATTRIBUTE_RECORD_HEADER Struktur
[Diese Struktur ist nur für VERSION 3 von NTFS-Volumes gültig; sie kann in zukünftigen Versionen geändert werden.]
Stellt einen Attributdatensatz dar.
Syntax
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;
Member
-
TypeCode
-
Der Attributtypcode.
Wert Bedeutung - $STANDARD_INFORMATION
- 0x10
Dateiattribute (z. B. schreibgeschützt und archivieren), Zeitstempel (z. B. Dateierstellung und letzte Änderung) und die Anzahl der Hardlinks. - $ATTRIBUTE_LIST
- 0x20
Eine Liste der Attribute, aus denen die Datei besteht, und den Dateiverweis des MFT-Dateidatensatzes, in dem sich die einzelnen Attribute befinden. - $FILE_NAME
- 0x30
Der Name der Datei in Unicode-Zeichen. - $OBJECT_ID
- 0x40
Ein 64-Byte-Objektbezeichner, der vom Linknachverfolgungsdienst zugewiesen wird. - $VOLUME_NAME
- 0x60
Die Volumebezeichnung. In der $Volume-Datei vorhanden. - $VOLUME_INFORMATION
- 0x70
Die Volumeinformationen. In der $Volume-Datei vorhanden. - $DATA
- 0x80
Der Inhalt der Datei. - $INDEX_ROOT
- 0x90
Wird verwendet, um die Dateinamenzuordnung für große Verzeichnisse zu implementieren. - $INDEX_ALLOCATION
- 0xA0
Wird verwendet, um die Dateinamenzuordnung für große Verzeichnisse zu implementieren. - $BITMAP
- 0xB0
Ein Bitmapindex für ein großes Verzeichnis. - $REPARSE_POINT
- 0xC0
Die Analysepunktdaten. -
Recordlength
-
Die Größe des Attributdatensatzes in Bytes. Dieser Wert spiegelt die erforderliche Größe für die Datensatzvariante wider und wird immer auf die nächstgelegene Quadword-Grenze gerundet.
-
FormCode
-
Der Attributformularcode.
Wert Bedeutung - RESIDENT_FORM
- 0x00
Der Wert ist im Dateidatensatz enthalten und folgt sofort dem Attributeintragsheader. - NONRESIDENT_FORM
- 0x01
Der Wert ist in anderen Sektoren auf dem Datenträger enthalten. -
NameLength
-
Die Größe des optionalen Attributnamens in Zeichen oder 0, wenn kein Attributname vorhanden ist. Die maximale Länge des Attributnamens beträgt 255 Zeichen.
-
NameOffset
-
Der Offset des Attributnamens vom Anfang des Attributdatensatzes in Bytes. Wenn das NameLength-Element 0 ist, ist dieses Element nicht definiert.
-
Flags
-
Die Attributflags.
-
ATTRIBUTE_FLAG_COMPRESSION_MASK (0x00FF)
-
ATTRIBUTE_FLAG_SPARSE (0x8000)
-
ATTRIBUTE_FLAG_ENCRYPTED (0x4000)
-
-
Instanz
-
Die eindeutige instance für dieses Attribut im Dateidatensatz.
-
Form
-
Wenn das FormCode-Element RESIDENT_FORM ist, ist die Union eine Resident-Struktur . Wenn FormCode NONRESIDENT_FORM ist, ist die Union eine Nonresident-Struktur .
-
Wohnsitz
-
-
ValueLength
-
Die Größe des Attributwerts in Bytes.
-
ValueOffset
-
Der Offset auf den Wert vom Anfang des Attributdatensatzes in Bytes.
-
Reserved
-
Reserviert.
-
-
Nichtresident
-
-
LowestVcn
-
Die niedrigste virtuelle Clusternummer (VCN), die von diesem Attributdatensatz abgedeckt wird.
-
HöchstesVcn
-
Der höchste VCN, der von diesem Attributdatensatz abgedeckt wird.
-
MappingPairsOffset
-
Der Offset zum Zuordnungspaararray vom Anfang des Attributdatensatzes in Bytes. Weitere Informationen finden Sie in den Hinweisen.
-
Reserved
-
Reserviert.
-
AllocatedLength
-
Die zugeordnete Größe der Datei in Bytes. Dieser Wert ist ein gerades Vielfaches der Clustergröße. Dieser Member ist ungültig, wenn das LowestVcn-Element nichtzero ist.
-
FileSize
-
Die Dateigröße (das höchste Byte, das gelesen werden kann, plus 1), in Bytes. Dieser Member ist ungültig, wenn LowestVcn nichtzero ist.
-
ValidDataLength
-
Die gültige Datenlänge (höchstes initialisiertes Byte plus 1) in Byte. Dieser Wert wird auf die nächste Clustergrenze gerundet. Dieser Member ist ungültig, wenn LowestVcn ungleich null ist.
-
TotalAllocated
-
Die Summe, die der Datei zugeordnet ist (die Summe der zugeordneten Cluster).
-
-
Bemerkungen
Beachten Sie, dass für diese Struktur keine zugeordnete Headerdatei vorhanden ist.
Diese Strukturdefinition gilt nur für Hauptversion 3 und Nebenversion 0 oder 1, wie von FSCTL_GET_NTFS_VOLUME_DATA gemeldet.
Attributdatensätze werden immer an einer Quadwordgrenze ausgerichtet.
Wenn das Attribut nicht ident ist, enthält der Attributdatensatzheader eine Liste mit Abrufinformationen, die eine Zuordnung zwischen VCN und der logischen Clusternummer (LCN) für das Attribut bereitstellt. Wenn die Abrufinformationen nicht in das Basisdateisegment passen, können sie selbst in einem externen Dateidatensatzsegment gespeichert werden. Wenn es immer noch nicht in ein externes Dateidatensatzsegment passt, gibt es in der Attributliste eine Bereitstellung, die mehrere Einträge für ein Attribut enthält, das zusätzliche Abrufinformationen erfordert.
Das Array der Zuordnungspaare wird in komprimierter Form gespeichert und geht davon aus, dass die Informationen vom System dekomprimiert und zwischengespeichert werden. Es besteht aus einer Reihe von NextVcn/CurrentLcn-Paaren. Wenn eine Datei beispielsweise eine einzelne Ausführung von 8 Clustern ab LCN 128 aufweist und die Datei bei LowestVcn 0 beginnt, hat das Zuordnungspaararray nur einen Eintrag, nämlich NextVcn=8 und CurrentLcn=128. Das Array ist ein Bytedatenstrom, der die Änderungen an den Arbeitsvariablen speichert, wenn sie sequenziell verarbeitet werden. Der Bytedatenstrom ist wie folgt als null beendeter Dreifachdatenstrom zu interpretieren:
count byte = v + (l * 16)
Dabei steht v für die Anzahl der geänderten VCN-Bytes niedriger Ordnung und l für die Anzahl geänderter LCN-Bytes niedriger Ordnung.
Der Dekomprimierungsalgorithmus lautet wie folgt:
- Initialisieren Sie NextVcn in
Attribute->LowestVcn
und CurrentLcn auf 0. - Initialisieren Sie den Bytestreamzeiger auf
(PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset
. - Legen Sie CurrentVcn auf NextVcn fest.
- Lesen Sie das nächste Byte aus dem Stream. Wenn es 0 ist, dann brechen; else extrahieren v und l wie zuvor beschrieben.
- Interpretieren Sie die nächsten V-Bytes als signierte Menge, wobei zuerst das Byte in niedriger Reihenfolge angegeben ist. Entpacken Sie es sign-extended in 64 Bits, und fügen Sie es NextVcn hinzu.
- Interpretieren Sie die nächsten l Bytes als signierte Menge, wobei zuerst das Byte mit niedriger Reihenfolge angegeben ist. Entpacken Sie es sign-extended in 64 Bits, und fügen Sie es CurrentLcn hinzu. Wenn dadurch ein CurrentLcn von 0 erzeugt wird, sind die VCNs von CurrentVcn zu NextVcn-1 nicht zugeordnet.
- Aktualisieren Sie die zwischengespeicherten Zuordnungsinformationen aus CurrentVcn, NextVcn und CurrentLcn.
- Fahren Sie mit Schritt 3 fort.
Siehe auch