10 #define REG_ROOT_KEY_NAME L"\\Registry"
11 #define REG_MACHINE_KEY_NAME L"\\Registry\\Machine"
12 #define REG_HARDWARE_KEY_NAME L"\\Registry\\Machine\\HARDWARE"
13 #define REG_DESCRIPTION_KEY_NAME L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION"
14 #define REG_DEVICEMAP_KEY_NAME L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP"
15 #define REG_RESOURCEMAP_KEY_NAME L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"
16 #define REG_CLASSES_KEY_NAME L"\\Registry\\Machine\\Software\\Classes"
17 #define REG_SYSTEM_KEY_NAME L"\\Registry\\Machine\\System"
18 #define REG_SOFTWARE_KEY_NAME L"\\Registry\\Machine\\Software"
19 #define REG_SAM_KEY_NAME L"\\Registry\\Machine\\Sam"
20 #define REG_SEC_KEY_NAME L"\\Registry\\Machine\\Security"
21 #define REG_USERS_KEY_NAME L"\\Registry\\User"
22 #define REG_USER_KEY_NAME L"\\Registry\\User\\CurrentUser"
23 #define SYSTEM_REG_FILE L"\\SystemRoot\\System32\\Config\\SYSTEM"
24 #define SOFTWARE_REG_FILE L"\\SystemRoot\\System32\\Config\\SOFTWARE"
25 #define USER_REG_FILE L"\\SystemRoot\\System32\\Config\\DEFAULT"
26 #define SAM_REG_FILE L"\\SystemRoot\\System32\\Config\\SAM"
27 #define SEC_REG_FILE L"\\SystemRoot\\System32\\Config\\SECURITY"
29 #define REG_SYSTEM_FILE_NAME L"\\SYSTEM"
30 #define REG_SOFTWARE_FILE_NAME L"\\SOFTWARE"
31 #define REG_USER_FILE_NAME L"\\DEFAULT"
32 #define REG_SAM_FILE_NAME L"\\SAM"
33 #define REG_SEC_FILE_NAME L"\\SECURITY"
35 #define REG_BLOCK_SIZE 4096
36 #define REG_HBIN_DATA_OFFSET 32
37 #define REG_BIN_ID 0x6e696268
38 #define REG_INIT_BLOCK_LIST_SIZE 32
39 #define REG_INIT_HASH_TABLE_SIZE 3
40 #define REG_EXTEND_HASH_TABLE_SIZE 4
41 #define REG_VALUE_LIST_CELL_MULTIPLE 4
42 #define REG_KEY_CELL_ID 0x6b6e
43 #define REG_HASH_TABLE_BLOCK_ID 0x666c
44 #define REG_VALUE_CELL_ID 0x6b76
45 #define REG_HIVE_ID 0x66676572
47 #define REGISTRY_FILE_MAGIC "REGEDIT4"
49 #define REG_MACHINE_STD_HANDLE_NAME "HKEY_LOCAL_MACHINE"
50 #define REG_CLASSES_STD_HANDLE_NAME "HKEY_CLASSES_ROOT"
51 #define REG_USERS_STD_HANDLE_NAME "HKEY_USERS"
52 #define REG_USER_STD_HANDLE_NAME "HKEY_CURRENT_USER"
53 #define REG_CONFIG_STD_HANDLE_NAME "HKEY_CURRENT_CONFIG"
54 #define REG_DYN_STD_HANDLE_NAME "HKEY_DYN_DATA"
55 #define MAX_REG_STD_HANDLE_NAME 19
57 // BLOCK_OFFSET = offset in file after header block
58 typedef ULONG BLOCK_OFFSET;
60 /* header for registry hive file : */
61 typedef struct _HIVE_HEADER
63 /* Hive identifier "regf" (0x66676572) */
69 /* File version ? - same as Version */
72 /* When this hive file was last modified */
73 FILETIME DateModified;
75 /* Registry format version ? (1?) */
78 /* Registry format version ? (3?) */
81 /* Registry format version ? (0?) */
84 /* Registry format version ? (1?) */
87 /* Offset into file from the byte after the end of the base block.
88 If the hive is volatile, this is the actual pointer to the KEY_CELL */
89 BLOCK_OFFSET RootKeyCell;
91 /* Size of each hive block ? */
97 /* Name of hive file */
103 /* Checksum of first 0x200 bytes */
105 } __attribute__((packed)) HIVE_HEADER, *PHIVE_HEADER;
109 /* Bin identifier "hbin" (0x6E696268) */
112 /* Block offset of this bin */
113 BLOCK_OFFSET BlockOffset;
115 /* Size in bytes, multiple of the block size (4KB) */
121 /* When this bin was last modified */
122 FILETIME DateModified;
126 } __attribute__((packed)) HBIN, *PHBIN;
128 typedef struct _CELL_HEADER
130 /* <0 if used, >0 if free */
132 } __attribute__((packed)) CELL_HEADER, *PCELL_HEADER;
134 typedef struct _KEY_CELL
136 /* Size of this cell */
139 /* Key cell identifier "kn" (0x6b6e) */
145 /* Time of last flush */
146 FILETIME LastWriteTime;
151 /* Block offset of parent key cell */
152 BLOCK_OFFSET ParentKeyOffset;
154 /* Count of sub keys for the key in this key cell */
155 ULONG NumberOfSubKeys;
160 /* Block offset of has table for FIXME: subkeys/values? */
161 BLOCK_OFFSET HashTableOffset;
166 /* Count of values contained in this key cell */
167 ULONG NumberOfValues;
169 /* Block offset of VALUE_LIST_CELL */
170 BLOCK_OFFSET ValuesOffset;
172 /* Block offset of security cell */
173 BLOCK_OFFSET SecurityKeyOffset;
175 /* Block offset of registry key class */
176 BLOCK_OFFSET ClassNameOffset;
181 /* Size in bytes of key name */
184 /* Size of class name in bytes */
187 /* Name of key (not zero terminated) */
189 } __attribute__((packed)) KEY_CELL, *PKEY_CELL;
191 /* KEY_CELL.Type constants */
192 #define REG_LINK_KEY_CELL_TYPE 0x10
193 #define REG_KEY_CELL_TYPE 0x20
194 #define REG_ROOT_KEY_CELL_TYPE 0x2c
198 // HashValue=four letters of value's name
199 typedef struct _HASH_RECORD
201 BLOCK_OFFSET KeyOffset;
203 } __attribute__((packed)) HASH_RECORD, *PHASH_RECORD;
205 typedef struct _HASH_TABLE_CELL
209 USHORT HashTableSize;
210 HASH_RECORD Table[0];
211 } __attribute__((packed)) HASH_TABLE_CELL, *PHASH_TABLE_CELL;
213 typedef struct _VALUE_LIST_CELL
216 BLOCK_OFFSET Values[0];
217 } __attribute__((packed)) VALUE_LIST_CELL, *PVALUE_LIST_CELL;
219 typedef struct _VALUE_CELL
223 USHORT NameSize; // length of Name
224 LONG DataSize; // length of datas in the cell pointed by DataOffset
225 BLOCK_OFFSET DataOffset;// datas are here if high bit of DataSize is set
229 UCHAR Name[0]; /* warning : not zero terminated */
230 } __attribute__((packed)) VALUE_CELL, *PVALUE_CELL;
232 /* VALUE_CELL.Flags constants */
233 #define REG_VALUE_NAME_PACKED 0x0001
236 typedef struct _DATA_CELL
240 } __attribute__((packed)) DATA_CELL, *PDATA_CELL;
242 typedef struct _REGISTRY_HIVE
246 UNICODE_STRING Filename;
248 PFILE_OBJECT FileObject;
250 PHIVE_HEADER HiveHeader;
255 PCELL_HEADER *FreeList;
256 BLOCK_OFFSET *FreeListOffset;
257 ERESOURCE HiveResource;
259 RTL_BITMAP DirtyBitMap;
262 // NTSTATUS (*Extend)(ULONG NewSize);
263 // PVOID (*Flush)(VOID);
264 } REGISTRY_HIVE, *PREGISTRY_HIVE;
266 /* REGISTRY_HIVE.Flags constants */
267 #define HIVE_VOLATILE 0x00000001
269 #define IsVolatileHive(Hive)(Hive->Flags & HIVE_VOLATILE)
270 #define IsPermanentHive(Hive)(!(Hive->Flags & HIVE_VOLATILE))
272 #define IsFreeCell(Cell)(Cell->CellSize >= 0)
273 #define IsUsedCell(Cell)(Cell->CellSize < 0)
276 /* KEY_OBJECT.Flags */
278 /* When set, the key is scheduled for deletion, and all
279 attempts to access the key must not succeed */
280 #define KO_MARKED_FOR_DELETE 0x00000001
283 /* Type defining the Object Manager Key Object */
284 typedef struct _KEY_OBJECT
286 /* Fields used by the Object Manager */
299 /* Registry hive the key belongs to */
300 PREGISTRY_HIVE RegistryHive;
302 /* Block offset of the key cell this key belongs in */
303 BLOCK_OFFSET BlockOffset;
305 /* KEY_CELL this key belong in */
308 /* Link to the parent KEY_OBJECT for this key */
309 struct _KEY_OBJECT *ParentKey;
311 /* Subkeys loaded in SubKeys */
312 ULONG NumberOfSubKeys;
314 /* Space allocated in SubKeys */
317 /* List of subkeys loaded */
318 struct _KEY_OBJECT **SubKeys;
319 } KEY_OBJECT, *PKEY_OBJECT;
321 /* Bits 31-22 (top 10 bits) of the cell index is the directory index */
322 #define CmiDirectoryIndex(CellIndex)(CellIndex & 0xffc000000)
323 /* Bits 21-12 (middle 10 bits) of the cell index is the table index */
324 #define CmiTableIndex(Cellndex)(CellIndex & 0x003ff000)
325 /* Bits 11-0 (bottom 12 bits) of the cell index is the byte offset */
326 #define CmiByteOffset(Cellndex)(CellIndex & 0x00000fff)
329 extern BOOLEAN CmiDoVerify;
330 extern PREGISTRY_HIVE CmiVolatileHive;
331 extern POBJECT_TYPE CmiKeyType;
332 extern KSPIN_LOCK CmiKeyListLock;
334 extern LIST_ENTRY CmiHiveListHead;
335 extern ERESOURCE CmiHiveListLock;
339 CmiVerifyBinCell(PHBIN BinCell);
341 CmiVerifyKeyCell(PKEY_CELL KeyCell);
343 CmiVerifyRootKeyCell(PKEY_CELL RootKeyCell);
345 CmiVerifyKeyObject(PKEY_OBJECT KeyObject);
347 CmiVerifyRegistryHive(PREGISTRY_HIVE RegistryHive);
350 #define VERIFY_BIN_CELL CmiVerifyBinCell
351 #define VERIFY_KEY_CELL CmiVerifyKeyCell
352 #define VERIFY_ROOT_KEY_CELL CmiVerifyRootKeyCell
353 #define VERIFY_VALUE_CELL CmiVerifyValueCell
354 #define VERIFY_VALUE_LIST_CELL CmiVerifyValueListCell
355 #define VERIFY_KEY_OBJECT CmiVerifyKeyObject
356 #define VERIFY_REGISTRY_HIVE CmiVerifyRegistryHive
358 #define VERIFY_BIN_CELL(x)
359 #define VERIFY_KEY_CELL(x)
360 #define VERIFY_ROOT_KEY_CELL(x)
361 #define VERIFY_VALUE_CELL(x)
362 #define VERIFY_VALUE_LIST_CELL(x)
363 #define VERIFY_KEY_OBJECT(x)
364 #define VERIFY_REGISTRY_HIVE(x)
368 CmiObjectParse(IN PVOID ParsedObject,
369 OUT PVOID *NextObject,
370 IN PUNICODE_STRING FullPath,
375 CmiObjectCreate(PVOID ObjectBody,
378 struct _OBJECT_ATTRIBUTES* ObjectAttributes);
381 CmiObjectDelete(PVOID DeletedObject);
384 CmiAddKeyToList(PKEY_OBJECT ParentKey,
385 IN PKEY_OBJECT NewKey);
388 CmiRemoveKeyFromList(IN PKEY_OBJECT NewKey);
390 PKEY_OBJECT CmiScanKeyList(IN PKEY_OBJECT Parent,
392 IN ULONG Attributes);
395 CmiCreateRegistryHive(PWSTR Filename,
396 PREGISTRY_HIVE *RegistryHive,
400 CmiRemoveRegistryHive(PREGISTRY_HIVE RegistryHive);
403 CmiFlushRegistryHive(PREGISTRY_HIVE RegistryHive);
406 CmiGetMaxNameLength(IN PREGISTRY_HIVE RegistryHive,
407 IN PKEY_CELL KeyCell);
410 CmiGetMaxClassLength(IN PREGISTRY_HIVE RegistryHive,
411 IN PKEY_CELL KeyCell);
414 CmiGetMaxValueNameLength(IN PREGISTRY_HIVE RegistryHive,
415 IN PKEY_CELL KeyCell);
418 CmiGetMaxValueDataLength(IN PREGISTRY_HIVE RegistryHive,
419 IN PKEY_CELL KeyCell);
422 CmiScanForSubKey(IN PREGISTRY_HIVE RegistryHive,
423 IN PKEY_CELL KeyCell,
424 OUT PKEY_CELL *SubKeyCell,
425 OUT BLOCK_OFFSET *BlockOffset,
427 IN ACCESS_MASK DesiredAccess,
428 IN ULONG Attributes);
431 CmiAddSubKey(IN PREGISTRY_HIVE RegistryHive,
432 IN PKEY_OBJECT Parent,
433 OUT PKEY_OBJECT SubKey,
434 IN PWSTR NewSubKeyName,
435 IN USHORT NewSubKeyNameSize,
437 IN PUNICODE_STRING Class,
438 IN ULONG CreateOptions);
441 CmiRemoveSubKey(IN PREGISTRY_HIVE RegistryHive,
442 IN PKEY_OBJECT Parent,
443 IN PKEY_OBJECT SubKey);
446 CmiScanKeyForValue(IN PREGISTRY_HIVE RegistryHive,
447 IN PKEY_CELL KeyCell,
448 IN PUNICODE_STRING ValueName,
449 OUT PVALUE_CELL *ValueCell,
450 OUT BLOCK_OFFSET *VBOffset);
453 CmiGetValueFromKeyByIndex(IN PREGISTRY_HIVE RegistryHive,
454 IN PKEY_CELL KeyCell,
456 OUT PVALUE_CELL *ValueCell);
459 CmiAddValueToKey(IN PREGISTRY_HIVE RegistryHive,
460 IN PKEY_CELL KeyCell,
461 IN PUNICODE_STRING ValueName,
462 OUT PVALUE_CELL *pValueCell,
463 OUT BLOCK_OFFSET *pVBOffset);
466 CmiDeleteValueFromKey(IN PREGISTRY_HIVE RegistryHive,
467 IN PKEY_CELL KeyCell,
468 IN BLOCK_OFFSET KeyCellOffset,
469 IN PUNICODE_STRING ValueName);
472 CmiAllocateHashTableBlock(IN PREGISTRY_HIVE RegistryHive,
473 OUT PHASH_TABLE_CELL *HashBlock,
474 OUT BLOCK_OFFSET *HBOffset,
475 IN ULONG HashTableSize);
478 CmiGetKeyFromHashByIndex(PREGISTRY_HIVE RegistryHive,
479 PHASH_TABLE_CELL HashBlock,
483 CmiAddKeyToHashTable(PREGISTRY_HIVE RegistryHive,
484 PHASH_TABLE_CELL HashBlock,
485 PKEY_CELL NewKeyCell,
486 BLOCK_OFFSET NKBOffset);
489 CmiRemoveKeyFromHashTable(PREGISTRY_HIVE RegistryHive,
490 PHASH_TABLE_CELL HashBlock,
491 BLOCK_OFFSET NKBOffset);
494 CmiAllocateValueCell(IN PREGISTRY_HIVE RegistryHive,
495 OUT PVALUE_CELL *ValueCell,
496 OUT BLOCK_OFFSET *VBOffset,
497 IN PUNICODE_STRING ValueName);
500 CmiDestroyValueCell(PREGISTRY_HIVE RegistryHive,
501 PVALUE_CELL ValueCell,
502 BLOCK_OFFSET VBOffset);
505 CmiAllocateBlock(PREGISTRY_HIVE RegistryHive,
508 BLOCK_OFFSET * pBlockOffset);
511 CmiDestroyBlock(PREGISTRY_HIVE RegistryHive,
513 BLOCK_OFFSET Offset);
516 CmiGetBlock(PREGISTRY_HIVE RegistryHive,
517 BLOCK_OFFSET BlockOffset,
521 CmiLockBlock(PREGISTRY_HIVE RegistryHive,
525 CmiReleaseBlock(PREGISTRY_HIVE RegistryHive,
529 CmiMarkBlockDirty(PREGISTRY_HIVE RegistryHive,
530 BLOCK_OFFSET BlockOffset);
533 CmiAddFree(PREGISTRY_HIVE RegistryHive,
534 PCELL_HEADER FreeBlock,
535 BLOCK_OFFSET FreeOffset);
538 CmiInitHives(BOOLEAN SetUpBoot);
541 CmiGetPackedNameLength(IN PUNICODE_STRING Name,
542 OUT PBOOLEAN Packable);
545 CmiComparePackedNames(IN PUNICODE_STRING Name,
547 IN USHORT NameBufferSize,
548 IN BOOLEAN NamePacked);
551 CmiCopyPackedName(PWCHAR NameBuffer,
552 PCHAR PackedNameBuffer,
553 ULONG PackedNameSize);
558 #endif /*__INCLUDE_CM_H*/