Create mandatory keys for resource management.
[reactos.git] / reactos / ntoskrnl / cm / cm.h
1
2 #ifndef __INCLUDE_CM_H
3 #define __INCLUDE_CM_H
4
5 #define REG_ROOT_KEY_NAME L"\\Registry"
6 #define REG_MACHINE_KEY_NAME L"\\Registry\\Machine"
7 #define REG_HARDWARE_KEY_NAME L"\\Registry\\Machine\\HARDWARE"
8 #define REG_DESCRIPTION_KEY_NAME L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION"
9 #define REG_DEVICEMAP_KEY_NAME L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP"
10 #define REG_RESOURCEMAP_KEY_NAME L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"
11 #define REG_CLASSES_KEY_NAME L"\\Registry\\Machine\\Software\\Classes"
12 #define REG_SYSTEM_KEY_NAME L"\\Registry\\Machine\\System"
13 #define REG_SOFTWARE_KEY_NAME L"\\Registry\\Machine\\Software"
14 #define REG_SAM_KEY_NAME L"\\Registry\\Machine\\Sam"
15 #define REG_SEC_KEY_NAME L"\\Registry\\Machine\\Security"
16 #define REG_USERS_KEY_NAME L"\\Registry\\User"
17 #define REG_USER_KEY_NAME L"\\Registry\\User\\CurrentUser"
18 #define SYSTEM_REG_FILE L"\\SystemRoot\\System32\\Config\\SYSTEM"
19 #define SOFTWARE_REG_FILE L"\\SystemRoot\\System32\\Config\\SOFTWARE"
20 #define USER_REG_FILE L"\\SystemRoot\\System32\\Config\\DEFAULT"
21 #define SAM_REG_FILE L"\\SystemRoot\\System32\\Config\\SAM"
22 #define SEC_REG_FILE L"\\SystemRoot\\System32\\Config\\SECURITY"
23
24 #define REGISTRY_FILE_MAGIC "REGEDIT4"
25
26 #define REG_MACHINE_STD_HANDLE_NAME "HKEY_LOCAL_MACHINE"
27 #define REG_CLASSES_STD_HANDLE_NAME "HKEY_CLASSES_ROOT"
28 #define REG_USERS_STD_HANDLE_NAME "HKEY_USERS"
29 #define REG_USER_STD_HANDLE_NAME "HKEY_CURRENT_USER"
30 #define REG_CONFIG_STD_HANDLE_NAME "HKEY_CURRENT_CONFIG"
31 #define REG_DYN_STD_HANDLE_NAME "HKEY_DYN_DATA"
32 #define MAX_REG_STD_HANDLE_NAME 19
33
34 #define KO_MARKED_FOR_DELETE 0x00000001
35
36 // BLOCK_OFFSET = offset in file after header block
37 typedef DWORD BLOCK_OFFSET;
38
39 /* header for registry hive file : */
40 typedef struct _HEADER_BLOCK
41 {
42 ULONG BlockId; /* ="regf" */
43 ULONG Version; /* file version ?*/
44 ULONG VersionOld; /* file version ?*/
45 FILETIME DateModified; /* please don't replace with LARGE_INTEGER !*/
46 ULONG Unused3; /* registry format version ? */
47 ULONG Unused4; /* registry format version ? */
48 ULONG Unused5; /* registry format version ? */
49 ULONG Unused6; /* registry format version ? */
50 BLOCK_OFFSET RootKeyBlock;
51 ULONG BlockSize;
52 ULONG Unused7;
53 WCHAR FileName[64]; /* end of file name */
54 ULONG Unused8[83];
55 ULONG Checksum;
56 } HEADER_BLOCK, *PHEADER_BLOCK;
57
58 typedef struct _HEAP_BLOCK
59 {
60 ULONG BlockId; /* = "hbin" */
61 BLOCK_OFFSET BlockOffset; /* block offset of this heap */
62 ULONG BlockSize; /* size in bytes, 4k multiple */
63 ULONG Unused1;
64 FILETIME DateModified; /* please don't replace with LARGE_INTEGER !*/
65 ULONG Unused2;
66 } HEAP_BLOCK, *PHEAP_BLOCK;
67
68 // each sub_block begin with this struct :
69 // in a free subblock, higher bit of SubBlockSize is set
70 typedef struct _FREE_SUB_BLOCK
71 {
72 LONG SubBlockSize;/* <0 if used, >0 if free */
73 } FREE_SUB_BLOCK, *PFREE_SUB_BLOCK;
74
75 typedef struct _KEY_BLOCK
76 {
77 LONG SubBlockSize;
78 USHORT SubBlockId;
79 USHORT Type;
80 FILETIME LastWriteTime; /* please don't replace with LARGE_INTEGER !*/
81 ULONG UnUsed1;
82 BLOCK_OFFSET ParentKeyOffset;
83 ULONG NumberOfSubKeys;
84 ULONG UnUsed2;
85 BLOCK_OFFSET HashTableOffset;
86 ULONG UnUsed3;
87 ULONG NumberOfValues;
88 BLOCK_OFFSET ValuesOffset;
89 BLOCK_OFFSET SecurityKeyOffset;
90 BLOCK_OFFSET ClassNameOffset;
91 ULONG Unused4[5];
92 USHORT NameSize;
93 USHORT ClassSize; /* size of ClassName in bytes */
94 UCHAR Name[0]; /* warning : not zero terminated */
95 } KEY_BLOCK, *PKEY_BLOCK;
96
97 // hash record :
98 // HashValue=four letters of value's name
99 typedef struct _HASH_RECORD
100 {
101 BLOCK_OFFSET KeyOffset;
102 ULONG HashValue;
103 } HASH_RECORD, *PHASH_RECORD;
104
105 typedef struct _HASH_TABLE_BLOCK
106 {
107 LONG SubBlockSize;
108 USHORT SubBlockId;
109 USHORT HashTableSize;
110 HASH_RECORD Table[0];
111 } HASH_TABLE_BLOCK, *PHASH_TABLE_BLOCK;
112
113 typedef struct _VALUE_LIST_BLOCK
114 {
115 LONG SubBlockSize;
116 BLOCK_OFFSET Values[0];
117 } VALUE_LIST_BLOCK, *PVALUE_LIST_BLOCK;
118
119 typedef struct _VALUE_BLOCK
120 {
121 LONG SubBlockSize;
122 USHORT SubBlockId; // "kv"
123 USHORT NameSize; // length of Name
124 LONG DataSize; // length of datas in the subblock pointed by DataOffset
125 BLOCK_OFFSET DataOffset;// datas are here if high bit of DataSize is set
126 ULONG DataType;
127 USHORT Flags;
128 USHORT Unused1;
129 UCHAR Name[0]; /* warning : not zero terminated */
130 } VALUE_BLOCK, *PVALUE_BLOCK;
131
132 typedef struct _DATA_BLOCK
133 {
134 LONG SubBlockSize;
135 UCHAR Data[0];
136 } DATA_BLOCK, *PDATA_BLOCK;
137
138 typedef struct _REGISTRY_FILE
139 {
140 PWSTR Filename;
141 ULONG FileSize;
142 PFILE_OBJECT FileObject;
143 PHEADER_BLOCK HeaderBlock;
144 // ULONG NumberOfBlocks;
145 ULONG BlockListSize;
146 PHEAP_BLOCK *BlockList;
147 ULONG FreeListSize;
148 ULONG FreeListMax;
149 PFREE_SUB_BLOCK *FreeList;
150 BLOCK_OFFSET *FreeListOffset;
151 // KSPIN_LOCK RegLock;
152 KSEMAPHORE RegSem;
153
154
155 // NTSTATUS (*Extend)(ULONG NewSize);
156 // PVOID (*Flush)(VOID);
157 } REGISTRY_FILE, *PREGISTRY_FILE;
158
159 /* Type defining the Object Manager Key Object */
160 typedef struct _KEY_OBJECT
161 {
162 CSHORT Type;
163 CSHORT Size;
164
165 ULONG Flags;
166 USHORT NameSize; // length of Name
167 UCHAR *Name;
168 PREGISTRY_FILE RegistryFile;
169 BLOCK_OFFSET BlockOffset;
170 PKEY_BLOCK KeyBlock;
171 struct _KEY_OBJECT *ParentKey;
172 ULONG NumberOfSubKeys; /* subkeys loaded in SubKeys */
173 ULONG SizeOfSubKeys; /* space allocated in SubKeys */
174 struct _KEY_OBJECT **SubKeys; /* list of subkeys loaded */
175 } KEY_OBJECT, *PKEY_OBJECT;
176
177
178 NTSTATUS STDCALL
179 CmiObjectParse(PVOID ParsedObject,
180 PVOID *NextObject,
181 PUNICODE_STRING FullPath,
182 PWSTR *Path,
183 POBJECT_TYPE ObjectType,
184 ULONG Attribute);
185
186 NTSTATUS STDCALL
187 CmiObjectCreate(PVOID ObjectBody,
188 PVOID Parent,
189 PWSTR RemainingPath,
190 struct _OBJECT_ATTRIBUTES* ObjectAttributes);
191
192 VOID STDCALL
193 CmiObjectDelete(PVOID DeletedObject);
194
195 VOID CmiAddKeyToList(PKEY_OBJECT ParentKey,PKEY_OBJECT NewKey);
196 NTSTATUS CmiRemoveKeyFromList(PKEY_OBJECT NewKey);
197 PKEY_OBJECT CmiScanKeyList(PKEY_OBJECT Parent,
198 PCHAR KeyNameBuf,
199 ULONG Attributes);
200
201 PREGISTRY_FILE CmiCreateRegistry(PWSTR Filename);
202
203 ULONG CmiGetMaxNameLength(PREGISTRY_FILE RegistryFile,
204 PKEY_BLOCK KeyBlock);
205 ULONG CmiGetMaxClassLength(PREGISTRY_FILE RegistryFile,
206 PKEY_BLOCK KeyBlock);
207 ULONG CmiGetMaxValueNameLength(PREGISTRY_FILE RegistryFile,
208 PKEY_BLOCK KeyBlock);
209 ULONG CmiGetMaxValueDataLength(PREGISTRY_FILE RegistryFile,
210 PKEY_BLOCK KeyBlock);
211
212 NTSTATUS CmiScanForSubKey(IN PREGISTRY_FILE RegistryFile,
213 IN PKEY_BLOCK KeyBlock,
214 OUT PKEY_BLOCK *SubKeyBlock,
215 OUT BLOCK_OFFSET *BlockOffset,
216 IN PCHAR KeyName,
217 IN ACCESS_MASK DesiredAccess,
218 IN ULONG Attributes);
219 NTSTATUS CmiAddSubKey(IN PREGISTRY_FILE RegistryFile,
220 IN PKEY_OBJECT Parent,
221 OUT PKEY_OBJECT SubKey,
222 IN PWSTR NewSubKeyName,
223 IN USHORT NewSubKeyNameSize,
224 IN ULONG TitleIndex,
225 IN PUNICODE_STRING Class,
226 IN ULONG CreateOptions);
227
228 NTSTATUS CmiScanKeyForValue(IN PREGISTRY_FILE RegistryFile,
229 IN PKEY_BLOCK KeyBlock,
230 IN PCHAR ValueName,
231 OUT PVALUE_BLOCK *ValueBlock,
232 OUT BLOCK_OFFSET *VBOffset);
233 NTSTATUS CmiGetValueFromKeyByIndex(IN PREGISTRY_FILE RegistryFile,
234 IN PKEY_BLOCK KeyBlock,
235 IN ULONG Index,
236 OUT PVALUE_BLOCK *ValueBlock);
237 NTSTATUS CmiAddValueToKey(IN PREGISTRY_FILE RegistryFile,
238 IN PKEY_BLOCK KeyBlock,
239 IN PCHAR ValueNameBuf,
240 OUT PVALUE_BLOCK *pValueBlock,
241 OUT BLOCK_OFFSET *pVBOffset);
242 NTSTATUS CmiDeleteValueFromKey(IN PREGISTRY_FILE RegistryFile,
243 IN PKEY_BLOCK KeyBlock,
244 IN PCHAR ValueName);
245
246 NTSTATUS CmiAllocateHashTableBlock(IN PREGISTRY_FILE RegistryFile,
247 OUT PHASH_TABLE_BLOCK *HashBlock,
248 OUT BLOCK_OFFSET *HBOffset,
249 IN ULONG HashTableSize);
250 PKEY_BLOCK CmiGetKeyFromHashByIndex(PREGISTRY_FILE RegistryFile,
251 PHASH_TABLE_BLOCK HashBlock,
252 ULONG Index);
253 NTSTATUS CmiAddKeyToHashTable(PREGISTRY_FILE RegistryFile,
254 PHASH_TABLE_BLOCK HashBlock,
255 PKEY_BLOCK NewKeyBlock,
256 BLOCK_OFFSET NKBOffset);
257
258 NTSTATUS CmiAllocateValueBlock(IN PREGISTRY_FILE RegistryFile,
259 OUT PVALUE_BLOCK *ValueBlock,
260 OUT BLOCK_OFFSET *VBOffset,
261 IN PCHAR ValueNameBuf);
262 NTSTATUS CmiDestroyValueBlock(PREGISTRY_FILE RegistryFile,
263 PVALUE_BLOCK ValueBlock, BLOCK_OFFSET VBOffset);
264
265 NTSTATUS CmiAllocateBlock(PREGISTRY_FILE RegistryFile,
266 PVOID *Block,
267 LONG BlockSize,
268 BLOCK_OFFSET * pBlockOffset);
269 NTSTATUS CmiDestroyBlock(PREGISTRY_FILE RegistryFile,
270 PVOID Block,BLOCK_OFFSET Offset);
271 PVOID CmiGetBlock(PREGISTRY_FILE RegistryFile,
272 BLOCK_OFFSET BlockOffset,
273 OUT PHEAP_BLOCK * ppHeap);
274 VOID CmiLockBlock(PREGISTRY_FILE RegistryFile,
275 PVOID Block);
276 VOID CmiReleaseBlock(PREGISTRY_FILE RegistryFile,
277 PVOID Block);
278 NTSTATUS
279 CmiAddFree(PREGISTRY_FILE RegistryFile,
280 PFREE_SUB_BLOCK FreeBlock,BLOCK_OFFSET FreeOffset);
281
282 #endif /*__INCLUDE_CM_H*/