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
23 // Definitions copied from <ntstatus.h>
24 // We only want to include host headers, so we define them manually
25 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
26 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
27 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
28 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
29 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
30 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
31 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
33 #define REG_OPTION_VOLATILE 1
34 #define OBJ_CASE_INSENSITIVE 0x00000040L
35 #define USHORT_MAX USHRT_MAX
39 OUT PLARGE_INTEGER CurrentTime
);
43 IN PRTL_BITMAP BitMapHeader
,
44 IN PULONG BitMapBuffer
,
45 IN ULONG SizeOfBitMap
);
49 IN PRTL_BITMAP BitMapHeader
,
50 IN ULONG NumberToFind
,
55 IN PRTL_BITMAP BitMapHeader
,
56 IN ULONG StartingIndex
,
57 IN ULONG NumberToSet
);
61 IN PRTL_BITMAP BitMapHeader
);
63 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
64 #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
66 #define PKTHREAD PVOID
67 #define PKGUARDED_MUTEX PVOID
68 #define PERESOURCE PVOID
69 #define PFILE_OBJECT PVOID
71 #define PWORK_QUEUE_ITEM PVOID
72 #define EX_PUSH_LOCK PULONG_PTR
74 #define CMLTRACE(x, ...)
77 // Debug/Tracing support
80 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
81 #define CMLTRACE DbgPrintEx
83 #define CMLTRACE(x, ...) \
84 if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__)
87 #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__)
93 /* Prevent inclusion of Windows headers through <wine/unicode.h> */
101 // These define the Debug Masks Supported
103 #define CMLIB_HCELL_DEBUG 0x01
106 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
107 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
111 // PAGE_SIZE definition
114 #if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm)
115 #define PAGE_SIZE 0x1000
117 #error Local PAGE_SIZE definition required when built as host
121 #define TAG_CM 'CM25'
125 #include <wine/unicode.h>
127 #include "hivedata.h"
130 #if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
132 #define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
133 #define PCM_KEY_CONTROL_BLOCK PVOID
134 #define CMP_SECURITY_HASH_LISTS 64
135 #define PCM_CELL_REMAP_BLOCK PVOID
138 // Use Count Log and Entry
140 typedef struct _CM_USE_COUNT_LOG_ENTRY
144 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
146 typedef struct _CM_USE_COUNT_LOG
150 CM_USE_COUNT_LOG_ENTRY Log
[32];
151 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
154 // Configuration Manager Hive Structure
156 typedef struct _CMHIVE
159 HANDLE FileHandles
[HFILE_TYPE_MAX
];
160 LIST_ENTRY NotifyList
;
162 EX_PUSH_LOCK HiveLock
;
163 PKTHREAD HiveLockOwner
;
164 PKGUARDED_MUTEX ViewLock
;
165 PKTHREAD ViewLockOwner
;
166 EX_PUSH_LOCK WriterLock
;
167 PKTHREAD WriterLockOwner
;
168 PERESOURCE FlusherLock
;
169 EX_PUSH_LOCK SecurityLock
;
170 PKTHREAD HiveSecurityLockOwner
;
171 LIST_ENTRY LRUViewListHead
;
172 LIST_ENTRY PinViewListHead
;
173 PFILE_OBJECT FileObject
;
174 UNICODE_STRING FileFullPath
;
175 UNICODE_STRING FileUserName
;
180 ULONG SecurityCacheSize
;
181 LONG SecurityHitHint
;
182 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
183 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
185 PCM_KEY_CONTROL_BLOCK RootKcb
;
187 PWORK_QUEUE_ITEM UnloadWorkItem
;
188 BOOLEAN GrowOnlyMode
;
190 LIST_ENTRY KcbConvertListHead
;
191 LIST_ENTRY KnodeConvertListHead
;
192 PCM_CELL_REMAP_BLOCK CellRemapArray
;
193 CM_USE_COUNT_LOG UseCountLog
;
194 CM_USE_COUNT_LOG LockHiveLog
;
196 LIST_ENTRY TrustClassEntry
;
198 BOOLEAN HiveIsLoading
;
199 PKTHREAD CreatorOwner
;
204 typedef struct _HV_HIVE_CELL_PAIR
208 } HV_HIVE_CELL_PAIR
, *PHV_HIVE_CELL_PAIR
;
210 #define STATIC_CELL_PAIR_COUNT 4
211 typedef struct _HV_TRACK_CELL_REF
215 PHV_HIVE_CELL_PAIR CellArray
;
216 HV_HIVE_CELL_PAIR StaticArray
[STATIC_CELL_PAIR_COUNT
];
218 } HV_TRACK_CELL_REF
, *PHV_TRACK_CELL_REF
;
220 extern ULONG CmlibTraceLevel
;
231 PVOID HiveData OPTIONAL
,
232 PALLOCATE_ROUTINE Allocate
,
234 PFILE_SET_SIZE_ROUTINE FileSetSize
,
235 PFILE_WRITE_ROUTINE FileWrite
,
236 PFILE_READ_ROUTINE FileRead
,
237 PFILE_FLUSH_ROUTINE FileFlush
,
238 ULONG Cluster OPTIONAL
,
239 PUNICODE_STRING FileName
);
243 PHHIVE RegistryHive
);
248 HCELL_INDEX CellOffset
);
250 #define HvReleaseCell(h, c) \
252 if ((h)->ReleaseCellRoutine) \
253 (h)->ReleaseCellRoutine(h, c); \
265 HSTORAGE_TYPE Storage
,
266 IN HCELL_INDEX Vicinity
);
270 IN PHHIVE RegistryHive
,
271 IN HCELL_INDEX CellIndex
277 HCELL_INDEX CellOffset
,
283 HCELL_INDEX CellOffset
);
288 HCELL_INDEX CellOffset
,
289 BOOLEAN HoldingLock
);
300 IN PHHIVE RegistryHive
305 PHHIVE RegistryHive
);
309 PHHIVE RegistryHive
);
318 PHHIVE RegistryHive
);
323 IN PCUNICODE_STRING KeyName
,
325 IN BOOLEAN CaseInsensitive
);
329 CmComparePackedNames(
330 IN PCUNICODE_STRING Name
,
332 IN USHORT NameBufferSize
,
333 IN BOOLEAN NamePacked
,
334 IN BOOLEAN CaseInsensitive
);
339 IN PCM_KEY_NODE KeyCell
,
340 IN PCUNICODE_STRING KeyName
,
341 IN BOOLEAN CaseInsensitive
);
345 CmCompareKeyValueName(
346 IN PCM_KEY_VALUE ValueCell
,
347 IN PCUNICODE_STRING KeyName
,
348 IN BOOLEAN CaseInsensitive
);
353 IN PCM_KEY_NODE KeyNode
,
354 _Out_ PWCHAR KeyNameBuffer
,
355 _Inout_ ULONG BufferLength
);
360 _In_ PCM_KEY_VALUE ValueCell
,
361 _Out_ PWCHAR ValueNameBuffer
,
362 _Inout_ ULONG BufferLength
);
367 PHV_TRACK_CELL_REF CellRef
,
374 HvReleaseFreeCellRefArray(
375 PHV_TRACK_CELL_REF CellRef
386 HSTORAGE_TYPE Storage
);
389 HvpCreateHiveFreeCellList(
393 HvpHiveHeaderChecksum(
394 PHBASE_BLOCK HiveHeader
);