2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/internal/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_BODY_TYPE 0x6B793032
71 #define CM_KEY_VALUE_SMALL 0x4
72 #define CM_KEY_VALUE_BIG 0x3FD8
73 #define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000
76 // Number of various lists and hashes
78 #define CMP_SECURITY_HASH_LISTS 64
79 #define CMP_MAX_CALLBACKS 100
84 #define CMP_HASH_IRRATIONAL 314159269
85 #define CMP_HASH_PRIME 1000000007
88 // CmpCreateKeyControlBlock Flags
90 #define CMP_CREATE_FAKE_KCB 0x1
91 #define CMP_LOCK_HASHES_FOR_KCB 0x2
94 // CmpDoCreate and CmpDoOpen flags
96 #define CMP_CREATE_KCB_KCB_LOCKED 0x2
97 #define CMP_OPEN_KCB_NO_CREATE 0x4
100 // EnlistKeyBodyWithKCB Flags
102 #define CMP_ENLIST_KCB_LOCKED_SHARED 0x1
103 #define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE 0x2
108 #define CMP_UNLOCK_KCB_LOCKED 0x1
109 #define CMP_UNLOCK_REGISTRY_LOCKED 0x2
112 // Maximum size of Value Cache
114 #define MAXIMUM_CACHED_DATA 2 * PAGE_SIZE
117 // Hives to load on startup
119 #define CM_NUMBER_OF_MACHINE_HIVES 6
122 // Number of items that can fit inside an Allocation Page
124 #define CM_KCBS_PER_PAGE \
125 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_KEY_CONTROL_BLOCK))
126 #define CM_DELAYS_PER_PAGE \
127 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_DELAY_ALLOC))
130 // Value Search Results
132 typedef enum _VALUE_SEARCH_RETURN_TYPE
135 SearchNeedExclusiveLock
,
137 } VALUE_SEARCH_RETURN_TYPE
;
142 typedef struct _CM_KEY_HASH
145 struct _CM_KEY_HASH
*NextHash
;
148 } CM_KEY_HASH
, *PCM_KEY_HASH
;
151 // Key Hash Table Entry
153 typedef struct _CM_KEY_HASH_TABLE_ENTRY
158 } CM_KEY_HASH_TABLE_ENTRY
, *PCM_KEY_HASH_TABLE_ENTRY
;
163 typedef struct _CM_NAME_HASH
166 struct _CM_NAME_HASH
*NextHash
;
168 WCHAR Name
[ANYSIZE_ARRAY
];
169 } CM_NAME_HASH
, *PCM_NAME_HASH
;
172 // Name Hash Table Entry
174 typedef struct _CM_NAME_HASH_TABLE_ENTRY
178 } CM_NAME_HASH_TABLE_ENTRY
, *PCM_NAME_HASH_TABLE_ENTRY
;
181 // Key Security Cache
183 typedef struct _CM_KEY_SECURITY_CACHE
188 ULONG DescriptorLength
;
189 SECURITY_DESCRIPTOR_RELATIVE Descriptor
;
190 } CM_KEY_SECURITY_CACHE
, *PCM_KEY_SECURITY_CACHE
;
193 // Key Security Cache Entry
195 typedef struct _CM_KEY_SECURITY_CACHE_ENTRY
198 PCM_KEY_SECURITY_CACHE CachedSecurity
;
199 } CM_KEY_SECURITY_CACHE_ENTRY
, *PCM_KEY_SECURITY_CACHE_ENTRY
;
204 typedef struct _CACHED_CHILD_LIST
210 struct _CM_KEY_CONTROL_BLOCK
*RealKcb
;
212 } CACHED_CHILD_LIST
, *PCACHED_CHILD_LIST
;
217 typedef struct _CM_INDEX_HINT_BLOCK
220 ULONG HashKey
[ANYSIZE_ARRAY
];
221 } CM_INDEX_HINT_BLOCK
, *PCM_INDEX_HINT_BLOCK
;
226 typedef struct _CM_KEY_BODY
229 struct _CM_KEY_CONTROL_BLOCK
*KeyControlBlock
;
230 struct _CM_NOTIFY_BLOCK
*NotifyBlock
;
232 LIST_ENTRY KeyBodyList
;
233 } CM_KEY_BODY
, *PCM_KEY_BODY
;
236 // Name Control Block (NCB)
238 typedef struct _CM_NAME_CONTROL_BLOCK
244 CM_NAME_HASH NameHash
;
248 PCM_KEY_HASH NextHash
;
250 WCHAR Name
[ANYSIZE_ARRAY
];
253 } CM_NAME_CONTROL_BLOCK
, *PCM_NAME_CONTROL_BLOCK
;
256 // Key Control Block (KCB)
258 typedef struct _CM_KEY_CONTROL_BLOCK
265 ULONG PrivateAlloc
:1;
267 ULONG DelayedCloseIndex
:12;
268 ULONG TotalLevels
:10;
276 PCM_KEY_HASH NextHash
;
281 struct _CM_KEY_CONTROL_BLOCK
*ParentKcb
;
282 PCM_NAME_CONTROL_BLOCK NameBlock
;
283 PCM_KEY_SECURITY_CACHE CachedSecurity
;
284 CACHED_CHILD_LIST ValueCache
;
287 PCM_INDEX_HINT_BLOCK IndexHint
;
293 LIST_ENTRY KeyBodyListHead
;
294 LIST_ENTRY FreeListEntry
;
296 PCM_KEY_BODY KeyBodyArray
[4];
297 PVOID DelayCloseEntry
;
298 LARGE_INTEGER KcbLastWriteTime
;
299 USHORT KcbMaxNameLen
;
300 USHORT KcbMaxValueNameLen
;
301 ULONG KcbMaxValueDataLen
;
304 ULONG KcbUserFlags
: 4;
305 ULONG KcbVirtControlFlags
: 4;
310 } CM_KEY_CONTROL_BLOCK
, *PCM_KEY_CONTROL_BLOCK
;
315 typedef struct _CM_NOTIFY_BLOCK
319 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
320 PCM_KEY_BODY KeyBody
;
323 ULONG NotifyPending
:31;
324 } CM_NOTIFY_BLOCK
, *PCM_NOTIFY_BLOCK
;
329 typedef struct _CM_CELL_REMAP_BLOCK
333 } CM_CELL_REMAP_BLOCK
, *PCM_CELL_REMAP_BLOCK
;
338 typedef struct _CM_ALLOC_PAGE
343 } CM_ALLOC_PAGE
, *PCM_ALLOC_PAGE
;
346 // Allocation Page Entry
348 typedef struct _CM_DELAY_ALLOC
350 LIST_ENTRY ListEntry
;
351 PCM_KEY_CONTROL_BLOCK Kcb
;
352 } CM_DELAY_ALLOC
, *PCM_DELAY_ALLOC
;
355 // Delayed Close Entry
357 typedef struct _CM_DELAYED_CLOSE_ENTRY
359 LIST_ENTRY DelayedLRUList
;
360 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
361 } CM_DELAYED_CLOSE_ENTRY
, *PCM_DELAYED_CLOSE_ENTRY
;
364 // Delayed KCB Dereference Entry
366 typedef struct _CM_DELAY_DEREF_KCB_ITEM
368 LIST_ENTRY ListEntry
;
369 PCM_KEY_CONTROL_BLOCK Kcb
;
370 } CM_DELAY_DEREF_KCB_ITEM
, *PCM_DELAY_DEREF_KCB_ITEM
;
373 // Use Count Log and Entry
375 typedef struct _CM_USE_COUNT_LOG_ENTRY
379 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
381 typedef struct _CM_USE_COUNT_LOG
385 CM_USE_COUNT_LOG_ENTRY Log
[32];
386 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
389 // Configuration Manager Hive Structure
391 typedef struct _CMHIVE
394 HANDLE FileHandles
[HFILE_TYPE_MAX
];
395 LIST_ENTRY NotifyList
;
397 EX_PUSH_LOCK HiveLock
;
398 PKTHREAD HiveLockOwner
;
399 PKGUARDED_MUTEX ViewLock
;
400 PKTHREAD ViewLockOwner
;
401 EX_PUSH_LOCK WriterLock
;
402 PKTHREAD WriterLockOwner
;
403 PERESOURCE FlusherLock
;
404 EX_PUSH_LOCK SecurityLock
;
405 PKTHREAD HiveSecurityLockOwner
;
406 LIST_ENTRY LRUViewListHead
;
407 LIST_ENTRY PinViewListHead
;
408 PFILE_OBJECT FileObject
;
409 UNICODE_STRING FileFullPath
;
410 UNICODE_STRING FileUserName
;
415 ULONG SecurityCacheSize
;
416 LONG SecurityHitHint
;
417 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
418 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
420 PCM_KEY_CONTROL_BLOCK RootKcb
;
422 PWORK_QUEUE_ITEM UnloadWorkItem
;
423 BOOLEAN GrowOnlyMode
;
425 LIST_ENTRY KcbConvertListHead
;
426 LIST_ENTRY KnodeConvertListHead
;
427 PCM_CELL_REMAP_BLOCK CellRemapArray
;
428 CM_USE_COUNT_LOG UseCountLog
;
429 CM_USE_COUNT_LOG LockHiveLog
;
431 LIST_ENTRY TrustClassEntry
;
433 BOOLEAN HiveIsLoading
;
434 PKTHREAD CreatorOwner
;
438 // Cached Value Index
440 typedef struct _CM_CACHED_VALUE_INDEX
442 HCELL_INDEX CellIndex
;
446 ULONG_PTR List
[ANYSIZE_ARRAY
];
448 } CM_CACHED_VALUE_INDEX
, *PCM_CACHED_VALUE_INDEX
;
453 typedef struct _CM_CACHED_VALUE
455 USHORT DataCacheType
;
458 CM_KEY_VALUE KeyValue
;
459 } CM_CACHED_VALUE
, *PCM_CACHED_VALUE
;
464 typedef struct _HIVE_LIST_ENTRY
472 BOOLEAN ThreadFinished
;
473 BOOLEAN ThreadStarted
;
475 } HIVE_LIST_ENTRY
, *PHIVE_LIST_ENTRY
;
478 // Parse context for Key Object
480 typedef struct _CM_PARSE_CONTEXT
483 UNICODE_STRING Class
;
486 CM_KEY_REFERENCE ChildHive
;
487 HANDLE PredefinedHandle
;
489 BOOLEAN CreateOperation
;
490 PCMHIVE OriginatingPoint
;
491 } CM_PARSE_CONTEXT
, *PCM_PARSE_CONTEXT
;
494 // MultiFunction Adapter Recognizer Structure
496 typedef struct _CMP_MF_TYPE
499 USHORT InterfaceType
;
501 } CMP_MF_TYPE
, *PCMP_MF_TYPE
;
504 // System Control Vector
506 typedef struct _CM_SYSTEM_CONTROL_VECTOR
513 } CM_SYSTEM_CONTROL_VECTOR
, *PCM_SYSTEM_CONTROL_VECTOR
;
516 // Structure for CmpQueryValueDataFromCache
518 typedef struct _KEY_VALUE_INFORMATION
522 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation
;
523 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation
;
524 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation
;
525 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64
;
527 } KEY_VALUE_INFORMATION
, *PKEY_VALUE_INFORMATION
;
529 typedef struct _KEY_INFORMATION
533 KEY_BASIC_INFORMATION KeyBasicInformation
;
534 KEY_FULL_INFORMATION KeyFullInformation
;
535 KEY_NODE_INFORMATION KeyNodeInformation
;
537 } KEY_INFORMATION
, *PKEY_INFORMATION
;
539 ///////////////////////////////////////////////////////////////////////////////
541 // BUGBUG Old Hive Stuff for Temporary Support
543 NTSTATUS
CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1
, IN PVOID Argument2
);
544 ///////////////////////////////////////////////////////////////////////////////
547 // Mapped View Hive Functions
557 CmpDestroyHiveViewList(
562 // Security Cache Functions
566 CmpInitSecurityCache(
572 CmpDestroySecurityCache(
577 // Value Cache Functions
579 VALUE_SEARCH_RETURN_TYPE
581 CmpFindValueByNameFromCache(
582 IN PCM_KEY_CONTROL_BLOCK Kcb
,
583 IN PCUNICODE_STRING Name
,
584 OUT PCM_CACHED_VALUE
**CachedValue
,
586 OUT PCM_KEY_VALUE
*Value
,
587 OUT BOOLEAN
*ValueIsCached
,
588 OUT PHCELL_INDEX CellToRelease
591 VALUE_SEARCH_RETURN_TYPE
593 CmpQueryKeyValueData(
594 IN PCM_KEY_CONTROL_BLOCK Kcb
,
595 IN PCM_CACHED_VALUE
*CachedValue
,
596 IN PCM_KEY_VALUE ValueKey
,
597 IN BOOLEAN ValueIsCached
,
598 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
599 IN PVOID KeyValueInformation
,
601 OUT PULONG ResultLength
,
605 VALUE_SEARCH_RETURN_TYPE
607 CmpGetValueListFromCache(
608 IN PCM_KEY_CONTROL_BLOCK Kcb
,
609 OUT PCELL_DATA
*CellData
,
610 OUT BOOLEAN
*IndexIsCached
,
611 OUT PHCELL_INDEX ValueListToRelease
614 VALUE_SEARCH_RETURN_TYPE
616 CmpGetValueKeyFromCache(
617 IN PCM_KEY_CONTROL_BLOCK Kcb
,
618 IN PCELL_DATA CellData
,
620 OUT PCM_CACHED_VALUE
**CachedValue
,
621 OUT PCM_KEY_VALUE
*Value
,
622 IN BOOLEAN IndexIsCached
,
623 OUT BOOLEAN
*ValueIsCached
,
624 OUT PHCELL_INDEX CellToRelease
627 VALUE_SEARCH_RETURN_TYPE
629 CmpCompareNewValueDataAgainstKCBCache(
630 IN PCM_KEY_CONTROL_BLOCK Kcb
,
631 IN PUNICODE_STRING ValueName
,
638 // Registry Validation Functions
648 // Hive List Routines
654 OUT PUNICODE_STRING HiveName
659 CmpAddToHiveFileList(
665 CmpRemoveFromHiveFileList(
674 CmpSetGlobalQuotaAllowed(
679 // Notification Routines
684 IN PCM_KEY_CONTROL_BLOCK Kcb
,
693 IN PCM_KEY_BODY KeyBody
,
704 // KCB Cache/Delay Routines
714 CmpInitCmPrivateDelayAlloc(
720 CmpInitCmPrivateAlloc(
726 CmpInitDelayDerefKCBEngine(
731 // Key Object Routines
736 IN PEPROCESS Process OPTIONAL
,
738 IN ACCESS_MASK GrantedAccess
,
739 IN ULONG ProcessHandleCount
,
740 IN ULONG SystemHandleCount
752 IN PVOID ParseObject
,
754 IN OUT PACCESS_STATE AccessState
,
755 IN KPROCESSOR_MODE AccessMode
,
757 IN OUT PUNICODE_STRING CompleteName
,
758 IN OUT PUNICODE_STRING RemainingName
,
759 IN OUT PVOID Context OPTIONAL
,
760 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
768 IN SECURITY_OPERATION_CODE OperationType
,
769 IN PSECURITY_INFORMATION SecurityInformation
,
770 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
771 IN OUT PULONG CapturedLength
,
772 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
773 IN POOL_TYPE PoolType
,
774 IN PGENERIC_MAPPING GenericMapping
781 IN BOOLEAN HasObjectName
,
782 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
784 OUT PULONG ReturnLength
,
785 IN KPROCESSOR_MODE AccessMode
798 IN PVOID HiveData OPTIONAL
,
802 IN PCUNICODE_STRING FileName OPTIONAL
,
814 CmpHiveRootSecurityDescriptor(
821 IN PUNICODE_STRING LinkName
,
822 IN HANDLE RootDirectory
,
825 IN PSECURITY_DESCRIPTOR SecurityDescriptor
831 IN PCUNICODE_STRING BaseName
,
832 IN PCWSTR Extension OPTIONAL
,
835 OUT PULONG PrimaryDisposition
,
836 OUT PULONG LogDisposition
,
837 IN BOOLEAN CreateAllowed
,
838 IN BOOLEAN MarkAsSystemHive
,
839 IN BOOLEAN NoBuffering
,
840 OUT PULONG ClusterSize OPTIONAL
852 IN PCUNICODE_STRING HiveName
,
861 CmpInitializeHiveList(
866 // Registry Utility Functions
870 CmpTestRegistryLockExclusive(
882 CmpLockRegistryExclusive(
900 CmpLockHiveFlusherExclusive(
906 CmpLockHiveFlusherShared(
912 CmpTestHiveFlusherLockExclusive(
918 CmpTestHiveFlusherLockShared(
924 CmpUnlockHiveFlusher(
933 CmpAllocateDelayItem(
945 CmpDelayDerefKeyControlBlock(
946 IN PCM_KEY_CONTROL_BLOCK Kcb
951 CmpAddToDelayedClose(
952 IN PCM_KEY_CONTROL_BLOCK Kcb
,
953 IN BOOLEAN LockHeldExclusively
958 CmpArmDelayedCloseTimer(
964 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb
);
968 CmpInitializeDelayedCloseTable(
975 PCM_KEY_CONTROL_BLOCK
977 CmpCreateKeyControlBlock(
979 IN HCELL_INDEX Index
,
980 IN PCM_KEY_NODE Node
,
981 IN PCM_KEY_CONTROL_BLOCK Parent
,
983 IN PUNICODE_STRING KeyName
986 PCM_KEY_CONTROL_BLOCK
988 CmpAllocateKeyControlBlock(
994 CmpFreeKeyControlBlock(
995 IN PCM_KEY_CONTROL_BLOCK Kcb
1000 CmpRemoveKeyControlBlock(
1001 IN PCM_KEY_CONTROL_BLOCK Kcb
1006 CmpCleanUpKcbValueCache(
1007 IN PCM_KEY_CONTROL_BLOCK Kcb
1012 CmpCleanUpKcbCacheWithLock(
1013 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1014 IN BOOLEAN LockHeldExclusively
1019 CmpCleanUpSubKeyInfo(
1020 IN PCM_KEY_CONTROL_BLOCK Kcb
1026 IN PCM_KEY_CONTROL_BLOCK Kcb
1031 CmpReferenceKeyControlBlock(
1032 IN PCM_KEY_CONTROL_BLOCK Kcb
1037 CmpDereferenceKeyControlBlockWithLock(
1038 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1039 IN BOOLEAN LockHeldExclusively
1044 CmpDereferenceKeyControlBlock(
1045 IN PCM_KEY_CONTROL_BLOCK Kcb
1050 EnlistKeyBodyWithKCB(
1051 IN PCM_KEY_BODY KeyObject
,
1057 DelistKeyBodyFromKCB(
1058 IN PCM_KEY_BODY KeyBody
,
1066 IN HCELL_INDEX Cell
,
1072 CmpAcquireTwoKcbLocksExclusiveByKey(
1079 CmpReleaseTwoKcbLockByKey(
1086 CmpFlushNotifiesOnKeyBodyList(
1087 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1096 CmpCompareCompressedName(
1097 IN PCUNICODE_STRING SearchName
,
1098 IN PWCHAR CompressedName
,
1106 IN PUNICODE_STRING Name
1111 CmpCompressedNameSize(
1118 CmpCopyCompressedName(
1119 IN PWCHAR Destination
,
1120 IN ULONG DestinationLength
,
1122 IN ULONG SourceLength
1129 IN PWCHAR Destination
,
1130 IN PUNICODE_STRING Source
1137 IN PCHILD_LIST ChildList
,
1138 IN PUNICODE_STRING Name
,
1139 IN PULONG ChildIndex
,
1140 IN PHCELL_INDEX CellIndex
1149 IN OUT PUNICODE_STRING RemainingName
,
1150 OUT PUNICODE_STRING NextName
,
1151 OUT PBOOLEAN LastName
1155 // Command Routines (Flush, Open, Close, Init);
1160 IN BOOLEAN ForceFlush
1172 IN BOOLEAN SetupBoot
1178 IN POBJECT_ATTRIBUTES FileAttributes
,
1179 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext
,
1180 IN OUT PBOOLEAN Allocate
,
1181 OUT PCMHIVE
*NewHive
,
1192 // Open/Create Routines
1198 IN HCELL_INDEX Cell
,
1199 IN PACCESS_STATE AccessState
,
1200 IN PUNICODE_STRING Name
,
1201 IN KPROCESSOR_MODE AccessMode
,
1202 IN PCM_PARSE_CONTEXT Context
,
1203 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1211 IN HCELL_INDEX Cell
,
1212 IN PACCESS_STATE AccessState
,
1213 IN UNICODE_STRING Name
,
1214 IN KPROCESSOR_MODE AccessMode
,
1215 IN ULONG CreateOptions
,
1216 IN PCM_PARSE_CONTEXT Context
,
1217 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1222 // Cell Index Routines
1227 CmpFindSubKeyByName(
1229 IN PCM_KEY_NODE Parent
,
1230 IN PCUNICODE_STRING SearchName
1235 CmpFindSubKeyByNumber(
1237 IN PCM_KEY_NODE Node
,
1245 IN PCUNICODE_STRING Name
,
1246 IN BOOLEAN AllowSeparators
1253 IN HCELL_INDEX Parent
,
1254 IN HCELL_INDEX Child
1261 IN HCELL_INDEX ParentKey
,
1262 IN HCELL_INDEX TargetKey
1269 HCELL_INDEX ParentKey
,
1270 HCELL_INDEX TargetKey
1274 // Cell Value Routines
1280 IN PCM_KEY_NODE KeyNode
,
1281 IN PUNICODE_STRING Name
1288 IN PCM_KEY_VALUE Value
,
1298 IN ULONG StorageType
,
1299 IN HCELL_INDEX ValueCell
,
1300 OUT PHCELL_INDEX DataCell
1307 IN HCELL_INDEX ValueCell
,
1310 IN OUT PCHILD_LIST ChildList
1322 CmpMarkValueDataDirty(
1324 IN PCM_KEY_VALUE Value
1331 IN HCELL_INDEX DataCell
,
1337 CmpRemoveValueFromList(
1340 IN OUT PCHILD_LIST ChildList
1347 IN PCM_KEY_VALUE Value
,
1350 OUT PBOOLEAN BufferAllocated
,
1351 OUT PHCELL_INDEX CellToRelease
1356 CmpCopyKeyValueList(
1357 IN PHHIVE SourceHive
,
1358 IN PCHILD_LIST SrcValueList
,
1359 IN PHHIVE DestinationHive
,
1360 IN OUT PCHILD_LIST DestValueList
,
1361 IN HSTORAGE_TYPE StorageType
1370 IN PHHIVE SystemHive
,
1371 IN HCELL_INDEX RootCell
,
1372 IN PUNICODE_STRING SelectKeyName
,
1373 OUT PBOOLEAN AutoSelect
1378 CmGetSystemControlValues(
1379 IN PVOID SystemHiveData
,
1380 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1385 // Hardware Configuration Routines
1389 CmpInitializeRegistryNode(
1390 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry
,
1391 IN HANDLE NodeHandle
,
1392 OUT PHANDLE NewHandle
,
1393 IN INTERFACE_TYPE InterfaceType
,
1395 IN PUSHORT DeviceIndexTable
1400 CmpInitializeMachineDependentConfiguration(
1401 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1406 CmpInitializeHardwareConfiguration(
1407 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1416 IN EVENT_TYPE EventType
,
1417 OUT PHANDLE EventHandle
,
1439 IN PHHIVE RegistryHive
,
1441 IN OUT PULONG FileOffset
,
1443 IN SIZE_T BufferLength
1449 IN PHHIVE RegistryHive
,
1451 IN OUT PULONG FileOffset
,
1453 IN SIZE_T BufferLength
1459 IN PHHIVE RegistryHive
,
1462 IN ULONG OldFileSize
1468 IN PHHIVE RegistryHive
,
1470 IN OUT PLARGE_INTEGER FileOffset
,
1475 // Configuration Manager side of Registry System Calls
1479 CmEnumerateValueKey(
1480 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1482 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1483 IN PVOID KeyValueInformation
,
1485 IN PULONG ResultLength
);
1490 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1491 IN PUNICODE_STRING ValueName
,
1498 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1499 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1500 IN PVOID KeyInformation
,
1502 IN PULONG ResultLength
1507 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1509 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1510 IN PVOID KeyInformation
,
1512 IN PULONG ResultLength
1518 IN PCM_KEY_BODY KeyBody
1524 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1525 IN BOOLEAN EclusiveLock
1531 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1532 IN UNICODE_STRING ValueName
1538 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1539 IN UNICODE_STRING ValueName
,
1540 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1541 IN PVOID KeyValueInformation
,
1543 IN PULONG ResultLength
1549 IN POBJECT_ATTRIBUTES TargetKey
,
1550 IN POBJECT_ATTRIBUTES SourceFile
,
1552 IN PCM_KEY_BODY KeyBody
1558 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1565 IN PCM_KEY_CONTROL_BLOCK RootKcb
,
1566 IN BOOLEAN RemoveEmptyCacheEntries
1572 IN PHHIVE SourceHive
,
1573 IN HCELL_INDEX SourceCell
,
1574 IN PHHIVE DestinationHive
,
1575 IN HSTORAGE_TYPE StorageType
1581 IN PHHIVE SourceHive
,
1582 IN HCELL_INDEX SrcKeyCell
,
1583 IN PHHIVE DestinationHive
,
1584 IN HSTORAGE_TYPE StorageType
,
1585 OUT PHCELL_INDEX DestKeyCell OPTIONAL
1591 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1592 IN HANDLE FileHandle
,
1599 IN PCM_KEY_CONTROL_BLOCK HighKcb
,
1600 IN PCM_KEY_CONTROL_BLOCK LowKcb
,
1601 IN HANDLE FileHandle
1605 // Startup and Shutdown
1621 CmSetLazyFlushState(
1632 // Driver List Routines
1636 CmGetSystemDriverList(
1644 IN HCELL_INDEX ControlSet
,
1645 IN SERVICE_LOAD_TYPE LoadType
,
1646 IN PWSTR BootFileSystem OPTIONAL
,
1647 IN PLIST_ENTRY DriverListHead
1655 IN HCELL_INDEX ControlSet
,
1656 IN PLIST_ENTRY DriverListHead
1661 CmpResolveDriverDependencies(
1662 IN PLIST_ENTRY DriverListHead
1669 IN HCELL_INDEX SafeBootCell
,
1670 IN HCELL_INDEX DriverCell
);
1673 // Global variables accessible from all of Cm
1675 extern ULONG CmpTraceLevel
;
1676 extern BOOLEAN CmpSpecialBootCondition
;
1677 extern BOOLEAN CmpFlushOnLockRelease
;
1678 extern BOOLEAN CmpShareSystemHives
;
1679 extern BOOLEAN CmpMiniNTBoot
;
1680 extern BOOLEAN CmpNoVolatileCreates
;
1681 extern EX_PUSH_LOCK CmpHiveListHeadLock
, CmpLoadHiveLock
;
1682 extern LIST_ENTRY CmpHiveListHead
;
1683 extern POBJECT_TYPE CmpKeyObjectType
;
1684 extern ERESOURCE CmpRegistryLock
;
1685 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
;
1686 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
;
1687 extern KGUARDED_MUTEX CmpDelayedCloseTableLock
;
1688 extern CMHIVE CmControlHive
;
1689 extern WCHAR CmDefaultLanguageId
[];
1690 extern ULONG CmDefaultLanguageIdLength
;
1691 extern ULONG CmDefaultLanguageIdType
;
1692 extern WCHAR CmInstallUILanguageId
[];
1693 extern ULONG CmInstallUILanguageIdLength
;
1694 extern ULONG CmInstallUILanguageIdType
;
1695 extern ULONG CmNtGlobalFlag
;
1696 extern LANGID PsInstallUILanguageId
;
1697 extern LANGID PsDefaultUILanguageId
;
1698 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector
[];
1699 extern ULONG CmpConfigurationAreaSize
;
1700 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData
;
1701 extern UNICODE_STRING CmTypeName
[];
1702 extern UNICODE_STRING CmClassName
[];
1703 extern CMP_MF_TYPE CmpMultifunctionTypes
[];
1704 extern USHORT CmpUnknownBusCount
;
1705 extern ULONG CmpTypeCount
[MaximumType
+ 1];
1706 extern HIVE_LIST_ENTRY CmpMachineHiveList
[];
1707 extern UNICODE_STRING CmSymbolicLinkValueName
;
1708 extern UNICODE_STRING CmpSystemStartOptions
;
1709 extern UNICODE_STRING CmpLoadOptions
;
1710 extern BOOLEAN CmSelfHeal
;
1711 extern BOOLEAN CmpSelfHeal
;
1712 extern ULONG CmpBootType
;
1713 extern HANDLE CmpRegistryRootHandle
;
1714 extern BOOLEAN ExpInTextModeSetup
;
1715 extern BOOLEAN InitIsWinPEMode
;
1716 extern ULONG CmpHashTableSize
;
1717 extern ULONG CmpDelayedCloseSize
, CmpDelayedCloseIndex
;
1718 extern BOOLEAN CmpNoWrite
;
1719 extern BOOLEAN CmpForceForceFlush
;
1720 extern BOOLEAN CmpWasSetupBoot
;
1721 extern BOOLEAN CmpProfileLoaded
;
1722 extern PCMHIVE CmiVolatileHive
;
1723 extern LIST_ENTRY CmiKeyObjectListHead
;
1724 extern BOOLEAN CmpHoldLazyFlush
;
1727 // Inlined functions