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)
10 #include <cmreslist.h>
13 // Define this if you want debugging support
15 #define _CM_DEBUG_ 0x00
18 // These define the Debug Masks Supported
20 #define CM_HANDLE_DEBUG 0x01
21 #define CM_NAMESPACE_DEBUG 0x02
22 #define CM_SECURITY_DEBUG 0x04
23 #define CM_REFERENCE_DEBUG 0x08
24 #define CM_CALLBACK_DEBUG 0x10
27 // Debug/Tracing support
30 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
31 #define CMTRACE DbgPrintEx
33 #define CMTRACE(x, ...) \
34 if (x & CmpTraceLevel) DbgPrint(__VA_ARGS__)
37 #define CMTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
41 // Hack since bigkeys are not yet supported
43 #define ASSERT_VALUE_BIG(h, s) \
44 ASSERTMSG("Big keys not supported!\n", !CmpIsKeyValueBig(h, s));
47 // CM_KEY_CONTROL_BLOCK Signatures
49 #define CM_KCB_SIGNATURE 'bKmC'
50 #define CM_KCB_INVALID_SIGNATURE '4FmC'
53 // CM_KEY_CONTROL_BLOCK ExtFlags
55 #define CM_KCB_NO_SUBKEY 0x01
56 #define CM_KCB_SUBKEY_ONE 0x02
57 #define CM_KCB_SUBKEY_HINT 0x04
58 #define CM_KCB_SYM_LINK_FOUND 0x08
59 #define CM_KCB_KEY_NON_EXIST 0x10
60 #define CM_KCB_NO_DELAY_CLOSE 0x20
61 #define CM_KCB_INVALID_CACHED_INFO 0x40
62 #define CM_KCB_READ_ONLY_KEY 0x80
67 #define CM_KEY_BODY_TYPE 0x6B793032
72 #define CM_KEY_VALUE_SMALL 0x4
73 #define CM_KEY_VALUE_BIG 0x3FD8
74 #define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000
77 // Number of various lists and hashes
79 #define CMP_SECURITY_HASH_LISTS 64
80 #define CMP_MAX_CALLBACKS 100
85 #define CMP_HASH_IRRATIONAL 314159269
86 #define CMP_HASH_PRIME 1000000007
89 // CmpCreateKeyControlBlock Flags
91 #define CMP_CREATE_FAKE_KCB 0x1
92 #define CMP_LOCK_HASHES_FOR_KCB 0x2
95 // CmpDoCreate and CmpDoOpen flags
97 #define CMP_CREATE_KCB_KCB_LOCKED 0x2
98 #define CMP_OPEN_KCB_NO_CREATE 0x4
101 // EnlistKeyBodyWithKCB Flags
103 #define CMP_ENLIST_KCB_LOCKED_SHARED 0x1
104 #define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE 0x2
109 #define CMP_UNLOCK_KCB_LOCKED 0x1
110 #define CMP_UNLOCK_REGISTRY_LOCKED 0x2
113 // Maximum size of Value Cache
115 #define MAXIMUM_CACHED_DATA 2 * PAGE_SIZE
118 // Hives to load on startup
120 #define CM_NUMBER_OF_MACHINE_HIVES 6
123 // Number of items that can fit inside an Allocation Page
125 #define CM_KCBS_PER_PAGE \
126 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_KEY_CONTROL_BLOCK))
127 #define CM_DELAYS_PER_PAGE \
128 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_DELAY_ALLOC))
131 // Value Search Results
133 typedef enum _VALUE_SEARCH_RETURN_TYPE
136 SearchNeedExclusiveLock
,
138 } VALUE_SEARCH_RETURN_TYPE
;
143 typedef struct _CM_KEY_HASH
146 struct _CM_KEY_HASH
*NextHash
;
149 } CM_KEY_HASH
, *PCM_KEY_HASH
;
152 // Key Hash Table Entry
154 typedef struct _CM_KEY_HASH_TABLE_ENTRY
159 } CM_KEY_HASH_TABLE_ENTRY
, *PCM_KEY_HASH_TABLE_ENTRY
;
164 typedef struct _CM_NAME_HASH
167 struct _CM_NAME_HASH
*NextHash
;
169 WCHAR Name
[ANYSIZE_ARRAY
];
170 } CM_NAME_HASH
, *PCM_NAME_HASH
;
173 // Name Hash Table Entry
175 typedef struct _CM_NAME_HASH_TABLE_ENTRY
179 } CM_NAME_HASH_TABLE_ENTRY
, *PCM_NAME_HASH_TABLE_ENTRY
;
182 // Key Security Cache
184 typedef struct _CM_KEY_SECURITY_CACHE
189 ULONG DescriptorLength
;
190 SECURITY_DESCRIPTOR_RELATIVE Descriptor
;
191 } CM_KEY_SECURITY_CACHE
, *PCM_KEY_SECURITY_CACHE
;
194 // Key Security Cache Entry
196 typedef struct _CM_KEY_SECURITY_CACHE_ENTRY
199 PCM_KEY_SECURITY_CACHE CachedSecurity
;
200 } CM_KEY_SECURITY_CACHE_ENTRY
, *PCM_KEY_SECURITY_CACHE_ENTRY
;
205 typedef struct _CACHED_CHILD_LIST
211 struct _CM_KEY_CONTROL_BLOCK
*RealKcb
;
213 } CACHED_CHILD_LIST
, *PCACHED_CHILD_LIST
;
218 typedef struct _CM_INDEX_HINT_BLOCK
221 ULONG HashKey
[ANYSIZE_ARRAY
];
222 } CM_INDEX_HINT_BLOCK
, *PCM_INDEX_HINT_BLOCK
;
227 typedef struct _CM_KEY_BODY
230 struct _CM_KEY_CONTROL_BLOCK
*KeyControlBlock
;
231 struct _CM_NOTIFY_BLOCK
*NotifyBlock
;
233 LIST_ENTRY KeyBodyList
;
234 } CM_KEY_BODY
, *PCM_KEY_BODY
;
237 // Name Control Block (NCB)
239 typedef struct _CM_NAME_CONTROL_BLOCK
245 CM_NAME_HASH NameHash
;
249 PCM_KEY_HASH NextHash
;
251 WCHAR Name
[ANYSIZE_ARRAY
];
254 } CM_NAME_CONTROL_BLOCK
, *PCM_NAME_CONTROL_BLOCK
;
257 // Key Control Block (KCB)
259 typedef struct _CM_KEY_CONTROL_BLOCK
266 ULONG PrivateAlloc
:1;
268 ULONG DelayedCloseIndex
:12;
269 ULONG TotalLevels
:10;
277 PCM_KEY_HASH NextHash
;
282 struct _CM_KEY_CONTROL_BLOCK
*ParentKcb
;
283 PCM_NAME_CONTROL_BLOCK NameBlock
;
284 PCM_KEY_SECURITY_CACHE CachedSecurity
;
285 CACHED_CHILD_LIST ValueCache
;
288 PCM_INDEX_HINT_BLOCK IndexHint
;
294 LIST_ENTRY KeyBodyListHead
;
295 LIST_ENTRY FreeListEntry
;
297 PCM_KEY_BODY KeyBodyArray
[4];
298 PVOID DelayCloseEntry
;
299 LARGE_INTEGER KcbLastWriteTime
;
300 USHORT KcbMaxNameLen
;
301 USHORT KcbMaxValueNameLen
;
302 ULONG KcbMaxValueDataLen
;
305 ULONG KcbUserFlags
: 4;
306 ULONG KcbVirtControlFlags
: 4;
311 } CM_KEY_CONTROL_BLOCK
, *PCM_KEY_CONTROL_BLOCK
;
316 typedef struct _CM_NOTIFY_BLOCK
320 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
321 PCM_KEY_BODY KeyBody
;
324 ULONG NotifyPending
:31;
325 } CM_NOTIFY_BLOCK
, *PCM_NOTIFY_BLOCK
;
330 typedef struct _CM_CELL_REMAP_BLOCK
334 } CM_CELL_REMAP_BLOCK
, *PCM_CELL_REMAP_BLOCK
;
339 typedef struct _CM_ALLOC_PAGE
344 } CM_ALLOC_PAGE
, *PCM_ALLOC_PAGE
;
347 // Allocation Page Entry
349 typedef struct _CM_DELAY_ALLOC
351 LIST_ENTRY ListEntry
;
352 PCM_KEY_CONTROL_BLOCK Kcb
;
353 } CM_DELAY_ALLOC
, *PCM_DELAY_ALLOC
;
356 // Delayed Close Entry
358 typedef struct _CM_DELAYED_CLOSE_ENTRY
360 LIST_ENTRY DelayedLRUList
;
361 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
362 } CM_DELAYED_CLOSE_ENTRY
, *PCM_DELAYED_CLOSE_ENTRY
;
365 // Delayed KCB Dereference Entry
367 typedef struct _CM_DELAY_DEREF_KCB_ITEM
369 LIST_ENTRY ListEntry
;
370 PCM_KEY_CONTROL_BLOCK Kcb
;
371 } CM_DELAY_DEREF_KCB_ITEM
, *PCM_DELAY_DEREF_KCB_ITEM
;
374 // Use Count Log and Entry
376 typedef struct _CM_USE_COUNT_LOG_ENTRY
380 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
382 typedef struct _CM_USE_COUNT_LOG
386 CM_USE_COUNT_LOG_ENTRY Log
[32];
387 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
390 // Configuration Manager Hive Structure
392 typedef struct _CMHIVE
395 HANDLE FileHandles
[HFILE_TYPE_MAX
];
396 LIST_ENTRY NotifyList
;
398 EX_PUSH_LOCK HiveLock
;
399 PKTHREAD HiveLockOwner
;
400 PKGUARDED_MUTEX ViewLock
;
401 PKTHREAD ViewLockOwner
;
402 EX_PUSH_LOCK WriterLock
;
403 PKTHREAD WriterLockOwner
;
404 PERESOURCE FlusherLock
;
405 EX_PUSH_LOCK SecurityLock
;
406 PKTHREAD HiveSecurityLockOwner
;
407 LIST_ENTRY LRUViewListHead
;
408 LIST_ENTRY PinViewListHead
;
409 PFILE_OBJECT FileObject
;
410 UNICODE_STRING FileFullPath
;
411 UNICODE_STRING FileUserName
;
416 ULONG SecurityCacheSize
;
417 LONG SecurityHitHint
;
418 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
419 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
421 PCM_KEY_CONTROL_BLOCK RootKcb
;
423 PWORK_QUEUE_ITEM UnloadWorkItem
;
424 BOOLEAN GrowOnlyMode
;
426 LIST_ENTRY KcbConvertListHead
;
427 LIST_ENTRY KnodeConvertListHead
;
428 PCM_CELL_REMAP_BLOCK CellRemapArray
;
429 CM_USE_COUNT_LOG UseCountLog
;
430 CM_USE_COUNT_LOG LockHiveLog
;
432 LIST_ENTRY TrustClassEntry
;
434 BOOLEAN HiveIsLoading
;
435 PKTHREAD CreatorOwner
;
439 // Cached Value Index
441 typedef struct _CM_CACHED_VALUE_INDEX
443 HCELL_INDEX CellIndex
;
447 ULONG_PTR List
[ANYSIZE_ARRAY
];
449 } CM_CACHED_VALUE_INDEX
, *PCM_CACHED_VALUE_INDEX
;
454 typedef struct _CM_CACHED_VALUE
456 USHORT DataCacheType
;
459 CM_KEY_VALUE KeyValue
;
460 } CM_CACHED_VALUE
, *PCM_CACHED_VALUE
;
465 typedef struct _HIVE_LIST_ENTRY
473 BOOLEAN ThreadFinished
;
474 BOOLEAN ThreadStarted
;
476 } HIVE_LIST_ENTRY
, *PHIVE_LIST_ENTRY
;
479 // Parse context for Key Object
481 typedef struct _CM_PARSE_CONTEXT
484 UNICODE_STRING Class
;
487 CM_KEY_REFERENCE ChildHive
;
488 HANDLE PredefinedHandle
;
490 BOOLEAN CreateOperation
;
491 PCMHIVE OriginatingPoint
;
492 } CM_PARSE_CONTEXT
, *PCM_PARSE_CONTEXT
;
495 // MultiFunction Adapter Recognizer Structure
497 typedef struct _CMP_MF_TYPE
500 USHORT InterfaceType
;
502 } CMP_MF_TYPE
, *PCMP_MF_TYPE
;
505 // System Control Vector
507 typedef struct _CM_SYSTEM_CONTROL_VECTOR
514 } CM_SYSTEM_CONTROL_VECTOR
, *PCM_SYSTEM_CONTROL_VECTOR
;
517 // Structure for CmpQueryValueDataFromCache
519 typedef struct _KEY_VALUE_INFORMATION
523 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation
;
524 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation
;
525 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation
;
526 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64
;
528 } KEY_VALUE_INFORMATION
, *PKEY_VALUE_INFORMATION
;
530 typedef struct _KEY_INFORMATION
534 KEY_BASIC_INFORMATION KeyBasicInformation
;
535 KEY_FULL_INFORMATION KeyFullInformation
;
536 KEY_NODE_INFORMATION KeyNodeInformation
;
538 } KEY_INFORMATION
, *PKEY_INFORMATION
;
540 ///////////////////////////////////////////////////////////////////////////////
542 // BUGBUG Old Hive Stuff for Temporary Support
544 NTSTATUS
CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1
, IN PVOID Argument2
);
545 ///////////////////////////////////////////////////////////////////////////////
548 // Mapped View Hive Functions
558 CmpDestroyHiveViewList(
563 // Security Cache Functions
567 CmpInitSecurityCache(
573 CmpDestroySecurityCache(
578 // Value Cache Functions
580 VALUE_SEARCH_RETURN_TYPE
582 CmpFindValueByNameFromCache(
583 IN PCM_KEY_CONTROL_BLOCK Kcb
,
584 IN PCUNICODE_STRING Name
,
585 OUT PCM_CACHED_VALUE
**CachedValue
,
587 OUT PCM_KEY_VALUE
*Value
,
588 OUT BOOLEAN
*ValueIsCached
,
589 OUT PHCELL_INDEX CellToRelease
592 VALUE_SEARCH_RETURN_TYPE
594 CmpQueryKeyValueData(
595 IN PCM_KEY_CONTROL_BLOCK Kcb
,
596 IN PCM_CACHED_VALUE
*CachedValue
,
597 IN PCM_KEY_VALUE ValueKey
,
598 IN BOOLEAN ValueIsCached
,
599 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
600 IN PVOID KeyValueInformation
,
602 OUT PULONG ResultLength
,
606 VALUE_SEARCH_RETURN_TYPE
608 CmpGetValueListFromCache(
609 IN PCM_KEY_CONTROL_BLOCK Kcb
,
610 OUT PCELL_DATA
*CellData
,
611 OUT BOOLEAN
*IndexIsCached
,
612 OUT PHCELL_INDEX ValueListToRelease
615 VALUE_SEARCH_RETURN_TYPE
617 CmpGetValueKeyFromCache(
618 IN PCM_KEY_CONTROL_BLOCK Kcb
,
619 IN PCELL_DATA CellData
,
621 OUT PCM_CACHED_VALUE
**CachedValue
,
622 OUT PCM_KEY_VALUE
*Value
,
623 IN BOOLEAN IndexIsCached
,
624 OUT BOOLEAN
*ValueIsCached
,
625 OUT PHCELL_INDEX CellToRelease
628 VALUE_SEARCH_RETURN_TYPE
630 CmpCompareNewValueDataAgainstKCBCache(
631 IN PCM_KEY_CONTROL_BLOCK Kcb
,
632 IN PUNICODE_STRING ValueName
,
639 // Registry Validation Functions
649 // Hive List Routines
655 OUT PUNICODE_STRING HiveName
660 CmpAddToHiveFileList(
666 CmpRemoveFromHiveFileList(
675 CmpSetGlobalQuotaAllowed(
680 // Notification Routines
685 IN PCM_KEY_CONTROL_BLOCK Kcb
,
694 IN PCM_KEY_BODY KeyBody
,
706 // KCB Cache/Delay Routines
718 CmpInitCmPrivateDelayAlloc(
725 CmpInitCmPrivateAlloc(
732 CmpInitDelayDerefKCBEngine(
737 // Key Object Routines
742 IN PEPROCESS Process OPTIONAL
,
744 IN ACCESS_MASK GrantedAccess
,
745 IN ULONG ProcessHandleCount
,
746 IN ULONG SystemHandleCount
758 IN PVOID ParseObject
,
760 IN OUT PACCESS_STATE AccessState
,
761 IN KPROCESSOR_MODE AccessMode
,
763 IN OUT PUNICODE_STRING CompleteName
,
764 IN OUT PUNICODE_STRING RemainingName
,
765 IN OUT PVOID Context OPTIONAL
,
766 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
774 IN SECURITY_OPERATION_CODE OperationType
,
775 IN PSECURITY_INFORMATION SecurityInformation
,
776 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
777 IN OUT PULONG CapturedLength
,
778 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
779 IN POOL_TYPE PoolType
,
780 IN PGENERIC_MAPPING GenericMapping
787 IN BOOLEAN HasObjectName
,
788 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
790 OUT PULONG ReturnLength
,
791 IN KPROCESSOR_MODE AccessMode
801 IN ULONG OperationType
,
804 IN PVOID HiveData OPTIONAL
,
808 IN PCUNICODE_STRING FileName OPTIONAL
,
820 CmpHiveRootSecurityDescriptor(
827 IN PUNICODE_STRING LinkName
,
828 IN HANDLE RootDirectory
,
831 IN PSECURITY_DESCRIPTOR SecurityDescriptor
837 IN PCUNICODE_STRING BaseName
,
838 IN PCWSTR Extension OPTIONAL
,
841 OUT PULONG PrimaryDisposition
,
842 OUT PULONG LogDisposition
,
843 IN BOOLEAN CreateAllowed
,
844 IN BOOLEAN MarkAsSystemHive
,
845 IN BOOLEAN NoBuffering
,
846 OUT PULONG ClusterSize OPTIONAL
858 IN PCUNICODE_STRING HiveName
,
867 CmpInitializeHiveList(
872 // Registry Utility Functions
876 CmpTestRegistryLockExclusive(
888 CmpLockRegistryExclusive(
906 CmpLockHiveFlusherExclusive(
912 CmpLockHiveFlusherShared(
918 CmpTestHiveFlusherLockExclusive(
924 CmpTestHiveFlusherLockShared(
930 CmpUnlockHiveFlusher(
939 CmpAllocateDelayItem(
951 CmpDelayDerefKeyControlBlock(
952 IN PCM_KEY_CONTROL_BLOCK Kcb
957 CmpAddToDelayedClose(
958 IN PCM_KEY_CONTROL_BLOCK Kcb
,
959 IN BOOLEAN LockHeldExclusively
964 CmpArmDelayedCloseTimer(
970 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb
);
975 CmpInitializeDelayedCloseTable(
982 PCM_KEY_CONTROL_BLOCK
984 CmpCreateKeyControlBlock(
986 IN HCELL_INDEX Index
,
987 IN PCM_KEY_NODE Node
,
988 IN PCM_KEY_CONTROL_BLOCK Parent
,
990 IN PUNICODE_STRING KeyName
993 PCM_KEY_CONTROL_BLOCK
995 CmpAllocateKeyControlBlock(
1001 CmpFreeKeyControlBlock(
1002 IN PCM_KEY_CONTROL_BLOCK Kcb
1007 CmpRemoveKeyControlBlock(
1008 IN PCM_KEY_CONTROL_BLOCK Kcb
1013 CmpCleanUpKcbValueCache(
1014 IN PCM_KEY_CONTROL_BLOCK Kcb
1019 CmpCleanUpKcbCacheWithLock(
1020 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1021 IN BOOLEAN LockHeldExclusively
1026 CmpCleanUpSubKeyInfo(
1027 IN PCM_KEY_CONTROL_BLOCK Kcb
1033 IN PCM_KEY_CONTROL_BLOCK Kcb
1038 CmpReferenceKeyControlBlock(
1039 IN PCM_KEY_CONTROL_BLOCK Kcb
1044 CmpDereferenceKeyControlBlockWithLock(
1045 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1046 IN BOOLEAN LockHeldExclusively
1051 CmpDereferenceKeyControlBlock(
1052 IN PCM_KEY_CONTROL_BLOCK Kcb
1057 EnlistKeyBodyWithKCB(
1058 IN PCM_KEY_BODY KeyObject
,
1064 DelistKeyBodyFromKCB(
1065 IN PCM_KEY_BODY KeyBody
,
1071 CmpAcquireTwoKcbLocksExclusiveByKey(
1078 CmpReleaseTwoKcbLockByKey(
1085 CmpFlushNotifiesOnKeyBodyList(
1086 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1096 IN OUT PUNICODE_STRING RemainingName
,
1097 OUT PUNICODE_STRING NextName
,
1098 OUT PBOOLEAN LastName
1102 // Command Routines (Flush, Open, Close, Init);
1107 IN BOOLEAN ForceFlush
1119 IN BOOLEAN SetupBoot
1125 IN POBJECT_ATTRIBUTES FileAttributes
,
1126 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext
,
1127 IN OUT PBOOLEAN Allocate
,
1128 OUT PCMHIVE
*NewHive
,
1139 // Open/Create Routines
1145 IN HCELL_INDEX Cell
,
1146 IN PACCESS_STATE AccessState
,
1147 IN PUNICODE_STRING Name
,
1148 IN KPROCESSOR_MODE AccessMode
,
1149 IN PCM_PARSE_CONTEXT Context
,
1150 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1158 IN HCELL_INDEX Cell
,
1159 IN PACCESS_STATE AccessState
,
1160 IN UNICODE_STRING Name
,
1161 IN KPROCESSOR_MODE AccessMode
,
1162 IN ULONG CreateOptions
,
1163 IN PCM_PARSE_CONTEXT Context
,
1164 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1175 IN PHHIVE SystemHive
,
1176 IN HCELL_INDEX RootCell
,
1177 IN PUNICODE_STRING SelectKeyName
,
1178 OUT PBOOLEAN AutoSelect
1184 CmGetSystemControlValues(
1185 IN PVOID SystemHiveData
,
1186 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1191 CmpSaveBootControlSet(
1192 IN USHORT ControlSet
1196 // Hardware Configuration Routines
1201 CmpInitializeRegistryNode(
1202 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry
,
1203 IN HANDLE NodeHandle
,
1204 OUT PHANDLE NewHandle
,
1205 IN INTERFACE_TYPE InterfaceType
,
1207 IN PUSHORT DeviceIndexTable
1212 CmpInitializeMachineDependentConfiguration(
1213 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1219 CmpInitializeHardwareConfiguration(
1220 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1229 IN EVENT_TYPE EventType
,
1230 OUT PHANDLE EventHandle
,
1252 IN PHHIVE RegistryHive
,
1254 IN OUT PULONG FileOffset
,
1256 IN SIZE_T BufferLength
1262 IN PHHIVE RegistryHive
,
1264 IN OUT PULONG FileOffset
,
1266 IN SIZE_T BufferLength
1272 IN PHHIVE RegistryHive
,
1275 IN ULONG OldFileSize
1281 IN PHHIVE RegistryHive
,
1283 IN OUT PLARGE_INTEGER FileOffset
,
1288 // Configuration Manager side of Registry System Calls
1292 CmEnumerateValueKey(
1293 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1295 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1296 IN PVOID KeyValueInformation
,
1298 IN PULONG ResultLength
);
1303 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1304 IN PUNICODE_STRING ValueName
,
1311 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1312 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1313 IN PVOID KeyInformation
,
1315 IN PULONG ResultLength
1320 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1322 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1323 IN PVOID KeyInformation
,
1325 IN PULONG ResultLength
1331 IN PCM_KEY_BODY KeyBody
1337 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1338 IN BOOLEAN EclusiveLock
1344 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1345 IN UNICODE_STRING ValueName
1351 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1352 IN UNICODE_STRING ValueName
,
1353 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1354 IN PVOID KeyValueInformation
,
1356 IN PULONG ResultLength
1362 IN POBJECT_ATTRIBUTES TargetKey
,
1363 IN POBJECT_ATTRIBUTES SourceFile
,
1365 IN PCM_KEY_BODY KeyBody
1371 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1377 CmpEnumerateOpenSubKeys(
1378 IN PCM_KEY_CONTROL_BLOCK RootKcb
,
1379 IN BOOLEAN RemoveEmptyCacheEntries
,
1380 IN BOOLEAN DereferenceOpenedEntries
1386 IN PHHIVE SourceHive
,
1387 IN HCELL_INDEX SourceCell
,
1388 IN PHHIVE DestinationHive
,
1389 IN HSTORAGE_TYPE StorageType
1395 IN PHHIVE SourceHive
,
1396 IN HCELL_INDEX SrcKeyCell
,
1397 IN PHHIVE DestinationHive
,
1398 IN HSTORAGE_TYPE StorageType
,
1399 OUT PHCELL_INDEX DestKeyCell OPTIONAL
1405 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1406 IN HANDLE FileHandle
,
1413 IN PCM_KEY_CONTROL_BLOCK HighKcb
,
1414 IN PCM_KEY_CONTROL_BLOCK LowKcb
,
1415 IN HANDLE FileHandle
1419 // Startup and Shutdown
1436 CmSetLazyFlushState(
1447 // Driver List Routines
1452 CmGetSystemDriverList(
1461 IN HCELL_INDEX ControlSet
,
1462 IN SERVICE_LOAD_TYPE LoadType
,
1463 IN PWSTR BootFileSystem OPTIONAL
,
1464 IN PLIST_ENTRY DriverListHead
1472 IN HCELL_INDEX ControlSet
,
1473 IN PLIST_ENTRY DriverListHead
1479 CmpResolveDriverDependencies(
1480 IN PLIST_ENTRY DriverListHead
1488 IN HCELL_INDEX SafeBootCell
,
1489 IN HCELL_INDEX DriverCell
);
1492 // Global variables accessible from all of Cm
1494 extern ULONG CmpTraceLevel
;
1495 extern BOOLEAN CmpSpecialBootCondition
;
1496 extern BOOLEAN CmpFlushOnLockRelease
;
1497 extern BOOLEAN CmpShareSystemHives
;
1498 extern BOOLEAN CmpMiniNTBoot
;
1499 extern BOOLEAN CmpNoVolatileCreates
;
1500 extern EX_PUSH_LOCK CmpHiveListHeadLock
, CmpLoadHiveLock
;
1501 extern LIST_ENTRY CmpHiveListHead
;
1502 extern POBJECT_TYPE CmpKeyObjectType
;
1503 extern ERESOURCE CmpRegistryLock
;
1504 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
;
1505 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
;
1506 extern KGUARDED_MUTEX CmpDelayedCloseTableLock
;
1507 extern CMHIVE CmControlHive
;
1508 extern WCHAR CmDefaultLanguageId
[];
1509 extern ULONG CmDefaultLanguageIdLength
;
1510 extern ULONG CmDefaultLanguageIdType
;
1511 extern WCHAR CmInstallUILanguageId
[];
1512 extern ULONG CmInstallUILanguageIdLength
;
1513 extern ULONG CmInstallUILanguageIdType
;
1514 extern ULONG CmNtGlobalFlag
;
1515 extern LANGID PsInstallUILanguageId
;
1516 extern LANGID PsDefaultUILanguageId
;
1517 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector
[];
1518 extern ULONG CmpConfigurationAreaSize
;
1519 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData
;
1520 extern UNICODE_STRING CmTypeName
[];
1521 extern UNICODE_STRING CmClassName
[];
1522 extern CMP_MF_TYPE CmpMultifunctionTypes
[];
1523 extern USHORT CmpUnknownBusCount
;
1524 extern ULONG CmpTypeCount
[MaximumType
+ 1];
1525 extern HIVE_LIST_ENTRY CmpMachineHiveList
[];
1526 extern UNICODE_STRING CmSymbolicLinkValueName
;
1527 extern UNICODE_STRING CmpSystemStartOptions
;
1528 extern UNICODE_STRING CmpLoadOptions
;
1529 extern BOOLEAN CmSelfHeal
;
1530 extern BOOLEAN CmpSelfHeal
;
1531 extern ULONG CmpBootType
;
1532 extern HANDLE CmpRegistryRootHandle
;
1533 extern BOOLEAN ExpInTextModeSetup
;
1534 extern BOOLEAN InitIsWinPEMode
;
1535 extern ULONG CmpHashTableSize
;
1536 extern ULONG CmpDelayedCloseSize
, CmpDelayedCloseIndex
;
1537 extern BOOLEAN CmpNoWrite
;
1538 extern BOOLEAN CmpForceForceFlush
;
1539 extern BOOLEAN CmpWasSetupBoot
;
1540 extern BOOLEAN CmpProfileLoaded
;
1541 extern PCMHIVE CmiVolatileHive
;
1542 extern LIST_ENTRY CmiKeyObjectListHead
;
1543 extern BOOLEAN CmpHoldLazyFlush
;
1546 // Inlined functions