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
11 // Debug support switch
13 #define _CMLIB_DEBUG_ 1
16 #include <host/typedefs.h>
20 // Definitions copied from <ntstatus.h>
21 // We only want to include host headers, so we define them manually
22 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
23 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
24 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
25 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
26 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
27 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
28 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
30 #define REG_OPTION_VOLATILE 1
31 #define OBJ_CASE_INSENSITIVE 0x00000040L
32 #define USHORT_MAX USHRT_MAX
36 OUT PLARGE_INTEGER CurrentTime
);
40 IN PRTL_BITMAP BitMapHeader
,
41 IN PULONG BitMapBuffer
,
42 IN ULONG SizeOfBitMap
);
46 IN PRTL_BITMAP BitMapHeader
,
47 IN ULONG NumberToFind
,
52 IN PRTL_BITMAP BitMapHeader
,
53 IN ULONG StartingIndex
,
54 IN ULONG NumberToSet
);
58 IN PRTL_BITMAP BitMapHeader
);
60 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
61 #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
63 #define PKTHREAD PVOID
64 #define PKGUARDED_MUTEX PVOID
65 #define PERESOURCE PVOID
66 #define PFILE_OBJECT PVOID
68 #define PWORK_QUEUE_ITEM PVOID
69 #define EX_PUSH_LOCK PULONG_PTR
71 /* For <host/wcsfuncs.h> */
72 #define USE_HOST_WCSFUNCS
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__)
91 #undef DECLSPEC_IMPORT
92 #define DECLSPEC_IMPORT
96 #include <host/wcsfuncs.h>
99 // These define the Debug Masks Supported
101 #define CMLIB_HCELL_DEBUG 0x01
104 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
105 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
109 // PAGE_SIZE definition
112 #if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm)
113 #define PAGE_SIZE 0x1000
115 #error Local PAGE_SIZE definition required when built as host
119 #define TAG_CM 0x68742020
124 #include "hivedata.h"
127 #if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
129 #define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
130 #define PCM_KEY_CONTROL_BLOCK PVOID
131 #define CMP_SECURITY_HASH_LISTS 64
132 #define PCM_CELL_REMAP_BLOCK PVOID
135 // Use Count Log and Entry
137 typedef struct _CM_USE_COUNT_LOG_ENTRY
141 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
143 typedef struct _CM_USE_COUNT_LOG
147 CM_USE_COUNT_LOG_ENTRY Log
[32];
148 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
151 // Configuration Manager Hive Structure
153 typedef struct _CMHIVE
156 HANDLE FileHandles
[3];
157 LIST_ENTRY NotifyList
;
159 EX_PUSH_LOCK HiveLock
;
160 PKTHREAD HiveLockOwner
;
161 PKGUARDED_MUTEX ViewLock
;
162 PKTHREAD ViewLockOwner
;
163 EX_PUSH_LOCK WriterLock
;
164 PKTHREAD WriterLockOwner
;
165 PERESOURCE FlusherLock
;
166 EX_PUSH_LOCK SecurityLock
;
167 PKTHREAD HiveSecurityLockOwner
;
168 LIST_ENTRY LRUViewListHead
;
169 LIST_ENTRY PinViewListHead
;
170 PFILE_OBJECT FileObject
;
171 UNICODE_STRING FileFullPath
;
172 UNICODE_STRING FileUserName
;
177 ULONG SecurityCacheSize
;
178 LONG SecurityHitHint
;
179 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
180 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
182 PCM_KEY_CONTROL_BLOCK RootKcb
;
184 PWORK_QUEUE_ITEM UnloadWorkItem
;
185 BOOLEAN GrowOnlyMode
;
187 LIST_ENTRY KcbConvertListHead
;
188 LIST_ENTRY KnodeConvertListHead
;
189 PCM_CELL_REMAP_BLOCK CellRemapArray
;
190 CM_USE_COUNT_LOG UseCountLog
;
191 CM_USE_COUNT_LOG LockHiveLog
;
193 LIST_ENTRY TrustClassEntry
;
195 BOOLEAN HiveIsLoading
;
196 PKTHREAD CreatorOwner
;
201 extern ULONG CmlibTraceLevel
;
212 PVOID HiveData OPTIONAL
,
213 PALLOCATE_ROUTINE Allocate
,
215 PFILE_SET_SIZE_ROUTINE FileSetSize
,
216 PFILE_WRITE_ROUTINE FileWrite
,
217 PFILE_READ_ROUTINE FileRead
,
218 PFILE_FLUSH_ROUTINE FileFlush
,
219 ULONG Cluster OPTIONAL
,
220 PUNICODE_STRING FileName
);
224 PHHIVE RegistryHive
);
229 HCELL_INDEX CellOffset
);
231 #define HvReleaseCell(h, c) \
232 if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
243 HSTORAGE_TYPE Storage
,
244 IN HCELL_INDEX Vicinity
);
248 IN PHHIVE RegistryHive
,
249 IN HCELL_INDEX CellIndex
255 HCELL_INDEX CellOffset
,
261 HCELL_INDEX CellOffset
);
266 HCELL_INDEX CellOffset
,
267 BOOLEAN HoldingLock
);
277 PHHIVE RegistryHive
);
281 PHHIVE RegistryHive
);
290 PHHIVE RegistryHive
);
300 HSTORAGE_TYPE Storage
);
303 HvpCreateHiveFreeCellList(
307 HvpHiveHeaderChecksum(
308 PHBASE_BLOCK HiveHeader
);