fc85692407cc61f1850db0e83eae3dc0292607d0
[reactos.git] / reactos / lib / cmlib / hivedata.h
1 /*
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
6 */
7
8 #pragma once
9
10 //
11 // Hive operations
12 //
13 #define HINIT_CREATE 0
14 #define HINIT_MEMORY 1
15 #define HINIT_FILE 2
16 #define HINIT_MEMORY_INPLACE 3
17 #define HINIT_FLAT 4
18 #define HINIT_MAPFILE 5
19
20 //
21 // Hive flags
22 //
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
29
30 //
31 // Hive types
32 //
33 #define HFILE_TYPE_PRIMARY 0
34 #define HFILE_TYPE_LOG 1
35 #define HFILE_TYPE_EXTERNAL 2
36 #define HFILE_TYPE_MAX 3
37
38 //
39 // Hive sizes
40 //
41 #define HBLOCK_SIZE 0x1000
42 #define HSECTOR_SIZE 0x200
43 #define HSECTOR_COUNT 8
44
45 #define HV_BLOCK_SIZE 4096
46 #define HV_LOG_HEADER_SIZE FIELD_OFFSET(HBASE_BLOCK, Reserved2)
47 #define HV_SIGNATURE 0x66676572
48 #define HV_BIN_SIGNATURE 0x6e696268
49
50 //
51 // Hive versions
52 //
53 #define HSYS_MAJOR 1
54 #define HSYS_MINOR 3
55 #define HSYS_WHISTLER_BETA1 4
56 #define HSYS_WHISTLER 5
57 #define HSYS_MINOR_SUPPORTED HSYS_WHISTLER
58
59 //
60 // Hive formats
61 //
62 #define HBASE_FORMAT_MEMORY 1
63
64 //
65 // Hive storage
66 //
67 #define HTYPE_COUNT 2
68
69 /**
70 * @name HCELL_INDEX
71 *
72 * A handle to cell index. The highest bit specifies the cell storage and
73 * the other bits specify index into the hive file. The value HCELL_NULL
74 * (-1) is reserved for marking invalid cells.
75 */
76 typedef ULONG HCELL_INDEX, *PHCELL_INDEX;
77
78 //
79 // Cell Magic Values
80 //
81 #define HCELL_NIL MAXULONG
82 #define HCELL_CACHED 1
83
84 #define HCELL_TYPE_MASK 0x80000000
85 #define HCELL_BLOCK_MASK 0x7ffff000
86 #define HCELL_OFFSET_MASK 0x00000fff
87 #define HCELL_TYPE_SHIFT 31
88 #define HCELL_BLOCK_SHIFT 12
89 #define HCELL_OFFSET_SHIFT 0
90
91 #define HvGetCellType(Cell) \
92 ((ULONG)((Cell & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT))
93 #define HvGetCellBlock(Cell) \
94 ((ULONG)((Cell & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT))
95
96 typedef enum
97 {
98 Stable = 0,
99 Volatile = 1
100 } HSTORAGE_TYPE;
101
102 #include <pshpack1.h>
103
104 /**
105 * @name HBASE_BLOCK
106 *
107 * On-disk header for registry hive file.
108 */
109
110 typedef struct _HBASE_BLOCK
111 {
112 /* Hive identifier "regf" (0x66676572) */
113 ULONG Signature;
114
115 /* Update counter */
116 ULONG Sequence1;
117
118 /* Update counter */
119 ULONG Sequence2;
120
121 /* When this hive file was last modified */
122 LARGE_INTEGER TimeStamp;
123
124 /* Registry format major version (1) */
125 ULONG Major;
126
127 /* Registry format minor version (3)
128 Version 3 added fast indexes, version 5 has large value optimizations */
129 ULONG Minor;
130
131 /* Registry file type (0 - Primary, 1 - Log) */
132 ULONG Type;
133
134 /* Registry format (1 is the only defined value so far) */
135 ULONG Format;
136
137 /* Offset into file from the byte after the end of the base block.
138 If the hive is volatile, this is the actual pointer to the CM_KEY_NODE */
139 HCELL_INDEX RootCell;
140
141 /* Size of each hive block ? */
142 ULONG Length;
143
144 /* (1?) */
145 ULONG Cluster;
146
147 /* Name of hive file */
148 CHAR FileName[64];
149
150 ULONG Reserved1[99];
151
152 /* Checksum of first 0x200 bytes */
153 ULONG CheckSum;
154
155 ULONG Reserved2[0x37E];
156 ULONG BootType;
157 ULONG BootRecover;
158 } HBASE_BLOCK, *PHBASE_BLOCK;
159
160 typedef struct _HBIN
161 {
162 /* Bin identifier "hbin" (0x6E696268) */
163 ULONG Signature;
164
165 /* Block offset of this bin */
166 HCELL_INDEX FileOffset;
167
168 /* Size in bytes, multiple of the block size (4KB) */
169 ULONG Size;
170
171 ULONG Reserved1[2];
172
173 /* When this bin was last modified */
174 LARGE_INTEGER TimeStamp;
175
176 /* ? (In-memory only) */
177 ULONG Spare;
178 } HBIN, *PHBIN;
179
180 typedef struct _HCELL
181 {
182 /* <0 if used, >0 if free */
183 LONG Size;
184 } HCELL, *PHCELL;
185
186 #include <poppack.h>
187
188 struct _HHIVE;
189
190 typedef struct _CELL_DATA* (CMAPI *PGET_CELL_ROUTINE)(
191 struct _HHIVE *Hive,
192 HCELL_INDEX Cell);
193
194 typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)(
195 struct _HHIVE *Hive,
196 HCELL_INDEX Cell);
197
198 typedef PVOID (CMAPI *PALLOCATE_ROUTINE)(
199 SIZE_T Size,
200 BOOLEAN Paged,
201 ULONG Tag);
202
203 typedef VOID (CMAPI *PFREE_ROUTINE)(
204 PVOID Ptr,
205 ULONG Quota);
206
207 typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)(
208 struct _HHIVE *RegistryHive,
209 ULONG FileType,
210 PULONG FileOffset,
211 PVOID Buffer,
212 SIZE_T BufferLength);
213
214 typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)(
215 struct _HHIVE *RegistryHive,
216 ULONG FileType,
217 PULONG FileOffset,
218 PVOID Buffer,
219 SIZE_T BufferLength);
220
221 typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)(
222 struct _HHIVE *RegistryHive,
223 ULONG FileType,
224 ULONG FileSize,
225 ULONG OldfileSize);
226
227 typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)(
228 struct _HHIVE *RegistryHive,
229 ULONG FileType,
230 PLARGE_INTEGER FileOffset,
231 ULONG Length
232 );
233
234 typedef struct _HMAP_ENTRY
235 {
236 ULONG_PTR BlockAddress;
237 ULONG_PTR BinAddress;
238 struct _CM_VIEW_OF_FILE *CmView;
239 ULONG MemAlloc;
240 } HMAP_ENTRY, *PHMAP_ENTRY;
241
242 typedef struct _HMAP_TABLE
243 {
244 HMAP_ENTRY Table[512];
245 } HMAP_TABLE, *PHMAP_TABLE;
246
247 typedef struct _HMAP_DIRECTORY
248 {
249 PHMAP_TABLE Directory[2048];
250 } HMAP_DIRECTORY, *PHMAP_DIRECTORY;
251
252 typedef struct _DUAL
253 {
254 ULONG Length;
255 PHMAP_DIRECTORY Map;
256 PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir;
257 ULONG Guard;
258 HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24];
259 ULONG FreeSummary;
260 LIST_ENTRY FreeBins;
261 } DUAL, *PDUAL;
262
263 typedef struct _HHIVE
264 {
265 ULONG Signature;
266 PGET_CELL_ROUTINE GetCellRoutine;
267 PRELEASE_CELL_ROUTINE ReleaseCellRoutine;
268 PALLOCATE_ROUTINE Allocate;
269 PFREE_ROUTINE Free;
270 PFILE_READ_ROUTINE FileRead;
271 PFILE_WRITE_ROUTINE FileWrite;
272 PFILE_SET_SIZE_ROUTINE FileSetSize;
273 PFILE_FLUSH_ROUTINE FileFlush;
274 PHBASE_BLOCK BaseBlock;
275 RTL_BITMAP DirtyVector;
276 ULONG DirtyCount;
277 ULONG DirtyAlloc;
278 ULONG BaseBlockAlloc;
279 ULONG Cluster;
280 BOOLEAN Flat;
281 BOOLEAN ReadOnly;
282 BOOLEAN Log;
283 BOOLEAN DirtyFlag;
284 ULONG HvBinHeadersUse;
285 ULONG HvFreeCellsUse;
286 ULONG HvUsedcellsUse;
287 ULONG CmUsedCellsUse;
288 ULONG HiveFlags;
289 ULONG LogSize;
290 ULONG RefreshCount;
291 ULONG StorageTypeCount;
292 ULONG Version;
293 DUAL Storage[HTYPE_COUNT];
294 } HHIVE, *PHHIVE;
295
296 #define IsFreeCell(Cell)(Cell->Size >= 0)
297 #define IsUsedCell(Cell)(Cell->Size < 0)