Merge from amd64-branch:
[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 //
12 // Debug support switch
13 //
14 #define _CMLIB_DEBUG_ 1
15
16 #ifdef CMLIB_HOST
17 #include <host/typedefs.h>
18 #include <stdio.h>
19 #include <string.h>
20
21 // Definitions copied from <ntstatus.h>
22 // We only want to include host headers, so we define them manually
23 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
24 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
25 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
26 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
27 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
28 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
29 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
30
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 #define PKTHREAD PVOID
64 #define PKGUARDED_MUTEX PVOID
65 #define PERESOURCE PVOID
66 #define PFILE_OBJECT PVOID
67 #define PKEVENT PVOID
68 #define PWORK_QUEUE_ITEM PVOID
69 #define EX_PUSH_LOCK PULONG_PTR
70
71 /* For <host/wcsfuncs.h> */
72 #define USE_HOST_WCSFUNCS
73
74 #define CMLTRACE(x, ...)
75 #else
76 //
77 // Debug/Tracing support
78 //
79 #if _CMLIB_DEBUG_
80 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
81 #define CMLTRACE DbgPrintEx
82 #else
83 #define CMLTRACE(x, ...) \
84 if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__)
85 #endif
86 #else
87 #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__)
88 #endif
89
90
91 #include <ntddk.h>
92 #endif
93
94 #include <host/wcsfuncs.h>
95
96 //
97 // These define the Debug Masks Supported
98 //
99 #define CMLIB_HCELL_DEBUG 0x01
100
101 #ifndef ROUND_UP
102 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
103 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
104 #endif
105
106 //
107 // PAGE_SIZE definition
108 //
109 #ifndef PAGE_SIZE
110 #if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm)
111 #define PAGE_SIZE 0x1000
112 #else
113 #error Local PAGE_SIZE definition required when built as host
114 #endif
115 #endif
116
117 #define TAG_CM 0x68742020
118
119 #define CMAPI NTAPI
120
121 #include <wchar.h>
122 #include "hivedata.h"
123 #include "cmdata.h"
124
125 #if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
126
127 #define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
128 #define PCM_KEY_CONTROL_BLOCK PVOID
129 #define CMP_SECURITY_HASH_LISTS 64
130 #define PCM_CELL_REMAP_BLOCK PVOID
131
132 //
133 // Use Count Log and Entry
134 //
135 typedef struct _CM_USE_COUNT_LOG_ENTRY
136 {
137 HCELL_INDEX Cell;
138 PVOID Stack[7];
139 } CM_USE_COUNT_LOG_ENTRY, *PCM_USE_COUNT_LOG_ENTRY;
140
141 typedef struct _CM_USE_COUNT_LOG
142 {
143 USHORT Next;
144 USHORT Size;
145 CM_USE_COUNT_LOG_ENTRY Log[32];
146 } CM_USE_COUNT_LOG, *PCM_USE_COUNT_LOG;
147
148 //
149 // Configuration Manager Hive Structure
150 //
151 typedef struct _CMHIVE
152 {
153 HHIVE Hive;
154 HANDLE FileHandles[3];
155 LIST_ENTRY NotifyList;
156 LIST_ENTRY HiveList;
157 EX_PUSH_LOCK HiveLock;
158 PKTHREAD HiveLockOwner;
159 PKGUARDED_MUTEX ViewLock;
160 PKTHREAD ViewLockOwner;
161 EX_PUSH_LOCK WriterLock;
162 PKTHREAD WriterLockOwner;
163 PERESOURCE FlusherLock;
164 EX_PUSH_LOCK SecurityLock;
165 PKTHREAD HiveSecurityLockOwner;
166 LIST_ENTRY LRUViewListHead;
167 LIST_ENTRY PinViewListHead;
168 PFILE_OBJECT FileObject;
169 UNICODE_STRING FileFullPath;
170 UNICODE_STRING FileUserName;
171 USHORT MappedViews;
172 USHORT PinnedViews;
173 ULONG UseCount;
174 ULONG SecurityCount;
175 ULONG SecurityCacheSize;
176 LONG SecurityHitHint;
177 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache;
178 LIST_ENTRY SecurityHash[CMP_SECURITY_HASH_LISTS];
179 PKEVENT UnloadEvent;
180 PCM_KEY_CONTROL_BLOCK RootKcb;
181 BOOLEAN Frozen;
182 PWORK_QUEUE_ITEM UnloadWorkItem;
183 BOOLEAN GrowOnlyMode;
184 ULONG GrowOffset;
185 LIST_ENTRY KcbConvertListHead;
186 LIST_ENTRY KnodeConvertListHead;
187 PCM_CELL_REMAP_BLOCK CellRemapArray;
188 CM_USE_COUNT_LOG UseCountLog;
189 CM_USE_COUNT_LOG LockHiveLog;
190 ULONG Flags;
191 LIST_ENTRY TrustClassEntry;
192 ULONG FlushCount;
193 BOOLEAN HiveIsLoading;
194 PKTHREAD CreatorOwner;
195 } CMHIVE, *PCMHIVE;
196
197 #endif
198
199 extern ULONG CmlibTraceLevel;
200
201 /*
202 * Public functions.
203 */
204 NTSTATUS CMAPI
205 HvInitialize(
206 PHHIVE RegistryHive,
207 ULONG Operation,
208 ULONG HiveType,
209 ULONG HiveFlags,
210 PVOID HiveData OPTIONAL,
211 PALLOCATE_ROUTINE Allocate,
212 PFREE_ROUTINE Free,
213 PFILE_SET_SIZE_ROUTINE FileSetSize,
214 PFILE_WRITE_ROUTINE FileWrite,
215 PFILE_READ_ROUTINE FileRead,
216 PFILE_FLUSH_ROUTINE FileFlush,
217 ULONG Cluster OPTIONAL,
218 PUNICODE_STRING FileName);
219
220 VOID CMAPI
221 HvFree(
222 PHHIVE RegistryHive);
223
224 PVOID CMAPI
225 HvGetCell(
226 PHHIVE RegistryHive,
227 HCELL_INDEX CellOffset);
228
229 #define HvReleaseCell(h, c) \
230 if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
231
232 LONG CMAPI
233 HvGetCellSize(
234 PHHIVE RegistryHive,
235 PVOID Cell);
236
237 HCELL_INDEX CMAPI
238 HvAllocateCell(
239 PHHIVE RegistryHive,
240 SIZE_T Size,
241 HSTORAGE_TYPE Storage,
242 IN HCELL_INDEX Vicinity);
243
244 BOOLEAN CMAPI
245 HvIsCellAllocated(
246 IN PHHIVE RegistryHive,
247 IN HCELL_INDEX CellIndex
248 );
249
250 HCELL_INDEX CMAPI
251 HvReallocateCell(
252 PHHIVE RegistryHive,
253 HCELL_INDEX CellOffset,
254 ULONG Size);
255
256 VOID CMAPI
257 HvFreeCell(
258 PHHIVE RegistryHive,
259 HCELL_INDEX CellOffset);
260
261 BOOLEAN CMAPI
262 HvMarkCellDirty(
263 PHHIVE RegistryHive,
264 HCELL_INDEX CellOffset,
265 BOOLEAN HoldingLock);
266
267 BOOLEAN CMAPI
268 HvIsCellDirty(
269 IN PHHIVE Hive,
270 IN HCELL_INDEX Cell
271 );
272
273 BOOLEAN CMAPI
274 HvSyncHive(
275 PHHIVE RegistryHive);
276
277 BOOLEAN CMAPI
278 HvWriteHive(
279 PHHIVE RegistryHive);
280
281 BOOLEAN CMAPI
282 CmCreateRootNode(
283 PHHIVE Hive,
284 PCWSTR Name);
285
286 VOID CMAPI
287 CmPrepareHive(
288 PHHIVE RegistryHive);
289
290 /*
291 * Private functions.
292 */
293
294 PHBIN CMAPI
295 HvpAddBin(
296 PHHIVE RegistryHive,
297 ULONG Size,
298 HSTORAGE_TYPE Storage);
299
300 NTSTATUS CMAPI
301 HvpCreateHiveFreeCellList(
302 PHHIVE Hive);
303
304 ULONG CMAPI
305 HvpHiveHeaderChecksum(
306 PHBASE_BLOCK HiveHeader);
307
308 #endif /* CMLIB_H */