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, ...) DPRINT(__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 Flags
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
261 ULONG PrivateAlloc
:1;
263 ULONG DelayedCloseIndex
:12;
264 ULONG TotalLevels
:10;
272 PCM_KEY_HASH NextHash
;
277 struct _CM_KEY_CONTROL_BLOCK
*ParentKcb
;
278 PCM_NAME_CONTROL_BLOCK NameBlock
;
279 PCM_KEY_SECURITY_CACHE CachedSecurity
;
280 CACHED_CHILD_LIST ValueCache
;
283 PCM_INDEX_HINT_BLOCK IndexHint
;
289 LIST_ENTRY KeyBodyListHead
;
290 LIST_ENTRY FreeListEntry
;
292 PCM_KEY_BODY KeyBodyArray
[4];
293 PVOID DelayCloseEntry
;
294 LARGE_INTEGER KcbLastWriteTime
;
295 USHORT KcbMaxNameLen
;
296 USHORT KcbMaxValueNameLen
;
297 ULONG KcbMaxValueDataLen
;
299 } CM_KEY_CONTROL_BLOCK
, *PCM_KEY_CONTROL_BLOCK
;
304 typedef struct _CM_NOTIFY_BLOCK
308 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
309 PCM_KEY_BODY KeyBody
;
312 ULONG NotifyPending
:31;
313 } CM_NOTIFY_BLOCK
, *PCM_NOTIFY_BLOCK
;
318 typedef struct _CM_CELL_REMAP_BLOCK
322 } CM_CELL_REMAP_BLOCK
, *PCM_CELL_REMAP_BLOCK
;
327 typedef struct _CM_ALLOC_PAGE
332 } CM_ALLOC_PAGE
, *PCM_ALLOC_PAGE
;
335 // Allocation Page Entry
337 typedef struct _CM_DELAY_ALLOC
339 LIST_ENTRY ListEntry
;
340 PCM_KEY_CONTROL_BLOCK Kcb
;
341 } CM_DELAY_ALLOC
, *PCM_DELAY_ALLOC
;
344 // Delayed Close Entry
346 typedef struct _CM_DELAYED_CLOSE_ENTRY
348 LIST_ENTRY DelayedLRUList
;
349 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
350 } CM_DELAYED_CLOSE_ENTRY
, *PCM_DELAYED_CLOSE_ENTRY
;
353 // Delayed KCB Dereference Entry
355 typedef struct _CM_DELAY_DEREF_KCB_ITEM
357 LIST_ENTRY ListEntry
;
358 PCM_KEY_CONTROL_BLOCK Kcb
;
359 } CM_DELAY_DEREF_KCB_ITEM
, *PCM_DELAY_DEREF_KCB_ITEM
;
362 // Use Count Log and Entry
364 typedef struct _CM_USE_COUNT_LOG_ENTRY
368 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
370 typedef struct _CM_USE_COUNT_LOG
374 CM_USE_COUNT_LOG_ENTRY Log
[32];
375 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
378 // Configuration Manager Hive Structure
380 typedef struct _CMHIVE
383 HANDLE FileHandles
[HFILE_TYPE_MAX
];
384 LIST_ENTRY NotifyList
;
386 EX_PUSH_LOCK HiveLock
;
387 PKTHREAD HiveLockOwner
;
388 PKGUARDED_MUTEX ViewLock
;
389 PKTHREAD ViewLockOwner
;
390 EX_PUSH_LOCK WriterLock
;
391 PKTHREAD WriterLockOwner
;
392 PERESOURCE FlusherLock
;
393 EX_PUSH_LOCK SecurityLock
;
394 PKTHREAD HiveSecurityLockOwner
;
395 LIST_ENTRY LRUViewListHead
;
396 LIST_ENTRY PinViewListHead
;
397 PFILE_OBJECT FileObject
;
398 UNICODE_STRING FileFullPath
;
399 UNICODE_STRING FileUserName
;
404 ULONG SecurityCacheSize
;
405 LONG SecurityHitHint
;
406 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
407 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
409 PCM_KEY_CONTROL_BLOCK RootKcb
;
411 PWORK_QUEUE_ITEM UnloadWorkItem
;
412 BOOLEAN GrowOnlyMode
;
414 LIST_ENTRY KcbConvertListHead
;
415 LIST_ENTRY KnodeConvertListHead
;
416 PCM_CELL_REMAP_BLOCK CellRemapArray
;
417 CM_USE_COUNT_LOG UseCountLog
;
418 CM_USE_COUNT_LOG LockHiveLog
;
420 LIST_ENTRY TrustClassEntry
;
422 BOOLEAN HiveIsLoading
;
423 PKTHREAD CreatorOwner
;
427 // Cached Value Index
429 typedef struct _CM_CACHED_VALUE_INDEX
431 HCELL_INDEX CellIndex
;
435 ULONG_PTR List
[ANYSIZE_ARRAY
];
437 } CM_CACHED_VALUE_INDEX
, *PCM_CACHED_VALUE_INDEX
;
442 typedef struct _CM_CACHED_VALUE
444 USHORT DataCacheType
;
447 CM_KEY_VALUE KeyValue
;
448 } CM_CACHED_VALUE
, *PCM_CACHED_VALUE
;
453 typedef struct _HIVE_LIST_ENTRY
461 BOOLEAN ThreadFinished
;
462 BOOLEAN ThreadStarted
;
464 } HIVE_LIST_ENTRY
, *PHIVE_LIST_ENTRY
;
467 // Parse context for Key Object
469 typedef struct _CM_PARSE_CONTEXT
472 UNICODE_STRING Class
;
475 CM_KEY_REFERENCE ChildHive
;
476 HANDLE PredefinedHandle
;
478 BOOLEAN CreateOperation
;
479 PCMHIVE OriginatingPoint
;
480 } CM_PARSE_CONTEXT
, *PCM_PARSE_CONTEXT
;
483 // MultiFunction Adapter Recognizer Structure
485 typedef struct _CMP_MF_TYPE
488 USHORT InterfaceType
;
490 } CMP_MF_TYPE
, *PCMP_MF_TYPE
;
493 // System Control Vector
495 typedef struct _CM_SYSTEM_CONTROL_VECTOR
502 } CM_SYSTEM_CONTROL_VECTOR
, *PCM_SYSTEM_CONTROL_VECTOR
;
505 // Structure for CmpQueryValueDataFromCache
507 typedef struct _KEY_VALUE_INFORMATION
511 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation
;
512 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation
;
513 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation
;
514 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64
;
516 } KEY_VALUE_INFORMATION
, *PKEY_VALUE_INFORMATION
;
518 typedef struct _KEY_INFORMATION
522 KEY_BASIC_INFORMATION KeyBasicInformation
;
523 KEY_FULL_INFORMATION KeyFullInformation
;
524 KEY_NODE_INFORMATION KeyNodeInformation
;
526 } KEY_INFORMATION
, *PKEY_INFORMATION
;
528 ///////////////////////////////////////////////////////////////////////////////
530 // BUGBUG Old Hive Stuff for Temporary Support
532 NTSTATUS
CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1
, IN PVOID Argument2
);
533 ///////////////////////////////////////////////////////////////////////////////
536 // Mapped View Hive Functions
545 // Security Cache Functions
549 CmpInitSecurityCache(
554 // Value Cache Functions
556 VALUE_SEARCH_RETURN_TYPE
558 CmpFindValueByNameFromCache(
559 IN PCM_KEY_CONTROL_BLOCK Kcb
,
560 IN PCUNICODE_STRING Name
,
561 OUT PCM_CACHED_VALUE
**CachedValue
,
563 OUT PCM_KEY_VALUE
*Value
,
564 OUT BOOLEAN
*ValueIsCached
,
565 OUT PHCELL_INDEX CellToRelease
568 VALUE_SEARCH_RETURN_TYPE
570 CmpQueryKeyValueData(
571 IN PCM_KEY_CONTROL_BLOCK Kcb
,
572 IN PCM_CACHED_VALUE
*CachedValue
,
573 IN PCM_KEY_VALUE ValueKey
,
574 IN BOOLEAN ValueIsCached
,
575 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
576 IN PVOID KeyValueInformation
,
578 OUT PULONG ResultLength
,
582 VALUE_SEARCH_RETURN_TYPE
584 CmpGetValueListFromCache(
585 IN PCM_KEY_CONTROL_BLOCK Kcb
,
586 OUT PCELL_DATA
*CellData
,
587 OUT BOOLEAN
*IndexIsCached
,
588 OUT PHCELL_INDEX ValueListToRelease
591 VALUE_SEARCH_RETURN_TYPE
593 CmpGetValueKeyFromCache(
594 IN PCM_KEY_CONTROL_BLOCK Kcb
,
595 IN PCELL_DATA CellData
,
597 OUT PCM_CACHED_VALUE
**CachedValue
,
598 OUT PCM_KEY_VALUE
*Value
,
599 IN BOOLEAN IndexIsCached
,
600 OUT BOOLEAN
*ValueIsCached
,
601 OUT PHCELL_INDEX CellToRelease
604 VALUE_SEARCH_RETURN_TYPE
606 CmpCompareNewValueDataAgainstKCBCache(
607 IN PCM_KEY_CONTROL_BLOCK Kcb
,
608 IN PUNICODE_STRING ValueName
,
615 // Registry Validation Functions
625 // Notification Routines
630 IN PCM_KEY_CONTROL_BLOCK Kcb
,
643 // KCB Cache/Delay Routines
653 CmpInitCmPrivateDelayAlloc(
659 CmpInitCmPrivateAlloc(
665 CmpInitDelayDerefKCBEngine(
670 // Key Object Routines
675 IN PEPROCESS Process OPTIONAL
,
677 IN ACCESS_MASK GrantedAccess
,
678 IN ULONG ProcessHandleCount
,
679 IN ULONG SystemHandleCount
691 IN PVOID ParseObject
,
693 IN OUT PACCESS_STATE AccessState
,
694 IN KPROCESSOR_MODE AccessMode
,
696 IN OUT PUNICODE_STRING CompleteName
,
697 IN OUT PUNICODE_STRING RemainingName
,
698 IN OUT PVOID Context OPTIONAL
,
699 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
707 IN SECURITY_OPERATION_CODE OperationType
,
708 IN PSECURITY_INFORMATION SecurityInformation
,
709 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
710 IN OUT PULONG CapturedLength
,
711 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
712 IN POOL_TYPE PoolType
,
713 IN PGENERIC_MAPPING GenericMapping
720 IN BOOLEAN HasObjectName
,
721 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
723 OUT PULONG ReturnLength
,
724 IN KPROCESSOR_MODE AccessMode
737 IN PVOID HiveData OPTIONAL
,
741 IN PCUNICODE_STRING FileName OPTIONAL
,
747 CmpHiveRootSecurityDescriptor(
754 IN PUNICODE_STRING LinkName
,
755 IN HANDLE RootDirectory
,
758 IN PSECURITY_DESCRIPTOR SecurityDescriptor
764 IN PCUNICODE_STRING BaseName
,
765 IN PCWSTR Extension OPTIONAL
,
768 IN PULONG PrimaryDisposition
,
769 IN PULONG LogDisposition
,
770 IN BOOLEAN CreateAllowed
,
771 IN BOOLEAN MarkAsSystemHive
,
772 IN BOOLEAN NoBuffering
,
773 OUT PULONG ClusterSize OPTIONAL
779 IN PCUNICODE_STRING HiveName
,
788 CmpInitializeHiveList(
793 // Registry Utility Functions
797 CmpTestRegistryLockExclusive(
809 CmpLockRegistryExclusive(
830 CmpAllocateDelayItem(
842 CmpDelayDerefKeyControlBlock(
843 IN PCM_KEY_CONTROL_BLOCK Kcb
848 CmpAddToDelayedClose(
849 IN PCM_KEY_CONTROL_BLOCK Kcb
,
850 IN BOOLEAN LockHeldExclusively
855 CmpArmDelayedCloseTimer(
861 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb
);
865 CmpInitializeDelayedCloseTable(
872 PCM_KEY_CONTROL_BLOCK
874 CmpCreateKeyControlBlock(
876 IN HCELL_INDEX Index
,
877 IN PCM_KEY_NODE Node
,
878 IN PCM_KEY_CONTROL_BLOCK Parent
,
880 IN PUNICODE_STRING KeyName
883 PCM_KEY_CONTROL_BLOCK
885 CmpAllocateKeyControlBlock(
891 CmpFreeKeyControlBlock(
892 IN PCM_KEY_CONTROL_BLOCK Kcb
897 CmpRemoveKeyControlBlock(
898 IN PCM_KEY_CONTROL_BLOCK Kcb
903 CmpCleanUpKcbValueCache(
904 IN PCM_KEY_CONTROL_BLOCK Kcb
909 CmpCleanUpKcbCacheWithLock(
910 IN PCM_KEY_CONTROL_BLOCK Kcb
,
911 IN BOOLEAN LockHeldExclusively
916 CmpCleanUpSubKeyInfo(
917 IN PCM_KEY_CONTROL_BLOCK Kcb
923 IN PCM_KEY_CONTROL_BLOCK Kcb
928 CmpReferenceKeyControlBlock(
929 IN PCM_KEY_CONTROL_BLOCK Kcb
934 CmpDereferenceKeyControlBlockWithLock(
935 IN PCM_KEY_CONTROL_BLOCK Kcb
,
936 IN BOOLEAN LockHeldExclusively
941 CmpDereferenceKeyControlBlock(
942 IN PCM_KEY_CONTROL_BLOCK Kcb
947 EnlistKeyBodyWithKCB(
948 IN PCM_KEY_BODY KeyObject
,
954 DelistKeyBodyFromKCB(
955 IN PCM_KEY_BODY KeyBody
,
969 CmpAcquireTwoKcbLocksExclusiveByKey(
976 CmpReleaseTwoKcbLockByKey(
986 CmpCompareCompressedName(
987 IN PCUNICODE_STRING SearchName
,
988 IN PWCHAR CompressedName
,
996 IN PUNICODE_STRING Name
1001 CmpCompressedNameSize(
1008 CmpCopyCompressedName(
1009 IN PWCHAR Destination
,
1010 IN ULONG DestinationLength
,
1012 IN ULONG SourceLength
1019 IN PWCHAR Destination
,
1020 IN PUNICODE_STRING Source
1027 IN PCHILD_LIST ChildList
,
1028 IN PUNICODE_STRING Name
,
1029 IN PULONG ChildIndex
,
1030 IN PHCELL_INDEX CellIndex
1039 IN OUT PUNICODE_STRING RemainingName
,
1040 OUT PUNICODE_STRING NextName
,
1041 OUT PBOOLEAN LastName
1045 // Command Routines (Flush, Open, Close, Init);
1050 IN BOOLEAN ForceFlush
1062 IN BOOLEAN SetupBoot
1068 IN POBJECT_ATTRIBUTES FileAttributes
,
1069 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext
,
1070 IN OUT PBOOLEAN Allocate
,
1071 OUT PCMHIVE
*NewHive
,
1082 // Open/Create Routines
1088 IN HCELL_INDEX Cell
,
1089 IN PACCESS_STATE AccessState
,
1090 IN PUNICODE_STRING Name
,
1091 IN KPROCESSOR_MODE AccessMode
,
1092 IN PCM_PARSE_CONTEXT Context
,
1093 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1101 IN HCELL_INDEX Cell
,
1102 IN PACCESS_STATE AccessState
,
1103 IN UNICODE_STRING Name
,
1104 IN KPROCESSOR_MODE AccessMode
,
1105 IN ULONG CreateOptions
,
1106 IN PCM_PARSE_CONTEXT Context
,
1107 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1112 // Cell Index Routines
1117 CmpFindSubKeyByName(
1119 IN PCM_KEY_NODE Parent
,
1120 IN PCUNICODE_STRING SearchName
1125 CmpFindSubKeyByNumber(
1127 IN PCM_KEY_NODE Node
,
1135 IN PCUNICODE_STRING Name
,
1136 IN BOOLEAN AllowSeparators
1143 IN HCELL_INDEX Parent
,
1144 IN HCELL_INDEX Child
1151 IN HCELL_INDEX ParentKey
,
1152 IN HCELL_INDEX TargetKey
1159 HCELL_INDEX ParentKey
,
1160 HCELL_INDEX TargetKey
1164 // Cell Value Routines
1170 IN PCM_KEY_NODE KeyNode
,
1171 IN PUNICODE_STRING Name
1178 IN PCM_KEY_VALUE Value
,
1188 IN ULONG StorageType
,
1189 IN HCELL_INDEX ValueCell
,
1190 OUT PHCELL_INDEX DataCell
1197 IN HCELL_INDEX ValueCell
,
1200 IN OUT PCHILD_LIST ChildList
1212 CmpMarkValueDataDirty(
1214 IN PCM_KEY_VALUE Value
1221 IN HCELL_INDEX DataCell
,
1227 CmpRemoveValueFromList(
1230 IN OUT PCHILD_LIST ChildList
1237 IN PCM_KEY_VALUE Value
,
1240 OUT PBOOLEAN BufferAllocated
,
1241 OUT PHCELL_INDEX CellToRelease
1250 IN PHHIVE SystemHive
,
1251 IN HCELL_INDEX RootCell
,
1252 IN PUNICODE_STRING SelectKeyName
,
1253 OUT PBOOLEAN AutoSelect
1258 CmGetSystemControlValues(
1259 IN PVOID SystemHiveData
,
1260 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1265 // Hardware Configuration Routines
1269 CmpInitializeRegistryNode(
1270 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry
,
1271 IN HANDLE NodeHandle
,
1272 OUT PHANDLE NewHandle
,
1273 IN INTERFACE_TYPE InterfaceType
,
1275 IN PUSHORT DeviceIndexTable
1280 CmpInitializeMachineDependentConfiguration(
1281 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1286 CmpInitializeHardwareConfiguration(
1287 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1296 IN EVENT_TYPE EventType
,
1297 OUT PHANDLE EventHandle
,
1319 IN PHHIVE RegistryHive
,
1321 IN OUT PULONG FileOffset
,
1323 IN SIZE_T BufferLength
1329 IN PHHIVE RegistryHive
,
1331 IN OUT PULONG FileOffset
,
1333 IN SIZE_T BufferLength
1339 IN PHHIVE RegistryHive
,
1342 IN ULONG OldFileSize
1348 IN PHHIVE RegistryHive
,
1350 IN OUT PLARGE_INTEGER FileOffset
,
1355 // Configuration Manager side of Registry System Calls
1359 CmEnumerateValueKey(
1360 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1362 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1363 IN PVOID KeyValueInformation
,
1365 IN PULONG ResultLength
);
1370 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1371 IN PUNICODE_STRING ValueName
,
1378 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1379 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1380 IN PVOID KeyInformation
,
1382 IN PULONG ResultLength
1387 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1389 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1390 IN PVOID KeyInformation
,
1392 IN PULONG ResultLength
1398 IN PCM_KEY_BODY KeyBody
1404 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1405 IN BOOLEAN EclusiveLock
1411 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1412 IN UNICODE_STRING ValueName
1418 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1419 IN UNICODE_STRING ValueName
,
1420 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1421 IN PVOID KeyValueInformation
,
1423 IN PULONG ResultLength
1429 IN POBJECT_ATTRIBUTES TargetKey
,
1430 IN POBJECT_ATTRIBUTES SourceFile
,
1432 IN PCM_KEY_BODY KeyBody
1438 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1443 // Startup and Shutdown
1459 CmSetLazyFlushState(
1464 // Global variables accessible from all of Cm
1466 extern ULONG CmpTraceLevel
;
1467 extern BOOLEAN CmpSpecialBootCondition
;
1468 extern BOOLEAN CmpFlushOnLockRelease
;
1469 extern BOOLEAN CmpShareSystemHives
;
1470 extern BOOLEAN CmpMiniNTBoot
;
1471 extern EX_PUSH_LOCK CmpHiveListHeadLock
, CmpLoadHiveLock
;
1472 extern LIST_ENTRY CmpHiveListHead
;
1473 extern POBJECT_TYPE CmpKeyObjectType
;
1474 extern ERESOURCE CmpRegistryLock
;
1475 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
;
1476 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
;
1477 extern KGUARDED_MUTEX CmpDelayedCloseTableLock
;
1478 extern CMHIVE CmControlHive
;
1479 extern WCHAR CmDefaultLanguageId
[];
1480 extern ULONG CmDefaultLanguageIdLength
;
1481 extern ULONG CmDefaultLanguageIdType
;
1482 extern WCHAR CmInstallUILanguageId
[];
1483 extern ULONG CmInstallUILanguageIdLength
;
1484 extern ULONG CmInstallUILanguageIdType
;
1485 extern LANGID PsInstallUILanguageId
;
1486 extern LANGID PsDefaultUILanguageId
;
1487 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector
[];
1488 extern ULONG CmpConfigurationAreaSize
;
1489 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData
;
1490 extern UNICODE_STRING CmTypeName
[];
1491 extern UNICODE_STRING CmClassName
[];
1492 extern CMP_MF_TYPE CmpMultifunctionTypes
[];
1493 extern USHORT CmpUnknownBusCount
;
1494 extern ULONG CmpTypeCount
[MaximumType
+ 1];
1495 extern HIVE_LIST_ENTRY CmpMachineHiveList
[];
1496 extern UNICODE_STRING CmSymbolicLinkValueName
;
1497 extern UNICODE_STRING CmpSystemStartOptions
;
1498 extern UNICODE_STRING CmpLoadOptions
;
1499 extern BOOLEAN CmSelfHeal
;
1500 extern BOOLEAN CmpSelfHeal
;
1501 extern ULONG CmpBootType
;
1502 extern HANDLE CmpRegistryRootHandle
;
1503 extern BOOLEAN ExpInTextModeSetup
;
1504 extern BOOLEAN InitIsWinPEMode
;
1505 extern ULONG CmpHashTableSize
;
1506 extern ULONG CmpDelayedCloseSize
, CmpDelayedCloseIndex
;
1507 extern BOOLEAN CmpNoWrite
;
1508 extern BOOLEAN CmpForceForceFlush
;
1509 extern BOOLEAN CmpWasSetupBoot
;
1510 extern PCMHIVE CmiVolatileHive
;
1511 extern LIST_ENTRY CmiKeyObjectListHead
;
1512 extern BOOLEAN CmpHoldLazyFlush
;
1515 // Inlined functions