PRIVHEAD - Technical

Previous Next


The Private Header (PRIVHEAD) structure is 512 bytes long and there are three copies on each physical disk. The first is located just after the partition table. The second is near the end of the LDM database. The third makes up the last 512 bytes of the physical disk.


Offset Size Description
0x00 8 PRIVHEAD Magic number
0x08 4 Checksum (a)
0x0C 2 Major Version Number (see below)
0x0E 2 Minor Version Number (see below)
0x10 8 Timestamp of Last Update (FileTime UTC)
0x18 8 Update Sequence Number (b)
0x20 8 Primary Private Header LBA (relative to Private Region Start)
0x28 8 Secondary Private Header LBA (relative to Private Region Start)
0x30 64 Disk GUID (string, null padded)
0x70 64 Host GUID (string, null padded)
0xB0 64 Disk Group GUID (string, null padded)
0xF0 31 Disk Group Name (string, null padded)
0x10F 4 Bytes Per Block (a.k.a. Sector)
0x113 4 Private Header Flags (see below)
0x117 2 Public Region Slice Number
0x119 2 Private Region Slice Number
0x11B 8 Public Region Start LBA
0x123 8 Public Region Size LBA
0x12B 8 Private Region Start LBA
0x133 8 Private Region Size LBA
0x13B 8 Primary TOC LBA (relative to Private Region Start)
0x143 8 Secondary TOC LBA (relative to Private Region Start)
0x14B 4 Number of Configs
0x14F 4 Number of Logs
0x153 8 Size of Config
0x15B 8 Size of Log
0x163 4 Disk Signature (or zero)
0x167 16 Disk Set GUID (hex)
0x177 16 Disk Set GUID repeat (hex)

Private Header Flags:

Flag Description
0x01 shared (the opposite is private)
0x02 noautoimport

Version Numbers:

Value Description
2.11 Windows 2000 / XP / 2003
2.12 Windows Vista / 7 / 2008
2.12 VSFW 4.0


(a) Sum of all the bytes in the sector excluding the 4 bytes of the checksum field
(b) Kept in sync with UpdateSequenceNumber of the most recent TOCBlock.

N.B. The final two GUIDs may be missing from the first PRIVHEAD.
N.B. The next update to the TOC will be written to the location of the previous TOCs, and then the private header will be updated to point to the updated TOC.
N.B. To calculate where the previous primary TOC is located, you can use the following method:
   if (PrimaryTocLBA == 1)
       return PrimaryTocLBA + 1;
       return PrimaryTocLBA - 1;

Copyright © 2001-2015