Vorab: die Backup Database ist keine Datenbank im klassischen Sinn, sondern eine Menge von Dateien in dem Verzeichnis D:\folders\{00008086-058D-4C89-AB57-A7F909A47AB4}
Client unabhängig:
Name | Beschreibung | Größe |
Commit.dat | vermutlich ein Semaphore | 7680 |
Control.4096.dat | Verwaltung der Datenfiles ?? | 4096 |
Data.4096.n.dat ..... n = (0, 1, 2, ) | die gesicherten Cluster | bis zu 4 GB |
GlobalCluster.4096.dat | var. (>8 GB) | |
GlobalClusterLatest.4096.dat | ?? | 14336 |
Index.4096.dat | var. (>2 GB) |
{GUID}.Machine.configdat | beschreibt den Client | 4608 |
Name.VolumeConfig.configdat | beschreibt die Partitionen des Clients | 4608 |
Name.BackupSet.Dat | Auflistung aller vorhandenen Sicherungen für diesen Client | > 4608 |
Name.LW.Volume.dat | Informationen zu allen Sicherungen dieser Partition | var. |
Name.LW.VolumeCluster.4096.dat | var. groß | |
Name.LW.FileRecordHash.4096.dat | Hash-Codes der File-Sätze im $MFT | var. |
Wenn Partition Bootpartition ist: Name.LW.Boot.dat | MBR der Partition | 5120 oder 5632 |
Bei manchen Clients zusätzlich:
Name.LW.VolumeClusterLatest1.4096.dat | var. groß | |
Name.LW.VolumeClusterLatest2.4096.dat | var. | |
Name.LW.VolumeClusterLatest3.4096.dat | var. |
Wobei der Clientname Name ggf. mit -1, -2, ... ergänzt wird wenn derselbe Name für unterschiedliche GUIDs gefunden wird
Für die Partitionsbezeichnung LW habe ich bisher entweder den Laufwerksbuchstaben oder PQSERVICE
In den Datenfiles ist XML-artig die Struktur des Inhaltes abgelegt .. leider stimmt diese Information nicht immer 100 %
commit.dat
Code: Alles auswählen
<File Type="Commit">
<Header>
<Field Type=""boolean"" Name=""Committed"" />
</Header>
<Record>
<Field Type=""string"" Name=""FileName"" />
<Field Type=""int"" Name=""StreamIndex"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Control">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""NextIndex"" />
<Field Type=""int"" Name=""NextDataOffset"" />
</Header>
</File>
Code: Alles auswählen
<File Type="Data">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""Index"" />
<Field Type=""int"" Name=""DataSize"" />
</Header>
</File>
Code: Alles auswählen
<File Type="GlobalCluster">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
</Header>
<Record>
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
<Field Type=""int"" Name=""DataIndex"" />
</Record>
</File>
Danach folgen Sätze von 262.144 Byte Länge (256 KByte) in denen eine Datenstruktur wie oben beschrieben wurde zu erkennen ist: 16 Byte für den Hash und eine variable Anzahl Byte für den DataIndex, welcher vermutlich ein Index in die zugehörige Data.4096.nnn.dat ist. Interessanterweise sind entweder die gerade Satznummer oder die ungeraden Satznummer gültig, d.H. der Satz 1 wird gelesen, geändert und dann als Satz 2 geschrieben, Satz 3 wird gelesen und dann als Satz 4 geschrieben. Bei der nächsten Sicherung wird Satz 2 gelesen, geändert und als Satz 1 geschrieben, Satz 4 gelesen und als Satz 3 geschrieben (natürlich stark vereinfacht ohne Berücksichtigunge von Löschungen oder Einfügungen).
Wo man erfahren kann ob geraden oder ungeraden Sätze gültig sind ist unklar, ebenso ist noch unklar wie die Übergänge zwischen den 256 KByte-Sätzen behandelt werden.
Die Hash-Werte findet man in den Sätzen aufsteigend von 00 .. 00 bis FE .. FF
GlobalClusterLatest.4096.dat
Code: Alles auswählen
<File Type="GlobalClusterLatest">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""VolumeGuid"" />
<Field Type=""string"" Name=""MachineFile"" />
<Field Type=""string"" Name=""VolumeFile"" />
<Field Type=""int"" Name=""Version"" />
</Header>
<Record>
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
<Field Type=""int"" Name=""DataIndex"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Index">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
</Header>
</File>
Code: Alles auswählen
<File Type="Machine">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
</Header>
<Record>
<Field Type=""string"" Name=""FileName"" />
<Field Type=""string"" Name=""MachineName"" />
<Field Type=""string"" Name=""Description"" />
<Field Type=""string"" Name=""Manufacturer"" />
<Field Type=""string"" Name=""Model"" />
<Field Type=""string"" Name=""IpAddress"" />
<Field Type=""binary"" Name=""MacAddress"" />
<Field Type=""boolean"" Name=""IsConfigured"" />
<Field Type=""boolean"" Name=""AllVolumesConfigured"" />
<Field Type=""boolean"" Name=""AnyVolumesIncluded"" />
<Field Type=""boolean"" Name=""AnyVolumesEligible"" />
<Field Type=""boolean"" Name=""JobsExist"" />
<Field Type=""int"" Name=""LastGoodBackupTime"" />
<Field Type=""int"" Name=""LastStatus"" />
<Field Type=""int"" Name=""DiskUsed"" />
</Record>
</File>
Code: Alles auswählen
<File Type="VolumeConfig">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
</Header>
<Record>
<Field Type=""fixedbinary"" Length=""16"" Name=""Guid"" />
<Field Type=""varbinary"" Name=""UniqueId"" />
<Field Type=""string"" Name=""MountPoint"" />
<Field Type=""string"" Name=""VolumeLabel"" />
<Field Type=""int"" Name=""Capacity"" />
<Field Type=""int"" Name=""BytesUsed"" />
<Field Type=""string"" Name=""FileSystem"" />
<Field Type=""int"" Name=""BytesPerSector"" />
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""Location""/>
<Field Type=""int"" Name=""BytesUsedForBackups"" />
<Field Type=""int"" Name=""Status"" />
<Field Type=""boolean"" Name=""IsEligibleForBackup"" />
<Field Type=""int"" Name=""DiskSignature"" />
<Field Type=""int"" Name=""Partition"" />
<Field Type=""boolean"" Name=""BackupsExist"" />
<Field Type=""int"" Name=""ExcludedFolderCount"" />
<Field Type=""string"" Occurs=""ExcludedFolderCount"" Name=""ExcludedFolder"" />
<Field Type=""string"" Name=""File"" />
</Record>
</File>
Name.BackupSet.Dat
Code: Alles auswählen
<File Type="BackupSet">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
</Header>
<Record>
<Field Type=""int"" Name=""Index"" />
<Field Type=""int"" Name=""Timestamp"" />
<Field Type=""int"" Name=""Duration"" />
<Field Type=""int"" Name=""BytesUsed"" />
<Field Type=""boolean"" Name=""IsAutomatic"" />
<Field Type=""string"" Name=""Description"" />
<Field Type=""int"" Name=""Status"" />
<Field Type=""int"" Name=""Retention"" />
<Field Type=""int"" Name=""VolumeCount"" />
<Field Type=""struct"" Occurs=""VolumeCount"" Name=""Volume"">
<Field Type=""fixedbinary"" Length=""16"" Name=""Guid"" />
<Field Type=""string"" Name=""Name"" />
</Field>
<Field Type=""int"" Name=""FailureReason"" />
<Field TYpe=""stringarray"" Name=""FailureDetails"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Volume">
<Header>
<Field Type="fixedbinary" Length="16" Name="MachineGuid"/>
<Field Type="binary" Length="16" Name="VolumeGuid"/>
</Header>
<Record>
<Field Type="int" Name="BackupSetIndex"/>
<Field Type="int" Name="Version"/>
<Field Type="varbinary" Name="UniqueId"/>
<Field Type="string" Name="MountPoint"/>
<Field Type="string" Name="VolumeLabel"/>
<Field Type="string" Name="FileSystem"/>
<Field Type="int" Name="BytesPerSector"/>
<Field Type="int" Name="BytesPerCluster"/>
<Field Type="int" Name="StartTime"/>
<Field Type="int" Name="Duration"/>
<Field Type="int" Name="OriginalVolumeBytes"/>
<Field Type="int" Name="MinimumRestoreBytes"/>
<Field Type="int" Name="ClusterCount"/>
<Field Type="int" Name="ChangedClusterCount"/>
<Field Type="int" Name="HashesReceivedCount"/>
<Field Type="int" Name="NewClusterCount"/>
<Field Type="int" Name="Status"/>
<Field Type="boolean" Name="IsActive"/>
<Field Type="struct" Name="AutoExclusionSizes" >
<Field Type="int" Name="ClientSideCache"/>
<Field Type="int" Name="TemporaryFiles"/>
<Field Type="int" Name="DigitalVideoRecorder"/>
<Field Type="int" Name="PageFile"/>
<Field Type="int" Name="RecycleBin"/>
<Field Type="int" Name="HibernationFile"/>
<Field Type="int" Name="MemoryDump"/>
<Field Type="int" Name="ShadowVolumes"/>
<Field Type="int" Name="Other"/>
</Field>
<Field Type="int" Name="ExcludedFoldersCount"/>
<Field Type="struct" Occurs="ExcludedFoldersCount" Name="ExcludedFolders" >
<Field Type="string" Name="Name"/>
<Field Type="int" Name="Size"/>
<Field Type="boolean" Name="IsAutoExcluded"/>
</Field>
<Field Type="int" Name="BadFilesCount"/>
<Field Type="struct" Name="BadFile" >
<Field Type="string" Name="Name"/>
<Field Type="int" Name="Size"/>
</Field>
<Field Type="int" Name="MbrIndex"/>
<Field Type="int" Name="DiskSignature"/>
<Field Type="int" Name="Partition"/>
<Field Type="int" Name="PartitionOffset"/>
<Field Type="int" Name="FailureReason"/>
<Field TYpe="stringarray" Name="FailureDetails"/>
<Field Type="varbinary" Name="ClientInfo"/>
</Record>
</File>
Code: Alles auswählen
<File Type="VolumeCluster">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
<Field Type=""varbinary"" Name=""UniqueId"" />
<Field Type=""int"" Name=""BytesPerCluster"" />
</Header>
<Record>
<Field Type=""int"" Name=""ClusterIndex"" />
<Field Type=""int"" Name=""LowestVersion"" />
<Field Type=""int"" Name=""HighestVersion"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
<Field Type=""int"" Name=""DataIndex"" />
</Record>
</File>
Code: Alles auswählen
<File Type="FileRecordHash">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
<Field Type=""varbinary"" Name=""UniqueId"" />
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""FileVersion"" />
</Header>
<Record>
<Field Type=""int"" Name=""Index"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Boot">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid""/>
<Field Type=""binary"" Length=""16"" Name=""VolumeGuid""/>
</Header>
<Record>
<Field Type=""int"" Name=""Count""/>
<Field Type=""varbinary"" Name=""MBR"" Occurs=""Count""/>
</Record>
</File>