ReFS Reference

Volume Boot Record (VBR)

The VBR is a 512-byte structure at sector 0 of the ReFS partition. It provides the format parameters – cluster size, version, checksum mode – that every later structure depends on. A backup copy resides in the last sector of the volume.

Field layout

OffsetSizeFieldDescription
0x003Jump instruction00 00 00 – no x86 jump; ReFS is not legacy-BIOS bootable (the Insider build adds boot support)
0x038File system nameASCII "ReFS\0\0\0\0"
0x0B5ReservedAll zeros
0x104FSRS identifierASCII "FSRS" signature (0x46535253)
0x142VBR size (u16)Always 0x0200 (512)
0x162VBR checksum (u16)ROR-1 + ADD over bytes 3..511, excluding offsets 0x16-0x17
0x188Total sector count (u64)Volume size in 512-byte sectors
0x204Bytes per sector (u32)Always 512
0x244Sectors per cluster (u32)8 (4 KiB clusters) or 128 (64 KiB clusters)
0x281Major version (u8)3 on all covered volumes
0x291Minor version (u8)4–14 – see Version values below
0x2A2Checksum algorithm selector (u16)See Checksum algorithm selector below
0x2C4Volume flags (u32)See Volume flags below
0x308ReservedAll zeros
0x388Volume serial number (u64)Unique per volume
0x408Bytes per container (u64)0x04000000 (64 MiB, invariant)
0x4816Extended GUIDAll-zero (pre-v3.10 or upgraded) or populated (native v3.10+ format)
0x58424UnusedAll zeros

Derived values

  • Cluster size = bytes_per_sector * sectors_per_cluster
  • Clusters per container (CPC) = bytes_per_container / cluster_size
    • 4 KiB clusters: CPC = 16,384
    • 64 KiB clusters: CPC = 1,024

The bytes-per-container value at 0x40 is the constant that drives virtual-to-physical address translation; without it the mount code cannot resolve virtual LCNs through the Container Table.

Version values (offset 0x28)

Bytes 0x28 / 0x29MajorMinorWindows release
03 0434Win10 1803
03 0737Win11 21H2
03 0939Win11 22H2
03 0A310Win11 23H2
03 0E314Win11 24H2 / Insider 29574

Warning: The version field records mount history, not the original format version. A v3.4-formatted volume mounted on Win11 will have its version updated to 3.14.

Checksum algorithm selector (offset 0x2A)

ValueAlgorithmMetadata verificationPage reference size
0x0000NoneDisabled (CmsChecksumNone stub)0x68 (104 bytes)
0x0002CRC64 (custom poly 0x9A6C9329AC4BC9B5, not ECMA-182)Enabled from v3.10+0x30 (48 bytes)
0x0004SHA-256Enabled0x48 (72 bytes)

This field is set at format time and never modified during version upgrades. On upgraded volumes (v3.4 to v3.14), VBR 0x2A remains 0x0000 even though the driver activates CRC64 via CHKP flags. The selector also determines the on-disk page reference format, so it must be read before any tree page can be parsed.

Volume flags (offset 0x2C)

BitMaskMeaningFirst version
10x02Mount markerv3.4
20x04Always setv3.4
50x20Win11 formatv3.7
60x40Native v3.10+ format (gates checksum)v3.10

Observed composite values:

  • 0x06 – v3.4
  • 0x26 – v3.7 / v3.9
  • 0x66 – v3.10+

VBR field classification

FieldClassification
Version (0x28)Critical – invalid value prevents mount
Checksum algorithm (0x2A)Critical – invalid value prevents mount
VBR checksum (0x16)Critical – mismatch prevents mount
Volume flags (0x2C)Semi-critical – determines available capabilities
Volume serial (0x38)Informational – arbitrary values preserved on mount
Extended GUID (0x48)Informational – arbitrary values preserved on mount

Checksum algorithm

The VBR checksum (offset 0x16) is computed by RefsIsBootSectorOurs:

checksum = 0 (u16)
for i = 3 to 511:
    if i == 0x16 or i == 0x17: skip
    checksum = (checksum >> 1) | (checksum << 15)  // rotate right 1
    checksum = (checksum + VBR[i]) & 0xFFFF
compare checksum with stored value at VBR[0x16]

Version-specific notes

  • v3.10+: Extended GUID at 0x48 is populated. On earlier versions this field is all-zero.
  • Upgraded volumes: VBR 0x2A stays 0x0000, VBR flags stay 0x06, Extended GUID stays all-zero. The driver uses CHKP flags (not VBR 0x2A) as the runtime checksum indicator. Geometry extraction from the boot sector is handled by InitializeVcbFromBootSector.
  • Insider build: Jump instruction at 0x00 may contain a real x86 jump (first bootable ReFS version).

Cautions

  • refsutil fixboot is destructive: it zeroes the container size, volume serial, checksum algorithm selector, Extended GUID, and volume flags fields.
  • The VBR version field reflects mount history, not original format version. Cross-check with the superblock or checkpoint for provenance.

Raw example

From a v3.14 image, the VBR at the partition start (byte offset 0x1000000):

0x00:  00 00 00 52 65 46 53 00  00 00 00 00 00 00 00 00   |...ReFS.........|
0x10:  46 53 52 53 00 02 b2 7a  00 00 7e 00 00 00 00 00   |FSRS......~.....|
0x20:  00 02 00 00 08 00 00 00  03 0e 02 00 66 00 00 00   |............f...|
0x30:  00 00 00 00 00 00 00 00  44 99 a9 5a a6 a9 5a 00   |........D..Z..Z.|
0x40:  00 00 00 04 00 00 00 00  00 b2 8e 59 d7 ab 80 45   |...........Y...E|
OffsetBytesFieldValue
0x0352 65 46 53FS nameReFS
0x1046 53 52 53FSRS signatureFSRS
0x2803 0eVersion3.14
0x2A02 00Checksum selector0x0002 (CRC64)
0x2C66 00 00 00Volume flags0x66
0x4000 00 00 04Bytes per container0x04000000 (64 MiB)
0x4800 b2 8e 59 …Extended GUIDpopulated (native v3.10+ format)

Cross-references

Evidence

The field layout, signatures, and checksum loop are confirmed by the string literals and the decompiled driver – RefsIsBootSectorOurs validates the boot sector and computes the 0x16 checksum, and InitializeVcbFromBootSector extracts the geometry; the field values, the immutable format-time fields on upgrade, and the refsutil fixboot effects are raw-disk verified across the corpus. The custom CRC64 polynomial (not ECMA-182) is confirmed.