Skip to main content

winreg_format/
version.rs

1//! REGF hive version enumeration.
2
3/// Registry hive format version, determined by the minor version field
4/// in the base block header.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub enum RegfVersion {
7    /// Version 1.0-1.2: Windows NT 3.x. LI index only.
8    V1_0,
9    /// Version 1.3: Windows NT 4.0. Adds LF (fast leaf).
10    V1_3,
11    /// Version 1.4: Windows XP beta. Adds big data (DB).
12    V1_4,
13    /// Version 1.5: Windows XP release+. Adds LH (hash leaf).
14    V1_5,
15    /// Version 1.6: Windows 10+. Differencing/layered hives.
16    V1_6,
17}
18
19impl RegfVersion {
20    /// Determine version from minor version number.
21    pub fn from_minor(minor: u32) -> Option<Self> {
22        match minor {
23            0..=2 => Some(Self::V1_0),
24            3 => Some(Self::V1_3),
25            4 => Some(Self::V1_4),
26            5 => Some(Self::V1_5),
27            6 => Some(Self::V1_6),
28            _ => None,
29        }
30    }
31
32    /// Whether this version supports LH (hash leaf) index cells.
33    pub fn has_hash_leaf(self) -> bool {
34        self >= Self::V1_5
35    }
36
37    /// Whether this version supports DB (big data) cells.
38    pub fn has_big_data(self) -> bool {
39        self >= Self::V1_4
40    }
41
42    /// Whether this version supports LF (fast leaf) index cells.
43    pub fn has_fast_leaf(self) -> bool {
44        self >= Self::V1_3
45    }
46
47    /// Whether this version supports differencing/layered keys.
48    pub fn has_layered_keys(self) -> bool {
49        self >= Self::V1_6
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn version_from_minor() {
59        assert_eq!(RegfVersion::from_minor(0), Some(RegfVersion::V1_0));
60        assert_eq!(RegfVersion::from_minor(2), Some(RegfVersion::V1_0));
61        assert_eq!(RegfVersion::from_minor(3), Some(RegfVersion::V1_3));
62        assert_eq!(RegfVersion::from_minor(5), Some(RegfVersion::V1_5));
63        assert_eq!(RegfVersion::from_minor(6), Some(RegfVersion::V1_6));
64        assert_eq!(RegfVersion::from_minor(99), None);
65    }
66
67    #[test]
68    fn version_feature_gates() {
69        assert!(!RegfVersion::V1_0.has_fast_leaf());
70        assert!(RegfVersion::V1_3.has_fast_leaf());
71        assert!(!RegfVersion::V1_3.has_big_data());
72        assert!(RegfVersion::V1_4.has_big_data());
73        assert!(!RegfVersion::V1_4.has_hash_leaf());
74        assert!(RegfVersion::V1_5.has_hash_leaf());
75        assert!(RegfVersion::V1_6.has_layered_keys());
76    }
77
78    #[test]
79    fn versions_are_ordered() {
80        assert!(RegfVersion::V1_0 < RegfVersion::V1_3);
81        assert!(RegfVersion::V1_3 < RegfVersion::V1_5);
82        assert!(RegfVersion::V1_5 < RegfVersion::V1_6);
83    }
84}