ReFS Reference

Checkpoint (CHKP)

The Checkpoint is the atomic commit point of a ReFS volume. A volume keeps two alternating checkpoints; each is one metadata page — 4 consecutive clusters on 4K-cluster volumes (16 KiB page) or 1 cluster on 64K-cluster volumes (64 KiB page). The copy with the higher virtual clock is the current one, and the lower-clock copy is the previous consistent state (a rollback target until the next flush).

Field Layout

OffsetSizeFieldDescription
0x0080Page headerCommon metadata page header (see Page Header) with signature "CHKP"
0x504Version echo (u32)Packed `minor«16
0x542Major version (u16)Always 3
0x562Minor version (u16)4, 7, 9, 10, or 14
0x584Table descriptor end (u32)0xD0 (v3.4-v3.10), 0xE0 (v3.14), 0xE8 (Insider)
0x5C4Page reference size (u32)0x68 (v3.4), 0x30 (CRC64), 0x48 (SHA-256)
0x608Virtual clock (u64)Matches header at 0x10; the checkpoint sequence counter — increments on every committed checkpoint. Bootstrap selects the active checkpoint by the higher value.
0x688Allocator clock (u64)Always ≤ virtual clock. A separate counter advanced when the allocator’s persisted state changes; the gap = virtual − allocator is the count of checkpoints since the last allocation-table change. Forensic interpretation: a non-zero gap indicates recent checkpoints were metadata-only / in-place (no cluster allocation since the last allocator commit). The per-operation semantic is inferred from the offset relationship rather than verified at the operation level.
0x708Oldest log record ref (u64)Low 32 bits = log offset, high 32 bits = segment
0x784CHKP flags (u32)See CHKP Flags below
0x7C12ReservedAlways zero
0x884Data area end offset (u32)0x680 (v3.4), 0x380 (v3.14) on most checkpoints, but 0x0 on some v3.14-native images — the 0x88–0x8F region co-varies populated-vs-zeroed per checkpoint, so do not treat it as a fixed constant
0x8C4Max root capacity (u32)0x20 (32) on most images but 0x0 on the same v3.14-native images as 0x88; the “MS_CHECKPOINT_MAX_ROOTS = 0x20” label holds only where the region is populated
0x904Root count (u32)Always 13
0x94varRoot pointer list13 page references (direct) or pointer to root list page (indirect)

Checkpoint selection and fallback

Each CHKP carries a self-checksum verified at mount — the algorithm is cluster-size-dependent (4-byte CRC32-C on 4K-cluster, 8-byte CRC64 on 64K-cluster, 32-byte SHA-256 on SHA-256 volumes), the same mechanism the Superblock uses. At mount, ChooseCheckpointRecord picks the copy with the highest virtual clock among the copies that pass their checksum. An invalid higher-clock copy is skipped, falling back automatically to the lower-clock valid copy; if both fail, the mount fails. Because each flush writes the other slot with clock+1, the lower-clock slot always holds the previous consistent state.

CHKP Flags (offset 0x78)

BitMaskMeaningFirst Version
10x0002Base flag (always set)v3.4
70x0080Native format marker (not set on upgraded volumes)v3.10
90x0200Indirect root list modev3.14
100x0400CRC64 metadata verification activev3.14
4,5,80x0130Deduplication-related flagsv3.14 (dedup)
130x2000Insider-only flagInsider

Composite Flag Values by Version

VersionFlags (hex)Flags (binary)Key Bits
v3.40x00020000 0000 0010Base
v3.70x00020000 0000 0010Same
v3.90x00020000 0000 0010Same
v3.100x00820000 1000 0010+native format
v3.14 native0x06820110 1000 0010+indirect roots +CRC64
v3.14 upgraded0x06020110 0000 0010+indirect +CRC64, missing native
v3.14 dedup/compress0x07b20111 1011 0010+dedup/compression feature bits (0x130)
Insider (native)0x26820010 0110 1000 0010native v3.14 + Insider flag
Insider (upgraded)0x26020010 0110 0000 0010upgraded (no 0x080) + Insider flag

The 0x0080 bit cleanly separates native-formatted v3.10+ volumes (set) from upgraded-from-v3.4 volumes (clear) — an independent corroboration of the volume information driver-version-stamp upgrade signal.

Direct vs Indirect Root Access

The 13 root table pointers have two encodings, selected by flag bit 0x0200:

  • Without 0x0200 (direct): 13 page references stored inline starting at CHKP+0x94
  • With 0x0200 (indirect): CHKP+0x94 holds a u32 offset within the same checkpoint page to the root-list region (not a pointer to a separate page — the value is far smaller than one page and equals the embedded-data base offset)

Critical: A parser must read the flag bit before decoding the root list. Reading an indirect-mode checkpoint as direct (or vice versa) yields 13 wrong root addresses.

13 Root Table Pointers

IndexTableTable IDSchemaAddressingFailover Pair
0Object ID Table0x020xe030Virtual#5
1Medium Allocator0x210xe010Virtual
2Container Allocator0x200xe010Virtual
3Schema Table0x010xe060Virtual#9
4Parent-Child Table0x030xe040Virtual
5Object ID Table (dup)0x040xe030Virtual
6Block Refcount0x050xe0b0Virtual
7Container Table0x0B0xe0c0Real (physical)#8
8Container Table (dup)0x0C0xe0c0Real (physical)
9Schema Table (dup)0x060xe060Virtual
10Container Index0x0E0xe100Virtual
11Integrity State0x0F0xe080Virtual
12Small Allocator0x220xe010Real (physical)

Roots 7, 8, and 12 use real (physical) LCNs as a bootstrap exception; every other root uses virtual addressing (VLCN → PLCN via the Container Table).

Failover pairs: 0/5 (Object ID), 3/9 (Schema), 7/8 (Container). Block Refcount (#6) has no failover pair.

The Container-Table failover pair (roots 7 & 8) is the set {0x0B, 0x0C} at roots {7, 8} — the common ordering is root 7 = 0x0B / root 8 = 0x0C, but the two can appear swapped, so the invariant is the set, not a fixed index→Table-ID order.

Version Echo (offset 0x50)

ScenarioValue
Native v3.140x000E0003 (minor=14, major=3)
Upgraded volumes0x00000000
v3.4 through v3.90x00000000

The version echo distinguishes natively formatted v3.10+ volumes from upgraded ones.

Virtual Clock Typical Values

ScenarioApproximate Value
Freshly formatted volume~20-30
After ~1,000 file operations~50-100
After v3.4 to v3.14 upgrade+41 transactions

Parsing Sequence

  1. Read 80-byte page header; verify signature is "CHKP"
  2. Read version at 0x54/0x56
  3. Read page reference size at 0x5C (determines stride for root list traversal)
  4. Read CHKP flags at 0x78
  5. Check bit 0x0200 to determine direct vs indirect root mode
  6. Parse the 13 root pointers accordingly at 0x94
  7. For each root, use the appropriate addressing mode (virtual for most, physical for roots 7, 8, 12)

Cross-references

Evidence

The page header signature, the 13 root-table identities, the version fields, and the page-reference sizes are confirmed in the decompiled driver and the binary string literals; ValidateCheckpointRecord checks the flag bits at CHKP+0x78 and ChooseCheckpointRecord performs highest-clock selection. The flag composites, the version echo, the real-LCN bootstrap exception for roots 7/8/12, and the field offsets were re-measured directly on disk across the corpus. The 0x88/0x8C populated-vs-zeroed co-variation is confirmed. The CHKP flag decomposition is confirmed.