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
9 // Debug support switch
11 #define _CMLIB_DEBUG_ 1
19 #define strncasecmp _strnicmp
20 #define strcasecmp _stricmp
30 #define min(a, b) (((a) < (b)) ? (a) : (b))
33 // Definitions copied from <ntstatus.h>
34 // We only want to include host headers, so we define them manually
35 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
36 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
37 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
38 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
39 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
40 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
41 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
43 #define REG_OPTION_VOLATILE 1
44 #define OBJ_CASE_INSENSITIVE 0x00000040L
45 #define USHORT_MAX USHRT_MAX
49 OUT PLARGE_INTEGER CurrentTime
);
57 IN PRTL_BITMAP BitMapHeader
,
58 IN PULONG BitMapBuffer
,
59 IN ULONG SizeOfBitMap
);
63 IN PRTL_BITMAP BitMapHeader
,
64 IN ULONG NumberToFind
,
69 IN PRTL_BITMAP BitMapHeader
,
70 IN ULONG StartingIndex
,
71 IN ULONG NumberToSet
);
75 IN PRTL_BITMAP BitMapHeader
);
77 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
78 #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
80 #define PKTHREAD PVOID
81 #define PKGUARDED_MUTEX PVOID
82 #define PERESOURCE PVOID
83 #define PFILE_OBJECT PVOID
85 #define PWORK_QUEUE_ITEM PVOID
86 #define EX_PUSH_LOCK PULONG_PTR
88 #define CMLTRACE(x, ...)
91 // Debug/Tracing support
94 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
95 #define CMLTRACE DbgPrintEx
97 #define CMLTRACE(x, ...) \
98 if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__)
101 #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__)
107 /* Prevent inclusion of Windows headers through <wine/unicode.h> */
115 // These define the Debug Masks Supported
117 #define CMLIB_HCELL_DEBUG 0x01
120 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
121 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
125 // PAGE_SIZE definition
128 #if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm)
129 #define PAGE_SIZE 0x1000
131 #error Local PAGE_SIZE definition required when built as host
135 #define TAG_CM 'CM25'
139 #include <wine/unicode.h>
141 #include "hivedata.h"
144 #if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
146 #define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
147 #define PCM_KEY_CONTROL_BLOCK PVOID
148 #define CMP_SECURITY_HASH_LISTS 64
149 #define PCM_CELL_REMAP_BLOCK PVOID
152 // Use Count Log and Entry
154 typedef struct _CM_USE_COUNT_LOG_ENTRY
158 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
160 typedef struct _CM_USE_COUNT_LOG
164 CM_USE_COUNT_LOG_ENTRY Log
[32];
165 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
168 // Configuration Manager Hive Structure
170 typedef struct _CMHIVE
173 HANDLE FileHandles
[HFILE_TYPE_MAX
];
174 LIST_ENTRY NotifyList
;
176 EX_PUSH_LOCK HiveLock
;
177 PKTHREAD HiveLockOwner
;
178 PKGUARDED_MUTEX ViewLock
;
179 PKTHREAD ViewLockOwner
;
180 EX_PUSH_LOCK WriterLock
;
181 PKTHREAD WriterLockOwner
;
182 PERESOURCE FlusherLock
;
183 EX_PUSH_LOCK SecurityLock
;
184 PKTHREAD HiveSecurityLockOwner
;
185 LIST_ENTRY LRUViewListHead
;
186 LIST_ENTRY PinViewListHead
;
187 PFILE_OBJECT FileObject
;
188 UNICODE_STRING FileFullPath
;
189 UNICODE_STRING FileUserName
;
194 ULONG SecurityCacheSize
;
195 LONG SecurityHitHint
;
196 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
197 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
199 PCM_KEY_CONTROL_BLOCK RootKcb
;
201 PWORK_QUEUE_ITEM UnloadWorkItem
;
202 BOOLEAN GrowOnlyMode
;
204 LIST_ENTRY KcbConvertListHead
;
205 LIST_ENTRY KnodeConvertListHead
;
206 PCM_CELL_REMAP_BLOCK CellRemapArray
;
207 CM_USE_COUNT_LOG UseCountLog
;
208 CM_USE_COUNT_LOG LockHiveLog
;
210 LIST_ENTRY TrustClassEntry
;
212 BOOLEAN HiveIsLoading
;
213 PKTHREAD CreatorOwner
;
218 typedef struct _HV_HIVE_CELL_PAIR
222 } HV_HIVE_CELL_PAIR
, *PHV_HIVE_CELL_PAIR
;
224 #define STATIC_CELL_PAIR_COUNT 4
225 typedef struct _HV_TRACK_CELL_REF
229 PHV_HIVE_CELL_PAIR CellArray
;
230 HV_HIVE_CELL_PAIR StaticArray
[STATIC_CELL_PAIR_COUNT
];
232 } HV_TRACK_CELL_REF
, *PHV_TRACK_CELL_REF
;
234 extern ULONG CmlibTraceLevel
;
245 PVOID HiveData OPTIONAL
,
246 PALLOCATE_ROUTINE Allocate
,
248 PFILE_SET_SIZE_ROUTINE FileSetSize
,
249 PFILE_WRITE_ROUTINE FileWrite
,
250 PFILE_READ_ROUTINE FileRead
,
251 PFILE_FLUSH_ROUTINE FileFlush
,
252 ULONG Cluster OPTIONAL
,
253 PCUNICODE_STRING FileName OPTIONAL
);
257 PHHIVE RegistryHive
);
262 HCELL_INDEX CellOffset
);
264 #define HvReleaseCell(h, c) \
266 if ((h)->ReleaseCellRoutine) \
267 (h)->ReleaseCellRoutine(h, c); \
279 HSTORAGE_TYPE Storage
,
280 IN HCELL_INDEX Vicinity
);
284 IN PHHIVE RegistryHive
,
285 IN HCELL_INDEX CellIndex
291 HCELL_INDEX CellOffset
,
297 HCELL_INDEX CellOffset
);
302 HCELL_INDEX CellOffset
,
303 BOOLEAN HoldingLock
);
314 IN PHHIVE RegistryHive
319 PHHIVE RegistryHive
);
323 PHHIVE RegistryHive
);
332 PHHIVE RegistryHive
);
337 IN PCUNICODE_STRING KeyName
,
339 IN BOOLEAN CaseInsensitive
);
343 CmComparePackedNames(
344 IN PCUNICODE_STRING Name
,
346 IN USHORT NameBufferSize
,
347 IN BOOLEAN NamePacked
,
348 IN BOOLEAN CaseInsensitive
);
353 IN PCM_KEY_NODE KeyCell
,
354 IN PCUNICODE_STRING KeyName
,
355 IN BOOLEAN CaseInsensitive
);
359 CmCompareKeyValueName(
360 IN PCM_KEY_VALUE ValueCell
,
361 IN PCUNICODE_STRING KeyName
,
362 IN BOOLEAN CaseInsensitive
);
367 _In_ PCM_KEY_NODE KeyNode
,
368 _Out_ PWCHAR KeyNameBuffer
,
369 _Inout_ ULONG BufferLength
);
374 _In_ PCM_KEY_VALUE ValueCell
,
375 _Out_ PWCHAR ValueNameBuffer
,
376 _Inout_ ULONG BufferLength
);
381 PHV_TRACK_CELL_REF CellRef
,
388 HvReleaseFreeCellRefArray(
389 PHV_TRACK_CELL_REF CellRef
400 HSTORAGE_TYPE Storage
);
403 HvpCreateHiveFreeCellList(
407 HvpHiveHeaderChecksum(
408 PHBASE_BLOCK HiveHeader
);