2 * PROJECT: Registry manipulation library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>
5 * Copyright 2001 - 2005 Eric Kohl
13 #define HINIT_CREATE 0
14 #define HINIT_MEMORY 1
16 #define HINIT_MEMORY_INPLACE 3
18 #define HINIT_MAPFILE 5
23 #define HIVE_VOLATILE 1
24 #define HIVE_NOLAZYFLUSH 2
25 #define HIVE_HAS_BEEN_REPLACED 4
26 #define HIVE_HAS_BEEN_FREED 8
27 #define HIVE_UNKNOWN 0x10
28 #define HIVE_IS_UNLOADING 0x20
33 #define HFILE_TYPE_PRIMARY 0
34 #define HFILE_TYPE_LOG 1
35 #define HFILE_TYPE_EXTERNAL 2
36 #define HFILE_TYPE_MAX 3
41 #define HBLOCK_SIZE 0x1000
42 #define HSECTOR_SIZE 0x200
43 #define HSECTOR_COUNT 8
45 #define HV_LOG_HEADER_SIZE FIELD_OFFSET(HBASE_BLOCK, Reserved2)
46 #define HV_SIGNATURE 0x66676572 // "regf"
47 #define HV_BIN_SIGNATURE 0x6e696268 // "hbin"
54 #define HSYS_WHISTLER_BETA1 4
55 #define HSYS_WHISTLER 5
56 #define HSYS_MINOR_SUPPORTED HSYS_WHISTLER
61 #define HBASE_FORMAT_MEMORY 1
71 * A handle to cell index. The highest bit specifies the cell storage and
72 * the other bits specify index into the hive file. The value HCELL_NULL
73 * (-1) is reserved for marking invalid cells.
75 typedef ULONG HCELL_INDEX
, *PHCELL_INDEX
;
80 #define HCELL_NIL MAXULONG
81 #define HCELL_CACHED 1
83 #define HCELL_TYPE_MASK 0x80000000
84 #define HCELL_BLOCK_MASK 0x7ffff000
85 #define HCELL_OFFSET_MASK 0x00000fff
86 #define HCELL_TYPE_SHIFT 31
87 #define HCELL_BLOCK_SHIFT 12
88 #define HCELL_OFFSET_SHIFT 0
90 #define HvGetCellType(Cell) \
91 ((ULONG)(((Cell) & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT))
92 #define HvGetCellBlock(Cell) \
93 ((ULONG)(((Cell) & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT))
101 #include <pshpack1.h>
106 * On-disk header for registry hive file.
109 #define HIVE_FILENAME_MAXLEN 31
111 typedef struct _HBASE_BLOCK
113 /* Hive identifier "regf" (0x66676572) */
116 /* Update counters */
120 /* When this hive file was last modified */
121 LARGE_INTEGER TimeStamp
;
123 /* Registry format major version (1) */
126 /* Registry format minor version (3)
127 Version 3 added fast indexes, version 5 has large value optimizations */
130 /* Registry file type (0 - Primary, 1 - Log) */
133 /* Registry format (1 is the only defined value so far) */
136 /* Offset into file from the byte after the end of the base block.
137 If the hive is volatile, this is the actual pointer to the CM_KEY_NODE */
138 HCELL_INDEX RootCell
;
140 /* Size in bytes of the full hive, minus the header, multiple of the block size (4KB) */
146 /* Last 31 UNICODE characters, plus terminating NULL character,
147 of the full name of the hive file */
148 WCHAR FileName
[HIVE_FILENAME_MAXLEN
+ 1];
152 /* Checksum of first 0x200 bytes */
155 ULONG Reserved2
[0x37E];
158 } HBASE_BLOCK
, *PHBASE_BLOCK
;
160 C_ASSERT(sizeof(HBASE_BLOCK
) == HBLOCK_SIZE
);
164 /* Bin identifier "hbin" (0x6E696268) */
167 /* Block offset of this bin */
168 HCELL_INDEX FileOffset
;
170 /* Size in bytes of this bin, multiple of the block size (4KB) */
175 /* When this bin was last modified */
176 LARGE_INTEGER TimeStamp
;
178 /* Unused (In-memory only) */
182 typedef struct _HCELL
184 /* <0 if used, >0 if free */
192 typedef struct _CELL_DATA
*
193 (CMAPI
*PGET_CELL_ROUTINE
)(
199 (CMAPI
*PRELEASE_CELL_ROUTINE
)(
205 (CMAPI
*PALLOCATE_ROUTINE
)(
212 (CMAPI
*PFREE_ROUTINE
)(
218 (CMAPI
*PFILE_READ_ROUTINE
)(
219 struct _HHIVE
*RegistryHive
,
227 (CMAPI
*PFILE_WRITE_ROUTINE
)(
228 struct _HHIVE
*RegistryHive
,
236 (CMAPI
*PFILE_SET_SIZE_ROUTINE
)(
237 struct _HHIVE
*RegistryHive
,
244 (CMAPI
*PFILE_FLUSH_ROUTINE
)(
245 struct _HHIVE
*RegistryHive
,
247 PLARGE_INTEGER FileOffset
,
251 typedef struct _HMAP_ENTRY
253 ULONG_PTR BlockAddress
;
254 ULONG_PTR BinAddress
;
255 struct _CM_VIEW_OF_FILE
*CmView
;
257 } HMAP_ENTRY
, *PHMAP_ENTRY
;
259 typedef struct _HMAP_TABLE
261 HMAP_ENTRY Table
[512];
262 } HMAP_TABLE
, *PHMAP_TABLE
;
264 typedef struct _HMAP_DIRECTORY
266 PHMAP_TABLE Directory
[2048];
267 } HMAP_DIRECTORY
, *PHMAP_DIRECTORY
;
273 PHMAP_ENTRY BlockList
; // PHMAP_TABLE SmallDir;
275 HCELL_INDEX FreeDisplay
[24]; // FREE_DISPLAY FreeDisplay[24];
280 typedef struct _HHIVE
283 PGET_CELL_ROUTINE GetCellRoutine
;
284 PRELEASE_CELL_ROUTINE ReleaseCellRoutine
;
285 PALLOCATE_ROUTINE Allocate
;
287 PFILE_SET_SIZE_ROUTINE FileSetSize
;
288 PFILE_WRITE_ROUTINE FileWrite
;
289 PFILE_READ_ROUTINE FileRead
;
290 PFILE_FLUSH_ROUTINE FileFlush
;
291 #if (NTDDI_VERSION >= NTDDI_WIN7)
292 PVOID HiveLoadFailure
; // PHIVE_LOAD_FAILURE
294 PHBASE_BLOCK BaseBlock
;
295 RTL_BITMAP DirtyVector
;
298 ULONG BaseBlockAlloc
;
302 #if (NTDDI_VERSION < NTDDI_VISTA) // NTDDI_LONGHORN
306 #if (NTDDI_VERSION >= NTDDI_VISTA) // NTDDI_LONGHORN
307 ULONG HvBinHeadersUse
;
308 ULONG HvFreeCellsUse
;
309 ULONG HvUsedCellsUse
;
310 ULONG CmUsedCellsUse
;
313 #if (NTDDI_VERSION < NTDDI_VISTA) // NTDDI_LONGHORN
320 ULONG StorageTypeCount
;
322 DUAL Storage
[HTYPE_COUNT
];
325 #define IsFreeCell(Cell) ((Cell)->Size >= 0)
326 #define IsUsedCell(Cell) ((Cell)->Size < 0)