Visual C++ backend for rbuild (for now just a hacked mingw backend) and related compi...
[reactos.git] / 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 #define TAG_CM 0x68742020
107
108 #define CMAPI NTAPI
109
110 #include <wchar.h>
111 #include "hivedata.h"
112 #include "cmdata.h"
113
114 #if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
115
116 #define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
117 #define PCM_KEY_CONTROL_BLOCK PVOID
118 #define CMP_SECURITY_HASH_LISTS 64
119 #define PCM_CELL_REMAP_BLOCK PVOID
120
121 //
122 // Use Count Log and Entry
123 //
124 typedef struct _CM_USE_COUNT_LOG_ENTRY
125 {
126 HCELL_INDEX Cell;
127 PVOID Stack[7];
128 } CM_USE_COUNT_LOG_ENTRY, *PCM_USE_COUNT_LOG_ENTRY;
129
130 typedef struct _CM_USE_COUNT_LOG
131 {
132 USHORT Next;
133 USHORT Size;
134 CM_USE_COUNT_LOG_ENTRY Log[32];
135 } CM_USE_COUNT_LOG, *PCM_USE_COUNT_LOG;
136
137 //
138 // Configuration Manager Hive Structure
139 //
140 typedef struct _CMHIVE
141 {
142 HHIVE Hive;
143 HANDLE FileHandles[3];
144 LIST_ENTRY NotifyList;
145 LIST_ENTRY HiveList;
146 EX_PUSH_LOCK HiveLock;
147 PKTHREAD HiveLockOwner;
148 PKGUARDED_MUTEX ViewLock;
149 PKTHREAD ViewLockOwner;
150 EX_PUSH_LOCK WriterLock;
151 PKTHREAD WriterLockOwner;
152 PERESOURCE FlusherLock;
153 EX_PUSH_LOCK SecurityLock;
154 PKTHREAD HiveSecurityLockOwner;
155 LIST_ENTRY LRUViewListHead;
156 LIST_ENTRY PinViewListHead;
157 PFILE_OBJECT FileObject;
158 UNICODE_STRING FileFullPath;
159 UNICODE_STRING FileUserName;
160 USHORT MappedViews;
161 USHORT PinnedViews;
162 ULONG UseCount;
163 ULONG SecurityCount;
164 ULONG SecurityCacheSize;
165 LONG SecurityHitHint;
166 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache;
167 LIST_ENTRY SecurityHash[CMP_SECURITY_HASH_LISTS];
168 PKEVENT UnloadEvent;
169 PCM_KEY_CONTROL_BLOCK RootKcb;
170 BOOLEAN Frozen;
171 PWORK_QUEUE_ITEM UnloadWorkItem;
172 BOOLEAN GrowOnlyMode;
173 ULONG GrowOffset;
174 LIST_ENTRY KcbConvertListHead;
175 LIST_ENTRY KnodeConvertListHead;
176 PCM_CELL_REMAP_BLOCK CellRemapArray;
177 CM_USE_COUNT_LOG UseCountLog;
178 CM_USE_COUNT_LOG LockHiveLog;
179 ULONG Flags;
180 LIST_ENTRY TrustClassEntry;
181 ULONG FlushCount;
182 BOOLEAN HiveIsLoading;
183 PKTHREAD CreatorOwner;
184 } CMHIVE, *PCMHIVE;
185
186 #endif
187
188 extern ULONG CmlibTraceLevel;
189
190 /*
191 * Public functions.
192 */
193 NTSTATUS CMAPI
194 HvInitialize(
195 PHHIVE RegistryHive,
196 ULONG Operation,
197 ULONG HiveType,
198 ULONG HiveFlags,
199 PVOID HiveData OPTIONAL,
200 PALLOCATE_ROUTINE Allocate,
201 PFREE_ROUTINE Free,
202 PFILE_SET_SIZE_ROUTINE FileSetSize,
203 PFILE_WRITE_ROUTINE FileWrite,
204 PFILE_READ_ROUTINE FileRead,
205 PFILE_FLUSH_ROUTINE FileFlush,
206 ULONG Cluster OPTIONAL,
207 PUNICODE_STRING FileName);
208
209 VOID CMAPI
210 HvFree(
211 PHHIVE RegistryHive);
212
213 PVOID CMAPI
214 HvGetCell(
215 PHHIVE RegistryHive,
216 HCELL_INDEX CellOffset);
217
218 #define HvReleaseCell(h, c) \
219 if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
220
221 LONG CMAPI
222 HvGetCellSize(
223 PHHIVE RegistryHive,
224 PVOID Cell);
225
226 HCELL_INDEX CMAPI
227 HvAllocateCell(
228 PHHIVE RegistryHive,
229 SIZE_T Size,
230 HSTORAGE_TYPE Storage,
231 IN HCELL_INDEX Vicinity);
232
233 BOOLEAN CMAPI
234 HvIsCellAllocated(
235 IN PHHIVE RegistryHive,
236 IN HCELL_INDEX CellIndex
237 );
238
239 HCELL_INDEX CMAPI
240 HvReallocateCell(
241 PHHIVE RegistryHive,
242 HCELL_INDEX CellOffset,
243 ULONG Size);
244
245 VOID CMAPI
246 HvFreeCell(
247 PHHIVE RegistryHive,
248 HCELL_INDEX CellOffset);
249
250 BOOLEAN CMAPI
251 HvMarkCellDirty(
252 PHHIVE RegistryHive,
253 HCELL_INDEX CellOffset,
254 BOOLEAN HoldingLock);
255
256 BOOLEAN CMAPI
257 HvIsCellDirty(
258 IN PHHIVE Hive,
259 IN HCELL_INDEX Cell
260 );
261
262 BOOLEAN CMAPI
263 HvSyncHive(
264 PHHIVE RegistryHive);
265
266 BOOLEAN CMAPI
267 HvWriteHive(
268 PHHIVE RegistryHive);
269
270 BOOLEAN CMAPI
271 CmCreateRootNode(
272 PHHIVE Hive,
273 PCWSTR Name);
274
275 VOID CMAPI
276 CmPrepareHive(
277 PHHIVE RegistryHive);
278
279 /*
280 * Private functions.
281 */
282
283 PHBIN CMAPI
284 HvpAddBin(
285 PHHIVE RegistryHive,
286 ULONG Size,
287 HSTORAGE_TYPE Storage);
288
289 NTSTATUS CMAPI
290 HvpCreateHiveFreeCellList(
291 PHHIVE Hive);
292
293 ULONG CMAPI
294 HvpHiveHeaderChecksum(
295 PHBASE_BLOCK HiveHeader);
296
297 #endif /* CMLIB_H */