Evtx Block-Header
Jede Protokolldatei enthält einen oder mehrere sogenannte "Blöcke" (chunks), die die Ereignismeldungen enthalten. Im Betrieb ist dabei jeweils nur der aktuelle Block einer Protokolldatei im Arbeitsspeicher abgebildet.
Jeder Block ist 64 kiB groß. Die ersten 0x200 Bytes enthalten dabei den Block-Header, die String-Tabelle und eine Template-Tabelle.
| Offset | Type | Bedeutung |
|---|---|---|
| 0x000 | char[8] | Magic, const 'ElfChnk', 0x00 |
| 0x008 | int64 | NumLogRecFirst |
| 0x010 | int64 | NumLogRecLast |
| 0x018 | int64 | NumFileRecFirst |
| 0x020 | int64 | NumFileRecLast |
| 0x028 | uint32 | OfsTables, const 0x080 |
| 0x02c | uint32 | OfsRecLast |
| 0x030 | uint32 | OfsRecNext |
| 0x034 | uint32 | DataCRC |
| 0x038 | char[68] | unbekannt |
| 0x07c | uint32 | HeaderCRC |
| 0x080 | uint32[64] | StringTable |
| 0x180 | uint32[32] | TemplateTable |
Der Block-Header enthält zwei Paare von Datensatznummern, die jeweils die erste und die letzte Satznummer innerhalb des Blocks angeben. Das erste Paar bezieht sich dabei auf das Ereignisprotokoll als Gesamtheit; es kann sich durchaus über mehrere Dateien hin fortsetzen. Das zweite Paar hingegen bezieht sich auf die jeweilige Protokolldatei. Der Unterschied wird in einem späteren Beitrag offensichtlich werden, wenn einige ungewöhnliche Protokolldateien betrachtet werden. In leeren Protokolldateien sind alle Zähler auf den Wert -1 gesetzt, mit Ausnahme von NumLogRecFirst, der als Nummer des nächsten zu schreibenden Datensatzes eine 1 anzeigt.
Die CRC32-Prüfsumme in HeaderCRC wird über die ersten 0x200 Bytes des Blocks berechnet. Hierbei werden jedoch 8 Bytes ab dem Offset 0x78 ausgelassen. Betroffen sind also die Prüfsumme selbst und das ihr unmittelbar vorangehende DWORD (vgl. die Berechnung im Datei-Header).
Für den Datenbereich von 0x200 bis zum Ende des letzten Ereigniseintrags wird ebenfalls eine CRC32-Prüfsumme berechnet und in DataCRC gespeichert.
Die StringTable und TemplateTable enthalten 64 beziehungsweise 32 Einträge. Der Ereignisprotokolldienst verwendet diese beiden Tabellen, um die redundante Deklaration bestimmter Strings und XML-Strukturen zu vermeiden. Beide Tabellen werden nicht benötigt, um eine Protokolldatei in eine lesbare Form zu überführen.
29.08.2010: DataCRC hinzugefügt.