2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/cm/cm.h
5 * PURPOSE: Internal header for the Configuration Manager
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
12 // Define this if you want debugging support
14 #define _CM_DEBUG_ 0x00
17 // These define the Debug Masks Supported
19 #define CM_HANDLE_DEBUG 0x01
20 #define CM_NAMESPACE_DEBUG 0x02
21 #define CM_SECURITY_DEBUG 0x04
22 #define CM_REFERENCE_DEBUG 0x08
23 #define CM_CALLBACK_DEBUG 0x10
26 // Debug/Tracing support
29 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
30 #define CMTRACE DbgPrintEx
32 #define CMTRACE(x, ...) \
33 if (x & CmpTraceLevel) DbgPrint(__VA_ARGS__)
36 #define CMTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
40 // Hack since bigkeys are not yet supported
42 #define ASSERT_VALUE_BIG(h, s) \
43 ASSERTMSG("Big keys not supported!", !CmpIsKeyValueBig(h, s));
46 // CM_KEY_CONTROL_BLOCK Signatures
48 #define CM_KCB_SIGNATURE 'bKmC'
49 #define CM_KCB_INVALID_SIGNATURE '4FmC'
52 // CM_KEY_CONTROL_BLOCK ExtFlags
54 #define CM_KCB_NO_SUBKEY 0x01
55 #define CM_KCB_SUBKEY_ONE 0x02
56 #define CM_KCB_SUBKEY_HINT 0x04
57 #define CM_KCB_SYM_LINK_FOUND 0x08
58 #define CM_KCB_KEY_NON_EXIST 0x10
59 #define CM_KCB_NO_DELAY_CLOSE 0x20
60 #define CM_KCB_INVALID_CACHED_INFO 0x40
61 #define CM_KCB_READ_ONLY_KEY 0x80
66 #define CM_KEY_VALUE_SMALL 0x4
67 #define CM_KEY_VALUE_BIG 0x3FD8
68 #define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000
71 // Number of various lists and hashes
73 #define CMP_SECURITY_HASH_LISTS 64
74 #define CMP_MAX_CALLBACKS 100
79 #define CMP_HASH_IRRATIONAL 314159269
80 #define CMP_HASH_PRIME 1000000007
83 // CmpCreateKeyControlBlock Flags
85 #define CMP_CREATE_FAKE_KCB 0x1
86 #define CMP_LOCK_HASHES_FOR_KCB 0x2
89 // CmpDoCreate and CmpDoOpen flags
91 #define CMP_CREATE_KCB_KCB_LOCKED 0x2
92 #define CMP_OPEN_KCB_NO_CREATE 0x4
95 // EnlistKeyBodyWithKCB Flags
97 #define CMP_ENLIST_KCB_LOCKED_SHARED 0x1
98 #define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE 0x2
103 #define CMP_UNLOCK_KCB_LOCKED 0x1
104 #define CMP_UNLOCK_REGISTRY_LOCKED 0x2
107 // Maximum size of Value Cache
109 #define MAXIMUM_CACHED_DATA 2 * PAGE_SIZE
112 // Hives to load on startup
114 #define CM_NUMBER_OF_MACHINE_HIVES 6
117 // Number of items that can fit inside an Allocation Page
119 #define CM_KCBS_PER_PAGE \
120 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_KEY_CONTROL_BLOCK))
121 #define CM_DELAYS_PER_PAGE \
122 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_DELAY_ALLOC))
125 // Value Search Results
127 typedef enum _VALUE_SEARCH_RETURN_TYPE
130 SearchNeedExclusiveLock
,
132 } VALUE_SEARCH_RETURN_TYPE
;
137 typedef struct _CM_KEY_HASH
140 struct _CM_KEY_HASH
*NextHash
;
143 } CM_KEY_HASH
, *PCM_KEY_HASH
;
146 // Key Hash Table Entry
148 typedef struct _CM_KEY_HASH_TABLE_ENTRY
153 } CM_KEY_HASH_TABLE_ENTRY
, *PCM_KEY_HASH_TABLE_ENTRY
;
158 typedef struct _CM_NAME_HASH
161 struct _CM_NAME_HASH
*NextHash
;
163 WCHAR Name
[ANYSIZE_ARRAY
];
164 } CM_NAME_HASH
, *PCM_NAME_HASH
;
167 // Name Hash Table Entry
169 typedef struct _CM_NAME_HASH_TABLE_ENTRY
173 } CM_NAME_HASH_TABLE_ENTRY
, *PCM_NAME_HASH_TABLE_ENTRY
;
176 // Key Security Cache
178 typedef struct _CM_KEY_SECURITY_CACHE
183 ULONG DescriptorLength
;
184 SECURITY_DESCRIPTOR_RELATIVE Descriptor
;
185 } CM_KEY_SECURITY_CACHE
, *PCM_KEY_SECURITY_CACHE
;
188 // Key Security Cache Entry
190 typedef struct _CM_KEY_SECURITY_CACHE_ENTRY
193 PCM_KEY_SECURITY_CACHE CachedSecurity
;
194 } CM_KEY_SECURITY_CACHE_ENTRY
, *PCM_KEY_SECURITY_CACHE_ENTRY
;
199 typedef struct _CACHED_CHILD_LIST
205 struct _CM_KEY_CONTROL_BLOCK
*RealKcb
;
207 } CACHED_CHILD_LIST
, *PCACHED_CHILD_LIST
;
212 typedef struct _CM_INDEX_HINT_BLOCK
215 ULONG HashKey
[ANYSIZE_ARRAY
];
216 } CM_INDEX_HINT_BLOCK
, *PCM_INDEX_HINT_BLOCK
;
221 typedef struct _CM_KEY_BODY
224 struct _CM_KEY_CONTROL_BLOCK
*KeyControlBlock
;
225 struct _CM_NOTIFY_BLOCK
*NotifyBlock
;
227 LIST_ENTRY KeyBodyList
;
228 } CM_KEY_BODY
, *PCM_KEY_BODY
;
231 // Name Control Block (NCB)
233 typedef struct _CM_NAME_CONTROL_BLOCK
239 CM_NAME_HASH NameHash
;
243 PCM_KEY_HASH NextHash
;
245 WCHAR Name
[ANYSIZE_ARRAY
];
248 } CM_NAME_CONTROL_BLOCK
, *PCM_NAME_CONTROL_BLOCK
;
251 // Key Control Block (KCB)
253 typedef struct _CM_KEY_CONTROL_BLOCK
260 ULONG PrivateAlloc
:1;
262 ULONG DelayedCloseIndex
:12;
263 ULONG TotalLevels
:10;
271 PCM_KEY_HASH NextHash
;
276 struct _CM_KEY_CONTROL_BLOCK
*ParentKcb
;
277 PCM_NAME_CONTROL_BLOCK NameBlock
;
278 PCM_KEY_SECURITY_CACHE CachedSecurity
;
279 CACHED_CHILD_LIST ValueCache
;
282 PCM_INDEX_HINT_BLOCK IndexHint
;
288 LIST_ENTRY KeyBodyListHead
;
289 LIST_ENTRY FreeListEntry
;
291 PCM_KEY_BODY KeyBodyArray
[4];
292 PVOID DelayCloseEntry
;
293 LARGE_INTEGER KcbLastWriteTime
;
294 USHORT KcbMaxNameLen
;
295 USHORT KcbMaxValueNameLen
;
296 ULONG KcbMaxValueDataLen
;
299 ULONG KcbUserFlags
: 4;
300 ULONG KcbVirtControlFlags
: 4;
305 } CM_KEY_CONTROL_BLOCK
, *PCM_KEY_CONTROL_BLOCK
;
310 typedef struct _CM_NOTIFY_BLOCK
314 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
315 PCM_KEY_BODY KeyBody
;
318 ULONG NotifyPending
:31;
319 } CM_NOTIFY_BLOCK
, *PCM_NOTIFY_BLOCK
;
324 typedef struct _CM_CELL_REMAP_BLOCK
328 } CM_CELL_REMAP_BLOCK
, *PCM_CELL_REMAP_BLOCK
;
333 typedef struct _CM_ALLOC_PAGE
338 } CM_ALLOC_PAGE
, *PCM_ALLOC_PAGE
;
341 // Allocation Page Entry
343 typedef struct _CM_DELAY_ALLOC
345 LIST_ENTRY ListEntry
;
346 PCM_KEY_CONTROL_BLOCK Kcb
;
347 } CM_DELAY_ALLOC
, *PCM_DELAY_ALLOC
;
350 // Delayed Close Entry
352 typedef struct _CM_DELAYED_CLOSE_ENTRY
354 LIST_ENTRY DelayedLRUList
;
355 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
356 } CM_DELAYED_CLOSE_ENTRY
, *PCM_DELAYED_CLOSE_ENTRY
;
359 // Delayed KCB Dereference Entry
361 typedef struct _CM_DELAY_DEREF_KCB_ITEM
363 LIST_ENTRY ListEntry
;
364 PCM_KEY_CONTROL_BLOCK Kcb
;
365 } CM_DELAY_DEREF_KCB_ITEM
, *PCM_DELAY_DEREF_KCB_ITEM
;
368 // Use Count Log and Entry
370 typedef struct _CM_USE_COUNT_LOG_ENTRY
374 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
376 typedef struct _CM_USE_COUNT_LOG
380 CM_USE_COUNT_LOG_ENTRY Log
[32];
381 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
384 // Configuration Manager Hive Structure
386 typedef struct _CMHIVE
389 HANDLE FileHandles
[HFILE_TYPE_MAX
];
390 LIST_ENTRY NotifyList
;
392 EX_PUSH_LOCK HiveLock
;
393 PKTHREAD HiveLockOwner
;
394 PKGUARDED_MUTEX ViewLock
;
395 PKTHREAD ViewLockOwner
;
396 EX_PUSH_LOCK WriterLock
;
397 PKTHREAD WriterLockOwner
;
398 PERESOURCE FlusherLock
;
399 EX_PUSH_LOCK SecurityLock
;
400 PKTHREAD HiveSecurityLockOwner
;
401 LIST_ENTRY LRUViewListHead
;
402 LIST_ENTRY PinViewListHead
;
403 PFILE_OBJECT FileObject
;
404 UNICODE_STRING FileFullPath
;
405 UNICODE_STRING FileUserName
;
410 ULONG SecurityCacheSize
;
411 LONG SecurityHitHint
;
412 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
413 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
415 PCM_KEY_CONTROL_BLOCK RootKcb
;
417 PWORK_QUEUE_ITEM UnloadWorkItem
;
418 BOOLEAN GrowOnlyMode
;
420 LIST_ENTRY KcbConvertListHead
;
421 LIST_ENTRY KnodeConvertListHead
;
422 PCM_CELL_REMAP_BLOCK CellRemapArray
;
423 CM_USE_COUNT_LOG UseCountLog
;
424 CM_USE_COUNT_LOG LockHiveLog
;
426 LIST_ENTRY TrustClassEntry
;
428 BOOLEAN HiveIsLoading
;
429 PKTHREAD CreatorOwner
;
433 // Cached Value Index
435 typedef struct _CM_CACHED_VALUE_INDEX
437 HCELL_INDEX CellIndex
;
441 ULONG_PTR List
[ANYSIZE_ARRAY
];
443 } CM_CACHED_VALUE_INDEX
, *PCM_CACHED_VALUE_INDEX
;
448 typedef struct _CM_CACHED_VALUE
450 USHORT DataCacheType
;
453 CM_KEY_VALUE KeyValue
;
454 } CM_CACHED_VALUE
, *PCM_CACHED_VALUE
;
459 typedef struct _HIVE_LIST_ENTRY
467 BOOLEAN ThreadFinished
;
468 BOOLEAN ThreadStarted
;
470 } HIVE_LIST_ENTRY
, *PHIVE_LIST_ENTRY
;
473 // Parse context for Key Object
475 typedef struct _CM_PARSE_CONTEXT
478 UNICODE_STRING Class
;
481 CM_KEY_REFERENCE ChildHive
;
482 HANDLE PredefinedHandle
;
484 BOOLEAN CreateOperation
;
485 PCMHIVE OriginatingPoint
;
486 } CM_PARSE_CONTEXT
, *PCM_PARSE_CONTEXT
;
489 // MultiFunction Adapter Recognizer Structure
491 typedef struct _CMP_MF_TYPE
494 USHORT InterfaceType
;
496 } CMP_MF_TYPE
, *PCMP_MF_TYPE
;
499 // System Control Vector
501 typedef struct _CM_SYSTEM_CONTROL_VECTOR
508 } CM_SYSTEM_CONTROL_VECTOR
, *PCM_SYSTEM_CONTROL_VECTOR
;
511 // Structure for CmpQueryValueDataFromCache
513 typedef struct _KEY_VALUE_INFORMATION
517 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation
;
518 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation
;
519 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation
;
520 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64
;
522 } KEY_VALUE_INFORMATION
, *PKEY_VALUE_INFORMATION
;
524 typedef struct _KEY_INFORMATION
528 KEY_BASIC_INFORMATION KeyBasicInformation
;
529 KEY_FULL_INFORMATION KeyFullInformation
;
530 KEY_NODE_INFORMATION KeyNodeInformation
;
532 } KEY_INFORMATION
, *PKEY_INFORMATION
;
534 ///////////////////////////////////////////////////////////////////////////////
536 // BUGBUG Old Hive Stuff for Temporary Support
538 NTSTATUS
CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1
, IN PVOID Argument2
);
539 ///////////////////////////////////////////////////////////////////////////////
542 // Mapped View Hive Functions
551 // Security Cache Functions
555 CmpInitSecurityCache(
560 // Value Cache Functions
562 VALUE_SEARCH_RETURN_TYPE
564 CmpFindValueByNameFromCache(
565 IN PCM_KEY_CONTROL_BLOCK Kcb
,
566 IN PCUNICODE_STRING Name
,
567 OUT PCM_CACHED_VALUE
**CachedValue
,
569 OUT PCM_KEY_VALUE
*Value
,
570 OUT BOOLEAN
*ValueIsCached
,
571 OUT PHCELL_INDEX CellToRelease
574 VALUE_SEARCH_RETURN_TYPE
576 CmpQueryKeyValueData(
577 IN PCM_KEY_CONTROL_BLOCK Kcb
,
578 IN PCM_CACHED_VALUE
*CachedValue
,
579 IN PCM_KEY_VALUE ValueKey
,
580 IN BOOLEAN ValueIsCached
,
581 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
582 IN PVOID KeyValueInformation
,
584 OUT PULONG ResultLength
,
588 VALUE_SEARCH_RETURN_TYPE
590 CmpGetValueListFromCache(
591 IN PCM_KEY_CONTROL_BLOCK Kcb
,
592 OUT PCELL_DATA
*CellData
,
593 OUT BOOLEAN
*IndexIsCached
,
594 OUT PHCELL_INDEX ValueListToRelease
597 VALUE_SEARCH_RETURN_TYPE
599 CmpGetValueKeyFromCache(
600 IN PCM_KEY_CONTROL_BLOCK Kcb
,
601 IN PCELL_DATA CellData
,
603 OUT PCM_CACHED_VALUE
**CachedValue
,
604 OUT PCM_KEY_VALUE
*Value
,
605 IN BOOLEAN IndexIsCached
,
606 OUT BOOLEAN
*ValueIsCached
,
607 OUT PHCELL_INDEX CellToRelease
610 VALUE_SEARCH_RETURN_TYPE
612 CmpCompareNewValueDataAgainstKCBCache(
613 IN PCM_KEY_CONTROL_BLOCK Kcb
,
614 IN PUNICODE_STRING ValueName
,
621 // Registry Validation Functions
631 // Hive List Routines
637 OUT PUNICODE_STRING HiveName
642 CmpAddToHiveFileList(
648 CmpRemoveFromHiveFileList(
657 CmpSetGlobalQuotaAllowed(
662 // Notification Routines
667 IN PCM_KEY_CONTROL_BLOCK Kcb
,
676 IN PCM_KEY_BODY KeyBody
,
687 // KCB Cache/Delay Routines
697 CmpInitCmPrivateDelayAlloc(
703 CmpInitCmPrivateAlloc(
709 CmpInitDelayDerefKCBEngine(
714 // Key Object Routines
719 IN PEPROCESS Process OPTIONAL
,
721 IN ACCESS_MASK GrantedAccess
,
722 IN ULONG ProcessHandleCount
,
723 IN ULONG SystemHandleCount
735 IN PVOID ParseObject
,
737 IN OUT PACCESS_STATE AccessState
,
738 IN KPROCESSOR_MODE AccessMode
,
740 IN OUT PUNICODE_STRING CompleteName
,
741 IN OUT PUNICODE_STRING RemainingName
,
742 IN OUT PVOID Context OPTIONAL
,
743 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
751 IN SECURITY_OPERATION_CODE OperationType
,
752 IN PSECURITY_INFORMATION SecurityInformation
,
753 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
754 IN OUT PULONG CapturedLength
,
755 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
756 IN POOL_TYPE PoolType
,
757 IN PGENERIC_MAPPING GenericMapping
764 IN BOOLEAN HasObjectName
,
765 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
767 OUT PULONG ReturnLength
,
768 IN KPROCESSOR_MODE AccessMode
781 IN PVOID HiveData OPTIONAL
,
785 IN PCUNICODE_STRING FileName OPTIONAL
,
797 CmpHiveRootSecurityDescriptor(
804 IN PUNICODE_STRING LinkName
,
805 IN HANDLE RootDirectory
,
808 IN PSECURITY_DESCRIPTOR SecurityDescriptor
814 IN PCUNICODE_STRING BaseName
,
815 IN PCWSTR Extension OPTIONAL
,
818 OUT PULONG PrimaryDisposition
,
819 OUT PULONG LogDisposition
,
820 IN BOOLEAN CreateAllowed
,
821 IN BOOLEAN MarkAsSystemHive
,
822 IN BOOLEAN NoBuffering
,
823 OUT PULONG ClusterSize OPTIONAL
829 IN PCUNICODE_STRING HiveName
,
838 CmpInitializeHiveList(
843 // Registry Utility Functions
847 CmpTestRegistryLockExclusive(
859 CmpLockRegistryExclusive(
877 CmpLockHiveFlusherExclusive(
883 CmpLockHiveFlusherShared(
889 CmpTestHiveFlusherLockExclusive(
895 CmpTestHiveFlusherLockShared(
901 CmpUnlockHiveFlusher(
910 CmpAllocateDelayItem(
922 CmpDelayDerefKeyControlBlock(
923 IN PCM_KEY_CONTROL_BLOCK Kcb
928 CmpAddToDelayedClose(
929 IN PCM_KEY_CONTROL_BLOCK Kcb
,
930 IN BOOLEAN LockHeldExclusively
935 CmpArmDelayedCloseTimer(
941 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb
);
945 CmpInitializeDelayedCloseTable(
952 PCM_KEY_CONTROL_BLOCK
954 CmpCreateKeyControlBlock(
956 IN HCELL_INDEX Index
,
957 IN PCM_KEY_NODE Node
,
958 IN PCM_KEY_CONTROL_BLOCK Parent
,
960 IN PUNICODE_STRING KeyName
963 PCM_KEY_CONTROL_BLOCK
965 CmpAllocateKeyControlBlock(
971 CmpFreeKeyControlBlock(
972 IN PCM_KEY_CONTROL_BLOCK Kcb
977 CmpRemoveKeyControlBlock(
978 IN PCM_KEY_CONTROL_BLOCK Kcb
983 CmpCleanUpKcbValueCache(
984 IN PCM_KEY_CONTROL_BLOCK Kcb
989 CmpCleanUpKcbCacheWithLock(
990 IN PCM_KEY_CONTROL_BLOCK Kcb
,
991 IN BOOLEAN LockHeldExclusively
996 CmpCleanUpSubKeyInfo(
997 IN PCM_KEY_CONTROL_BLOCK Kcb
1003 IN PCM_KEY_CONTROL_BLOCK Kcb
1008 CmpReferenceKeyControlBlock(
1009 IN PCM_KEY_CONTROL_BLOCK Kcb
1014 CmpDereferenceKeyControlBlockWithLock(
1015 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1016 IN BOOLEAN LockHeldExclusively
1021 CmpDereferenceKeyControlBlock(
1022 IN PCM_KEY_CONTROL_BLOCK Kcb
1027 EnlistKeyBodyWithKCB(
1028 IN PCM_KEY_BODY KeyObject
,
1034 DelistKeyBodyFromKCB(
1035 IN PCM_KEY_BODY KeyBody
,
1043 IN HCELL_INDEX Cell
,
1049 CmpAcquireTwoKcbLocksExclusiveByKey(
1056 CmpReleaseTwoKcbLockByKey(
1063 CmpFlushNotifiesOnKeyBodyList(
1064 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1073 CmpCompareCompressedName(
1074 IN PCUNICODE_STRING SearchName
,
1075 IN PWCHAR CompressedName
,
1083 IN PUNICODE_STRING Name
1088 CmpCompressedNameSize(
1095 CmpCopyCompressedName(
1096 IN PWCHAR Destination
,
1097 IN ULONG DestinationLength
,
1099 IN ULONG SourceLength
1106 IN PWCHAR Destination
,
1107 IN PUNICODE_STRING Source
1114 IN PCHILD_LIST ChildList
,
1115 IN PUNICODE_STRING Name
,
1116 IN PULONG ChildIndex
,
1117 IN PHCELL_INDEX CellIndex
1126 IN OUT PUNICODE_STRING RemainingName
,
1127 OUT PUNICODE_STRING NextName
,
1128 OUT PBOOLEAN LastName
1132 // Command Routines (Flush, Open, Close, Init);
1137 IN BOOLEAN ForceFlush
1149 IN BOOLEAN SetupBoot
1155 IN POBJECT_ATTRIBUTES FileAttributes
,
1156 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext
,
1157 IN OUT PBOOLEAN Allocate
,
1158 OUT PCMHIVE
*NewHive
,
1169 // Open/Create Routines
1175 IN HCELL_INDEX Cell
,
1176 IN PACCESS_STATE AccessState
,
1177 IN PUNICODE_STRING Name
,
1178 IN KPROCESSOR_MODE AccessMode
,
1179 IN PCM_PARSE_CONTEXT Context
,
1180 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1188 IN HCELL_INDEX Cell
,
1189 IN PACCESS_STATE AccessState
,
1190 IN UNICODE_STRING Name
,
1191 IN KPROCESSOR_MODE AccessMode
,
1192 IN ULONG CreateOptions
,
1193 IN PCM_PARSE_CONTEXT Context
,
1194 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1199 // Cell Index Routines
1204 CmpFindSubKeyByName(
1206 IN PCM_KEY_NODE Parent
,
1207 IN PCUNICODE_STRING SearchName
1212 CmpFindSubKeyByNumber(
1214 IN PCM_KEY_NODE Node
,
1222 IN PCUNICODE_STRING Name
,
1223 IN BOOLEAN AllowSeparators
1230 IN HCELL_INDEX Parent
,
1231 IN HCELL_INDEX Child
1238 IN HCELL_INDEX ParentKey
,
1239 IN HCELL_INDEX TargetKey
1246 HCELL_INDEX ParentKey
,
1247 HCELL_INDEX TargetKey
1251 // Cell Value Routines
1257 IN PCM_KEY_NODE KeyNode
,
1258 IN PUNICODE_STRING Name
1265 IN PCM_KEY_VALUE Value
,
1275 IN ULONG StorageType
,
1276 IN HCELL_INDEX ValueCell
,
1277 OUT PHCELL_INDEX DataCell
1284 IN HCELL_INDEX ValueCell
,
1287 IN OUT PCHILD_LIST ChildList
1299 CmpMarkValueDataDirty(
1301 IN PCM_KEY_VALUE Value
1308 IN HCELL_INDEX DataCell
,
1314 CmpRemoveValueFromList(
1317 IN OUT PCHILD_LIST ChildList
1324 IN PCM_KEY_VALUE Value
,
1327 OUT PBOOLEAN BufferAllocated
,
1328 OUT PHCELL_INDEX CellToRelease
1333 CmpCopyKeyValueList(
1334 IN PHHIVE SourceHive
,
1335 IN PCHILD_LIST SrcValueList
,
1336 IN PHHIVE DestinationHive
,
1337 IN OUT PCHILD_LIST DestValueList
,
1338 IN HSTORAGE_TYPE StorageType
1347 IN PHHIVE SystemHive
,
1348 IN HCELL_INDEX RootCell
,
1349 IN PUNICODE_STRING SelectKeyName
,
1350 OUT PBOOLEAN AutoSelect
1355 CmGetSystemControlValues(
1356 IN PVOID SystemHiveData
,
1357 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1362 // Hardware Configuration Routines
1366 CmpInitializeRegistryNode(
1367 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry
,
1368 IN HANDLE NodeHandle
,
1369 OUT PHANDLE NewHandle
,
1370 IN INTERFACE_TYPE InterfaceType
,
1372 IN PUSHORT DeviceIndexTable
1377 CmpInitializeMachineDependentConfiguration(
1378 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1383 CmpInitializeHardwareConfiguration(
1384 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1393 IN EVENT_TYPE EventType
,
1394 OUT PHANDLE EventHandle
,
1416 IN PHHIVE RegistryHive
,
1418 IN OUT PULONG FileOffset
,
1420 IN SIZE_T BufferLength
1426 IN PHHIVE RegistryHive
,
1428 IN OUT PULONG FileOffset
,
1430 IN SIZE_T BufferLength
1436 IN PHHIVE RegistryHive
,
1439 IN ULONG OldFileSize
1445 IN PHHIVE RegistryHive
,
1447 IN OUT PLARGE_INTEGER FileOffset
,
1452 // Configuration Manager side of Registry System Calls
1456 CmEnumerateValueKey(
1457 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1459 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1460 IN PVOID KeyValueInformation
,
1462 IN PULONG ResultLength
);
1467 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1468 IN PUNICODE_STRING ValueName
,
1475 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1476 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1477 IN PVOID KeyInformation
,
1479 IN PULONG ResultLength
1484 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1486 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1487 IN PVOID KeyInformation
,
1489 IN PULONG ResultLength
1495 IN PCM_KEY_BODY KeyBody
1501 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1502 IN BOOLEAN EclusiveLock
1508 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1509 IN UNICODE_STRING ValueName
1515 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1516 IN UNICODE_STRING ValueName
,
1517 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1518 IN PVOID KeyValueInformation
,
1520 IN PULONG ResultLength
1526 IN POBJECT_ATTRIBUTES TargetKey
,
1527 IN POBJECT_ATTRIBUTES SourceFile
,
1529 IN PCM_KEY_BODY KeyBody
1535 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1542 IN PCM_KEY_CONTROL_BLOCK RootKcb
,
1543 IN BOOLEAN RemoveEmptyCacheEntries
1549 IN PHHIVE SourceHive
,
1550 IN HCELL_INDEX SourceCell
,
1551 IN PHHIVE DestinationHive
,
1552 IN HSTORAGE_TYPE StorageType
1558 IN PHHIVE SourceHive
,
1559 IN HCELL_INDEX SrcKeyCell
,
1560 IN PHHIVE DestinationHive
,
1561 IN HSTORAGE_TYPE StorageType
,
1562 OUT PHCELL_INDEX DestKeyCell OPTIONAL
1568 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1569 IN HANDLE FileHandle
,
1574 // Startup and Shutdown
1590 CmSetLazyFlushState(
1601 // Driver List Routines
1605 CmGetSystemDriverList(
1613 IN HCELL_INDEX ControlSet
,
1614 IN SERVICE_LOAD_TYPE LoadType
,
1615 IN PWSTR BootFileSystem OPTIONAL
,
1616 IN PLIST_ENTRY DriverListHead
1624 IN HCELL_INDEX ControlSet
,
1625 IN PLIST_ENTRY DriverListHead
1630 CmpResolveDriverDependencies(
1631 IN PLIST_ENTRY DriverListHead
1638 IN HCELL_INDEX SafeBootCell
,
1639 IN HCELL_INDEX DriverCell
);
1642 // Global variables accessible from all of Cm
1644 extern ULONG CmpTraceLevel
;
1645 extern BOOLEAN CmpSpecialBootCondition
;
1646 extern BOOLEAN CmpFlushOnLockRelease
;
1647 extern BOOLEAN CmpShareSystemHives
;
1648 extern BOOLEAN CmpMiniNTBoot
;
1649 extern EX_PUSH_LOCK CmpHiveListHeadLock
, CmpLoadHiveLock
;
1650 extern LIST_ENTRY CmpHiveListHead
;
1651 extern POBJECT_TYPE CmpKeyObjectType
;
1652 extern ERESOURCE CmpRegistryLock
;
1653 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
;
1654 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
;
1655 extern KGUARDED_MUTEX CmpDelayedCloseTableLock
;
1656 extern CMHIVE CmControlHive
;
1657 extern WCHAR CmDefaultLanguageId
[];
1658 extern ULONG CmDefaultLanguageIdLength
;
1659 extern ULONG CmDefaultLanguageIdType
;
1660 extern WCHAR CmInstallUILanguageId
[];
1661 extern ULONG CmInstallUILanguageIdLength
;
1662 extern ULONG CmInstallUILanguageIdType
;
1663 extern ULONG CmNtGlobalFlag
;
1664 extern LANGID PsInstallUILanguageId
;
1665 extern LANGID PsDefaultUILanguageId
;
1666 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector
[];
1667 extern ULONG CmpConfigurationAreaSize
;
1668 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData
;
1669 extern UNICODE_STRING CmTypeName
[];
1670 extern UNICODE_STRING CmClassName
[];
1671 extern CMP_MF_TYPE CmpMultifunctionTypes
[];
1672 extern USHORT CmpUnknownBusCount
;
1673 extern ULONG CmpTypeCount
[MaximumType
+ 1];
1674 extern HIVE_LIST_ENTRY CmpMachineHiveList
[];
1675 extern UNICODE_STRING CmSymbolicLinkValueName
;
1676 extern UNICODE_STRING CmpSystemStartOptions
;
1677 extern UNICODE_STRING CmpLoadOptions
;
1678 extern BOOLEAN CmSelfHeal
;
1679 extern BOOLEAN CmpSelfHeal
;
1680 extern ULONG CmpBootType
;
1681 extern HANDLE CmpRegistryRootHandle
;
1682 extern BOOLEAN ExpInTextModeSetup
;
1683 extern BOOLEAN InitIsWinPEMode
;
1684 extern ULONG CmpHashTableSize
;
1685 extern ULONG CmpDelayedCloseSize
, CmpDelayedCloseIndex
;
1686 extern BOOLEAN CmpNoWrite
;
1687 extern BOOLEAN CmpForceForceFlush
;
1688 extern BOOLEAN CmpWasSetupBoot
;
1689 extern BOOLEAN CmpProfileLoaded
;
1690 extern PCMHIVE CmiVolatileHive
;
1691 extern LIST_ENTRY CmiKeyObjectListHead
;
1692 extern BOOLEAN CmpHoldLazyFlush
;
1695 // Inlined functions