ReFS Reference

Page References

A page reference binds a child page’s address to a checksum of that child’s contents. Every B+-tree parent stores a page reference for each child, chaining the whole metadata tree into a Merkle tree anchored at the checkpoint.

The page reference exists in three version- and checksum-dependent formats. Assuming the wrong format misaligns every field that follows, because the page reference size is the stride used to walk a checkpoint root list or B+-tree node.

Format 1: 104 bytes (0x68) – ReFS v3.4 through v3.9

OffsetSizeFieldDescription
0x008LCN slot 0 (u64)First cluster of referenced page
0x088LCN slot 1 (u64)Second cluster
0x108LCN slot 2 (u64)Third cluster
0x188LCN slot 3 (u64)Fourth cluster
0x202Flags (u16)0x0000
0x221Checksum type (u8)See Checksum Type Codes below
0x231Checksum data offset (u8)0x08
0x244Checksum data length (u32)8 (CRC64)
0x288CRC64 checksumWritten but not verified before v3.14
0x3056PaddingZero-filled

Total: 104 bytes (0x68)

CRC64 values are written at format time but the mount path instantiates CmsChecksumNone (a stub whose VerifyChecksum always returns success without comparison), so metadata-page checksums are not verified on these versions.

Format 2: 48 bytes (0x30) – ReFS v3.10+ with CRC64

OffsetSizeFieldDescription
0x008LCN slot 0 (u64)First cluster
0x088LCN slot 1 (u64)Second cluster
0x108LCN slot 2 (u64)Third cluster
0x188LCN slot 3 (u64)Fourth cluster
0x202Flags (u16)0x0000
0x221Checksum type (u8)0x02 (CRC64, custom poly — not ECMA-182)
0x231Checksum data offset (u8)0x08
0x244Checksum data length (u32)8
0x288CRC64 checksumVerified at mount from v3.14

Total: 48 bytes (0x30). Same as Format 1 with the padding removed.

Format 3: 72 bytes (0x48) – ReFS v3.14 with SHA-256

OffsetSizeFieldDescription
0x008LCN slot 0 (u64)First cluster
0x088LCN slot 1 (u64)Second cluster
0x108LCN slot 2 (u64)Third cluster
0x188LCN slot 3 (u64)Fourth cluster
0x202Flags (u16)0x0000
0x221Checksum type (u8)SHA-256 selector
0x231Checksum data offset (u8)0x08
0x244Checksum data length (u32)32
0x2832SHA-256 digestComputed over child page

Total: 72 bytes (0x48)

Checksum Type Codes (offset +0x22)

ValueAlgorithmNotes
0x00NoneNo verification
0x01CRC32-CCHKP self-descriptor only
0x02CRC64 (custom poly, not ECMA-182)Standard metadata verification

Format Selection Rule

The format is determined by the VBR checksum algorithm selector (offset 0x2A) and the CHKP page reference size field (offset 0x5C):

VBR 0x2ACHKP 0x5CFormat
0x00000x68104-byte (v3.4)
0x00020x3048-byte (CRC64)
0x00040x4872-byte (SHA-256)

Verification Behavior by Version

PropertyWin10 (v3.4)Win11 (v3.14)
VBR 0x2A0x0000 (None)0x0002 (CRC64)
CHKP flags bit 0x400Not setSet
Verification classCmsChecksumNone (stub)CmsChecksum (real CRC64)
CRC64 in page refsWritten but never verifiedWritten and verified

On upgraded volumes (v3.4 to v3.14): VBR 0x2A remains 0x0000 but CHKP flag 0x0400 is set. The driver uses CHKP flags (not VBR 0x2A) as the runtime indicator.

Checkpoint Self-Checksum

The CHKP self-descriptor page reference carries checksum type 0x01 (CRC32-C). Separately, the SUPB/CHKP block itself carries a cluster-size-dependent self-checksum (a LcnWithChecksum self-descriptor at SUPB+0xD0, computed over one cluster with the descriptor zeroed; the algorithm is named by the cktype byte at descriptor+0x22): CRC32-C / 4 B on 4K-cluster volumes, CRC64 / 8 B on 64K, SHA-256 / 32 B on SHA-256 volumes. It is verified at mount and self-healed on mismatch.

Cross-references

  • VBR – checksum algorithm selector at offset 0x2A determines format
  • Checkpoint (CHKP) – page reference size at CHKP+0x5C; checkpoint is Merkle root
  • Page Header – the 80-byte header precedes page reference areas in B+-tree nodes

Evidence

The three formats, the field layout, the checksum-type codes, and the format-selection rule are confirmed in the decompiled driver. The custom-polynomial CRC64 (not ECMA-182) is confirmed. The non-verification on v3.4 follows from CmsChecksumNone::VerifyChecksum always returning TRUE, replaced in v3.14 by the unified CmsChecksum class that performs real CRC64 computation. The cluster-size-dependent SUPB/CHKP self-checksum, verified and self-healed at mount, is confirmed.