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
12 // Debug support switch
14 #define _CMLIB_DEBUG_ 1
22 #define strncasecmp _strnicmp
23 #define strcasecmp _stricmp
26 #if (!defined(_MSC_VER) || (_MSC_VER < 1500))
31 #define _In_range_(x, y)
34 #define __drv_aliasesMem
37 #define min(a, b) (((a) < (b)) ? (a) : (b))
41 // #define max(a, b) (((a) > (b)) ? (a) : (b))
44 // Definitions copied from <ntstatus.h>
45 // We only want to include host headers, so we define them manually
46 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
47 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
48 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
49 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
50 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
51 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
52 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
54 #define REG_OPTION_VOLATILE 1
55 #define OBJ_CASE_INSENSITIVE 0x00000040L
56 #define USHORT_MAX USHRT_MAX
60 OUT PLARGE_INTEGER CurrentTime
);
68 IN PRTL_BITMAP BitMapHeader
,
69 IN PULONG BitMapBuffer
,
70 IN ULONG SizeOfBitMap
);
74 IN PRTL_BITMAP BitMapHeader
,
75 IN ULONG NumberToFind
,
80 IN PRTL_BITMAP BitMapHeader
,
81 IN ULONG StartingIndex
,
82 IN ULONG NumberToSet
);
86 IN PRTL_BITMAP BitMapHeader
);
88 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
89 #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
91 #define PKTHREAD PVOID
92 #define PKGUARDED_MUTEX PVOID
93 #define PERESOURCE PVOID
94 #define PFILE_OBJECT PVOID
96 #define PWORK_QUEUE_ITEM PVOID
97 #define EX_PUSH_LOCK PULONG_PTR
99 #define CMLTRACE(x, ...)
102 // Debug/Tracing support
105 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
106 #define CMLTRACE DbgPrintEx
108 #define CMLTRACE(x, ...) \
109 if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__)
112 #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__)
118 /* Prevent inclusion of Windows headers through <wine/unicode.h> */
126 // These define the Debug Masks Supported
128 #define CMLIB_HCELL_DEBUG 0x01
131 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
132 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
136 // PAGE_SIZE definition
139 #if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm)
140 #define PAGE_SIZE 0x1000
142 #error Local PAGE_SIZE definition required when built as host
147 #define TAG_KCB 'bkMC'
148 #define TAG_CMHIVE 'vHMC'
149 #define TAG_CMSD 'DSMC'
153 #include <wine/unicode.h>
155 #include "hivedata.h"
158 #if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
160 #define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
161 #define PCM_KEY_CONTROL_BLOCK PVOID
162 #define CMP_SECURITY_HASH_LISTS 64
163 #define PCM_CELL_REMAP_BLOCK PVOID
166 // Use Count Log and Entry
168 typedef struct _CM_USE_COUNT_LOG_ENTRY
172 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
174 typedef struct _CM_USE_COUNT_LOG
178 CM_USE_COUNT_LOG_ENTRY Log
[32];
179 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
182 // Configuration Manager Hive Structure
184 typedef struct _CMHIVE
187 HANDLE FileHandles
[HFILE_TYPE_MAX
];
188 LIST_ENTRY NotifyList
;
190 EX_PUSH_LOCK HiveLock
;
191 PKTHREAD HiveLockOwner
;
192 PKGUARDED_MUTEX ViewLock
;
193 PKTHREAD ViewLockOwner
;
194 EX_PUSH_LOCK WriterLock
;
195 PKTHREAD WriterLockOwner
;
196 PERESOURCE FlusherLock
;
197 EX_PUSH_LOCK SecurityLock
;
198 PKTHREAD HiveSecurityLockOwner
;
199 LIST_ENTRY LRUViewListHead
;
200 LIST_ENTRY PinViewListHead
;
201 PFILE_OBJECT FileObject
;
202 UNICODE_STRING FileFullPath
;
203 UNICODE_STRING FileUserName
;
208 ULONG SecurityCacheSize
;
209 LONG SecurityHitHint
;
210 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
211 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
213 PCM_KEY_CONTROL_BLOCK RootKcb
;
215 PWORK_QUEUE_ITEM UnloadWorkItem
;
216 BOOLEAN GrowOnlyMode
;
218 LIST_ENTRY KcbConvertListHead
;
219 LIST_ENTRY KnodeConvertListHead
;
220 PCM_CELL_REMAP_BLOCK CellRemapArray
;
221 CM_USE_COUNT_LOG UseCountLog
;
222 CM_USE_COUNT_LOG LockHiveLog
;
224 LIST_ENTRY TrustClassEntry
;
226 BOOLEAN HiveIsLoading
;
227 PKTHREAD CreatorOwner
;
232 typedef struct _HV_HIVE_CELL_PAIR
236 } HV_HIVE_CELL_PAIR
, *PHV_HIVE_CELL_PAIR
;
238 #define STATIC_CELL_PAIR_COUNT 4
239 typedef struct _HV_TRACK_CELL_REF
243 PHV_HIVE_CELL_PAIR CellArray
;
244 HV_HIVE_CELL_PAIR StaticArray
[STATIC_CELL_PAIR_COUNT
];
246 } HV_TRACK_CELL_REF
, *PHV_TRACK_CELL_REF
;
248 extern ULONG CmlibTraceLevel
;
259 PVOID HiveData OPTIONAL
,
260 PALLOCATE_ROUTINE Allocate
,
262 PFILE_SET_SIZE_ROUTINE FileSetSize
,
263 PFILE_WRITE_ROUTINE FileWrite
,
264 PFILE_READ_ROUTINE FileRead
,
265 PFILE_FLUSH_ROUTINE FileFlush
,
266 ULONG Cluster OPTIONAL
,
267 PCUNICODE_STRING FileName OPTIONAL
);
271 PHHIVE RegistryHive
);
276 HCELL_INDEX CellOffset
);
278 #define HvReleaseCell(h, c) \
280 if ((h)->ReleaseCellRoutine) \
281 (h)->ReleaseCellRoutine(h, c); \
293 HSTORAGE_TYPE Storage
,
294 IN HCELL_INDEX Vicinity
);
298 IN PHHIVE RegistryHive
,
299 IN HCELL_INDEX CellIndex
305 HCELL_INDEX CellOffset
,
311 HCELL_INDEX CellOffset
);
316 HCELL_INDEX CellOffset
,
317 BOOLEAN HoldingLock
);
328 IN PHHIVE RegistryHive
333 PHHIVE RegistryHive
);
337 PHHIVE RegistryHive
);
346 PHHIVE RegistryHive
);
351 IN PCUNICODE_STRING KeyName
,
353 IN BOOLEAN CaseInsensitive
);
357 CmComparePackedNames(
358 IN PCUNICODE_STRING Name
,
360 IN USHORT NameBufferSize
,
361 IN BOOLEAN NamePacked
,
362 IN BOOLEAN CaseInsensitive
);
367 IN PCM_KEY_NODE KeyCell
,
368 IN PCUNICODE_STRING KeyName
,
369 IN BOOLEAN CaseInsensitive
);
373 CmCompareKeyValueName(
374 IN PCM_KEY_VALUE ValueCell
,
375 IN PCUNICODE_STRING KeyName
,
376 IN BOOLEAN CaseInsensitive
);
381 _In_ PCM_KEY_NODE KeyNode
,
382 _Out_ PWCHAR KeyNameBuffer
,
383 _Inout_ ULONG BufferLength
);
388 _In_ PCM_KEY_VALUE ValueCell
,
389 _Out_ PWCHAR ValueNameBuffer
,
390 _Inout_ ULONG BufferLength
);
395 PHV_TRACK_CELL_REF CellRef
,
402 HvReleaseFreeCellRefArray(
403 PHV_TRACK_CELL_REF CellRef
414 HSTORAGE_TYPE Storage
);
417 HvpCreateHiveFreeCellList(
421 HvpHiveHeaderChecksum(
422 PHBASE_BLOCK HiveHeader
);
424 #endif /* _CMLIB_H_ */