Attempt to make Cm API at least a little const-correct.
[reactos.git] / reactos / lib / cmlib / cmlib.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 #ifndef CMLIB_H
9 #define CMLIB_H
10
11 #ifdef CMLIB_HOST
12 #include <host/typedefs.h>
13 #include <stdio.h>
14 #include <string.h>
15
16 // Definitions copied from <ntstatus.h>
17 // We only want to include host headers, so we define them manually
18 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
19 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
20 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
21 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
22 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
23 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
24 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
25
26 #endif
27
28 #ifndef _TYPEDEFS_HOST_H
29 #include <ntddk.h>
30 #else
31 #define REG_OPTION_VOLATILE 1
32 #define OBJ_CASE_INSENSITIVE 0x00000040L
33 #define USHORT_MAX USHRT_MAX
34
35 VOID NTAPI
36 KeQuerySystemTime(
37 OUT PLARGE_INTEGER CurrentTime);
38
39 VOID NTAPI
40 RtlInitializeBitMap(
41 IN PRTL_BITMAP BitMapHeader,
42 IN PULONG BitMapBuffer,
43 IN ULONG SizeOfBitMap);
44
45 ULONG NTAPI
46 RtlFindSetBits(
47 IN PRTL_BITMAP BitMapHeader,
48 IN ULONG NumberToFind,
49 IN ULONG HintIndex);
50
51 VOID NTAPI
52 RtlSetBits(
53 IN PRTL_BITMAP BitMapHeader,
54 IN ULONG StartingIndex,
55 IN ULONG NumberToSet);
56
57 VOID NTAPI
58 RtlClearAllBits(
59 IN PRTL_BITMAP BitMapHeader);
60
61 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
62
63 #endif
64
65 #include <wchar.h>
66 #include "hivedata.h"
67 #include "cmdata.h"
68
69 #ifndef ROUND_UP
70 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
71 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
72 #endif
73
74 #define CMAPI NTAPI
75
76 struct _HHIVE;
77
78 typedef PVOID (CMAPI *PGET_CELL_ROUTINE)(
79 struct _HHIVE *Hive,
80 HCELL_INDEX Cell);
81
82 typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)(
83 struct _HHIVE *Hive,
84 HCELL_INDEX Cell);
85
86 typedef PVOID (CMAPI *PALLOCATE_ROUTINE)(
87 SIZE_T Size,
88 BOOLEAN Paged);
89
90 typedef VOID (CMAPI *PFREE_ROUTINE)(
91 PVOID Ptr);
92
93 typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)(
94 struct _HHIVE *RegistryHive,
95 ULONG FileType,
96 ULONGLONG FileOffset,
97 PVOID Buffer,
98 SIZE_T BufferLength);
99
100 typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)(
101 struct _HHIVE *RegistryHive,
102 ULONG FileType,
103 ULONGLONG FileOffset,
104 PVOID Buffer,
105 SIZE_T BufferLength);
106
107 typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)(
108 struct _HHIVE *RegistryHive,
109 ULONG FileType,
110 ULONGLONG FileSize);
111
112 typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)(
113 struct _HHIVE *RegistryHive,
114 ULONG FileType);
115
116 typedef struct _HMAP_ENTRY
117 {
118 ULONG_PTR Bin;
119 ULONG_PTR Block;
120 struct _CM_VIEW_OF_FILE *CmHive;
121 ULONG MemAlloc;
122 } HMAP_ENTRY, *PHMAP_ENTRY;
123
124 typedef struct _HMAP_TABLE
125 {
126 HMAP_ENTRY Table[512];
127 } HMAP_TABLE, *PHMAP_TABLE;
128
129 typedef struct _HMAP_DIRECTORY
130 {
131 PHMAP_TABLE Directory[2048];
132 } HMAP_DIRECTORY, *PHMAP_DIRECTORY;
133
134 typedef struct _DUAL
135 {
136 ULONG Length;
137 PHMAP_DIRECTORY Map;
138 PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir;
139 ULONG Guard;
140 HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24];
141 ULONG FreeSummary;
142 LIST_ENTRY FreeBins;
143 } DUAL, *PDUAL;
144
145 typedef struct _HHIVE
146 {
147 ULONG Signature;
148 PGET_CELL_ROUTINE GetCellRoutine;
149 PRELEASE_CELL_ROUTINE ReleaseCellRoutine;
150 PALLOCATE_ROUTINE Allocate;
151 PFREE_ROUTINE Free;
152 PFILE_READ_ROUTINE FileRead;
153 PFILE_WRITE_ROUTINE FileWrite;
154 PFILE_SET_SIZE_ROUTINE FileSetSize;
155 PFILE_FLUSH_ROUTINE FileFlush;
156 PHBASE_BLOCK HiveHeader;
157 RTL_BITMAP DirtyVector;
158 ULONG DirtyCount;
159 ULONG DirtyAlloc;
160 ULONG BaseBlockAlloc;
161 ULONG Cluster;
162 BOOLEAN Flat;
163 BOOLEAN ReadOnly;
164 BOOLEAN Log;
165 BOOLEAN DirtyFlag;
166 ULONG HvBinHeadersUse;
167 ULONG HvFreeCellsUse;
168 ULONG HvUsedcellsUse;
169 ULONG CmUsedCellsUse;
170 ULONG HiveFlags;
171 ULONG LogSize;
172 ULONG RefreshCount;
173 ULONG StorageTypeCount;
174 ULONG Version;
175 DUAL Storage[HvMaxStorageType];
176 } HHIVE, *PHHIVE;
177
178 #ifndef _CM_
179 typedef struct _EREGISTRY_HIVE
180 {
181 HHIVE Hive;
182 LIST_ENTRY HiveList;
183 UNICODE_STRING HiveFileName;
184 UNICODE_STRING LogFileName;
185 PCM_KEY_SECURITY RootSecurityCell;
186 ULONG Flags;
187 HANDLE HiveHandle;
188 HANDLE LogHandle;
189 } EREGISTRY_HIVE, *PEREGISTRY_HIVE;
190 #endif
191
192 /*
193 * Public functions.
194 */
195
196 #define HV_OPERATION_CREATE_HIVE 0
197 #define HV_OPERATION_MEMORY 1
198 #define HV_OPERATION_MEMORY_INPLACE 3
199
200 NTSTATUS CMAPI
201 HvInitialize(
202 PHHIVE RegistryHive,
203 ULONG Operation,
204 ULONG HiveType,
205 ULONG HiveFlags,
206 ULONG_PTR HiveData OPTIONAL,
207 ULONG Cluster OPTIONAL,
208 PALLOCATE_ROUTINE Allocate,
209 PFREE_ROUTINE Free,
210 PFILE_READ_ROUTINE FileRead,
211 PFILE_WRITE_ROUTINE FileWrite,
212 PFILE_SET_SIZE_ROUTINE FileSetSize,
213 PFILE_FLUSH_ROUTINE FileFlush,
214 IN CONST UNICODE_STRING* FileName);
215
216 VOID CMAPI
217 HvFree(
218 PHHIVE RegistryHive);
219
220 PVOID CMAPI
221 HvGetCell(
222 PHHIVE RegistryHive,
223 HCELL_INDEX CellOffset);
224
225 #define HvReleaseCell(h, c) \
226 if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
227
228 LONG CMAPI
229 HvGetCellSize(
230 PHHIVE RegistryHive,
231 PVOID Cell);
232
233 HCELL_INDEX CMAPI
234 HvAllocateCell(
235 PHHIVE RegistryHive,
236 SIZE_T Size,
237 HV_STORAGE_TYPE Storage);
238
239 BOOLEAN CMAPI
240 HvIsCellAllocated(
241 IN PHHIVE RegistryHive,
242 IN HCELL_INDEX CellIndex
243 );
244
245 HCELL_INDEX CMAPI
246 HvReallocateCell(
247 PHHIVE RegistryHive,
248 HCELL_INDEX CellOffset,
249 ULONG Size);
250
251 VOID CMAPI
252 HvFreeCell(
253 PHHIVE RegistryHive,
254 HCELL_INDEX CellOffset);
255
256 VOID CMAPI
257 HvMarkCellDirty(
258 PHHIVE RegistryHive,
259 HCELL_INDEX CellOffset);
260
261 BOOLEAN CMAPI
262 HvIsCellDirty(
263 IN PHHIVE Hive,
264 IN HCELL_INDEX Cell
265 );
266
267 BOOLEAN CMAPI
268 HvSyncHive(
269 PHHIVE RegistryHive);
270
271 BOOLEAN CMAPI
272 HvWriteHive(
273 PHHIVE RegistryHive);
274
275 BOOLEAN CMAPI
276 CmCreateRootNode(
277 PHHIVE Hive,
278 PCWSTR Name);
279
280 VOID CMAPI
281 CmPrepareHive(
282 PHHIVE RegistryHive);
283
284 /*
285 * Private functions.
286 */
287
288 PHBIN CMAPI
289 HvpAddBin(
290 PHHIVE RegistryHive,
291 ULONG Size,
292 HV_STORAGE_TYPE Storage);
293
294 NTSTATUS CMAPI
295 HvpCreateHiveFreeCellList(
296 PHHIVE Hive);
297
298 ULONG CMAPI
299 HvpHiveHeaderChecksum(
300 PHBASE_BLOCK HiveHeader);
301
302 #endif /* CMLIB_H */