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 TAG('C', 'm', 'K', 'b')
49 #define CM_KCB_INVALID_SIGNATURE TAG('C', 'm', 'F', '4')
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 // EnlistKeyBodyWithKCB Flags
91 #define CMP_ENLIST_KCB_LOCKED_SHARED 0x1
92 #define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE 0x2
95 // Maximum size of Value Cache
97 #define MAXIMUM_CACHED_DATA 2 * PAGE_SIZE
100 // Hives to load on startup
102 #define CM_NUMBER_OF_MACHINE_HIVES 6
105 // Number of items that can fit inside an Allocation Page
107 #define CM_KCBS_PER_PAGE \
108 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_KEY_CONTROL_BLOCK))
109 #define CM_DELAYS_PER_PAGE \
110 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_DELAY_ALLOC))
113 // Value Search Results
115 typedef enum _VALUE_SEARCH_RETURN_TYPE
118 SearchNeedExclusiveLock
,
120 } VALUE_SEARCH_RETURN_TYPE
;
125 typedef struct _CM_KEY_HASH
128 struct _CM_KEY_HASH
*NextHash
;
131 } CM_KEY_HASH
, *PCM_KEY_HASH
;
134 // Key Hash Table Entry
136 typedef struct _CM_KEY_HASH_TABLE_ENTRY
141 } CM_KEY_HASH_TABLE_ENTRY
, *PCM_KEY_HASH_TABLE_ENTRY
;
146 typedef struct _CM_NAME_HASH
149 struct _CM_NAME_HASH
*NextHash
;
151 WCHAR Name
[ANYSIZE_ARRAY
];
152 } CM_NAME_HASH
, *PCM_NAME_HASH
;
155 // Name Hash Table Entry
157 typedef struct _CM_NAME_HASH_TABLE_ENTRY
161 } CM_NAME_HASH_TABLE_ENTRY
, *PCM_NAME_HASH_TABLE_ENTRY
;
164 // Key Security Cache
166 typedef struct _CM_KEY_SECURITY_CACHE
171 ULONG DescriptorLength
;
172 SECURITY_DESCRIPTOR_RELATIVE Descriptor
;
173 } CM_KEY_SECURITY_CACHE
, *PCM_KEY_SECURITY_CACHE
;
176 // Key Security Cache Entry
178 typedef struct _CM_KEY_SECURITY_CACHE_ENTRY
181 PCM_KEY_SECURITY_CACHE CachedSecurity
;
182 } CM_KEY_SECURITY_CACHE_ENTRY
, *PCM_KEY_SECURITY_CACHE_ENTRY
;
187 typedef struct _CACHED_CHILD_LIST
193 struct _CM_KEY_CONTROL_BLOCK
*RealKcb
;
195 } CACHED_CHILD_LIST
, *PCACHED_CHILD_LIST
;
200 typedef struct _CM_INDEX_HINT_BLOCK
203 ULONG HashKey
[ANYSIZE_ARRAY
];
204 } CM_INDEX_HINT_BLOCK
, *PCM_INDEX_HINT_BLOCK
;
209 typedef struct _CM_KEY_BODY
212 struct _CM_KEY_CONTROL_BLOCK
*KeyControlBlock
;
213 struct _CM_NOTIFY_BLOCK
*NotifyBlock
;
215 LIST_ENTRY KeyBodyList
;
216 } CM_KEY_BODY
, *PCM_KEY_BODY
;
219 // Name Control Block (NCB)
221 typedef struct _CM_NAME_CONTROL_BLOCK
227 CM_NAME_HASH NameHash
;
231 PCM_KEY_HASH NextHash
;
233 WCHAR Name
[ANYSIZE_ARRAY
];
236 } CM_NAME_CONTROL_BLOCK
, *PCM_NAME_CONTROL_BLOCK
;
239 // Key Control Block (KCB)
241 typedef struct _CM_KEY_CONTROL_BLOCK
249 ULONG PrivateAlloc
:1;
251 ULONG DelayedCloseIndex
:12;
252 ULONG TotalLevels
:10;
260 PCM_KEY_HASH NextHash
;
265 struct _CM_KEY_CONTROL_BLOCK
*ParentKcb
;
266 PCM_NAME_CONTROL_BLOCK NameBlock
;
267 PCM_KEY_SECURITY_CACHE CachedSecurity
;
268 CACHED_CHILD_LIST ValueCache
;
271 PCM_INDEX_HINT_BLOCK IndexHint
;
277 LIST_ENTRY KeyBodyListHead
;
278 LIST_ENTRY FreeListEntry
;
280 PCM_KEY_BODY KeyBodyArray
[4];
281 PVOID DelayCloseEntry
;
282 LARGE_INTEGER KcbLastWriteTime
;
283 USHORT KcbMaxNameLen
;
284 USHORT KcbMaxValueNameLen
;
285 ULONG KcbMaxValueDataLen
;
287 } CM_KEY_CONTROL_BLOCK
, *PCM_KEY_CONTROL_BLOCK
;
292 typedef struct _CM_NOTIFY_BLOCK
296 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
297 PCM_KEY_BODY KeyBody
;
300 ULONG NotifyPending
:31;
301 } CM_NOTIFY_BLOCK
, *PCM_NOTIFY_BLOCK
;
306 typedef struct _CM_CELL_REMAP_BLOCK
310 } CM_CELL_REMAP_BLOCK
, *PCM_CELL_REMAP_BLOCK
;
315 typedef struct _CM_ALLOC_PAGE
320 } CM_ALLOC_PAGE
, *PCM_ALLOC_PAGE
;
323 // Allocation Page Entry
325 typedef struct _CM_DELAY_ALLOC
327 LIST_ENTRY ListEntry
;
328 PCM_KEY_CONTROL_BLOCK Kcb
;
329 } CM_DELAY_ALLOC
, *PCM_DELAY_ALLOC
;
332 // Delayed Close Entry
334 typedef struct _CM_DELAYED_CLOSE_ENTRY
336 LIST_ENTRY DelayedLRUList
;
337 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
338 } CM_DELAYED_CLOSE_ENTRY
, *PCM_DELAYED_CLOSE_ENTRY
;
341 // Delayed KCB Dereference Entry
343 typedef struct _CM_DELAY_DEREF_KCB_ITEM
345 LIST_ENTRY ListEntry
;
346 PCM_KEY_CONTROL_BLOCK Kcb
;
347 } CM_DELAY_DEREF_KCB_ITEM
, *PCM_DELAY_DEREF_KCB_ITEM
;
350 // Use Count Log and Entry
352 typedef struct _CM_USE_COUNT_LOG_ENTRY
356 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
358 typedef struct _CM_USE_COUNT_LOG
362 CM_USE_COUNT_LOG_ENTRY Log
[32];
363 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
366 // Configuration Manager Hive Structure
368 typedef struct _CMHIVE
371 HANDLE FileHandles
[HFILE_TYPE_MAX
];
372 LIST_ENTRY NotifyList
;
374 EX_PUSH_LOCK HiveLock
;
375 PKTHREAD HiveLockOwner
;
376 PKGUARDED_MUTEX ViewLock
;
377 PKTHREAD ViewLockOwner
;
378 EX_PUSH_LOCK WriterLock
;
379 PKTHREAD WriterLockOwner
;
380 PERESOURCE FlusherLock
;
381 EX_PUSH_LOCK SecurityLock
;
382 PKTHREAD HiveSecurityLockOwner
;
383 LIST_ENTRY LRUViewListHead
;
384 LIST_ENTRY PinViewListHead
;
385 PFILE_OBJECT FileObject
;
386 UNICODE_STRING FileFullPath
;
387 UNICODE_STRING FileUserName
;
392 ULONG SecurityCacheSize
;
393 LONG SecurityHitHint
;
394 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
395 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
397 PCM_KEY_CONTROL_BLOCK RootKcb
;
399 PWORK_QUEUE_ITEM UnloadWorkItem
;
400 BOOLEAN GrowOnlyMode
;
402 LIST_ENTRY KcbConvertListHead
;
403 LIST_ENTRY KnodeConvertListHead
;
404 PCM_CELL_REMAP_BLOCK CellRemapArray
;
405 CM_USE_COUNT_LOG UseCountLog
;
406 CM_USE_COUNT_LOG LockHiveLog
;
408 LIST_ENTRY TrustClassEntry
;
410 BOOLEAN HiveIsLoading
;
411 PKTHREAD CreatorOwner
;
415 // Cached Value Index
417 typedef struct _CM_CACHED_VALUE_INDEX
419 HCELL_INDEX CellIndex
;
423 ULONG_PTR List
[ANYSIZE_ARRAY
];
425 } CM_CACHED_VALUE_INDEX
, *PCM_CACHED_VALUE_INDEX
;
430 typedef struct _CM_CACHED_VALUE
432 USHORT DataCacheType
;
435 CM_KEY_VALUE KeyValue
;
436 } CM_CACHED_VALUE
, *PCM_CACHED_VALUE
;
441 typedef struct _HIVE_LIST_ENTRY
449 BOOLEAN ThreadFinished
;
450 BOOLEAN ThreadStarted
;
452 } HIVE_LIST_ENTRY
, *PHIVE_LIST_ENTRY
;
455 // Parse context for Key Object
457 typedef struct _CM_PARSE_CONTEXT
460 UNICODE_STRING Class
;
463 CM_KEY_REFERENCE ChildHive
;
464 HANDLE PredefinedHandle
;
466 BOOLEAN CreateOperation
;
467 PCMHIVE OriginatingPoint
;
468 } CM_PARSE_CONTEXT
, *PCM_PARSE_CONTEXT
;
471 // MultiFunction Adapter Recognizer Structure
473 typedef struct _CMP_MF_TYPE
476 USHORT InterfaceType
;
478 } CMP_MF_TYPE
, *PCMP_MF_TYPE
;
481 // System Control Vector
483 typedef struct _CM_SYSTEM_CONTROL_VECTOR
490 } CM_SYSTEM_CONTROL_VECTOR
, *PCM_SYSTEM_CONTROL_VECTOR
;
493 // Structure for CmpQueryValueDataFromCache
495 typedef struct _KEY_VALUE_INFORMATION
499 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation
;
500 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation
;
501 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation
;
502 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64
;
504 } KEY_VALUE_INFORMATION
, *PKEY_VALUE_INFORMATION
;
506 typedef struct _KEY_INFORMATION
510 KEY_BASIC_INFORMATION KeyBasicInformation
;
511 KEY_FULL_INFORMATION KeyFullInformation
;
512 KEY_NODE_INFORMATION KeyNodeInformation
;
514 } KEY_INFORMATION
, *PKEY_INFORMATION
;
516 ///////////////////////////////////////////////////////////////////////////////
518 // BUGBUG Old Hive Stuff for Temporary Support
520 NTSTATUS
CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1
, IN PVOID Argument2
);
521 ///////////////////////////////////////////////////////////////////////////////
524 // Mapped View Hive Functions
533 // Security Cache Functions
537 CmpInitSecurityCache(
542 // Value Cache Functions
544 VALUE_SEARCH_RETURN_TYPE
546 CmpFindValueByNameFromCache(
547 IN PCM_KEY_CONTROL_BLOCK Kcb
,
548 IN PCUNICODE_STRING Name
,
549 OUT PCM_CACHED_VALUE
**CachedValue
,
551 OUT PCM_KEY_VALUE
*Value
,
552 OUT BOOLEAN
*ValueIsCached
,
553 OUT PHCELL_INDEX CellToRelease
556 VALUE_SEARCH_RETURN_TYPE
558 CmpQueryKeyValueData(
559 IN PCM_KEY_CONTROL_BLOCK Kcb
,
560 IN PCM_CACHED_VALUE
*CachedValue
,
561 IN PCM_KEY_VALUE ValueKey
,
562 IN BOOLEAN ValueIsCached
,
563 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
564 IN PVOID KeyValueInformation
,
566 OUT PULONG ResultLength
,
570 VALUE_SEARCH_RETURN_TYPE
572 CmpGetValueListFromCache(
573 IN PCM_KEY_CONTROL_BLOCK Kcb
,
574 OUT PCELL_DATA
*CellData
,
575 OUT BOOLEAN
*IndexIsCached
,
576 OUT PHCELL_INDEX ValueListToRelease
579 VALUE_SEARCH_RETURN_TYPE
581 CmpGetValueKeyFromCache(
582 IN PCM_KEY_CONTROL_BLOCK Kcb
,
583 IN PCELL_DATA CellData
,
585 OUT PCM_CACHED_VALUE
**CachedValue
,
586 OUT PCM_KEY_VALUE
*Value
,
587 IN BOOLEAN IndexIsCached
,
588 OUT BOOLEAN
*ValueIsCached
,
589 OUT PHCELL_INDEX CellToRelease
592 VALUE_SEARCH_RETURN_TYPE
594 CmpCompareNewValueDataAgainstKCBCache(
595 IN PCM_KEY_CONTROL_BLOCK Kcb
,
596 IN PUNICODE_STRING ValueName
,
603 // Registry Validation Functions
613 // Notification Routines
618 IN PCM_KEY_CONTROL_BLOCK Kcb
,
631 // KCB Cache/Delay Routines
641 CmpInitCmPrivateDelayAlloc(
647 CmpInitCmPrivateAlloc(
653 CmpInitDelayDerefKCBEngine(
658 // Key Object Routines
663 IN PEPROCESS Process OPTIONAL
,
665 IN ACCESS_MASK GrantedAccess
,
666 IN ULONG ProcessHandleCount
,
667 IN ULONG SystemHandleCount
679 IN PVOID ParseObject
,
681 IN OUT PACCESS_STATE AccessState
,
682 IN KPROCESSOR_MODE AccessMode
,
684 IN OUT PUNICODE_STRING CompleteName
,
685 IN OUT PUNICODE_STRING RemainingName
,
686 IN OUT PVOID Context OPTIONAL
,
687 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
695 IN SECURITY_OPERATION_CODE OperationType
,
696 IN PSECURITY_INFORMATION SecurityInformation
,
697 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
698 IN OUT PULONG CapturedLength
,
699 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
700 IN POOL_TYPE PoolType
,
701 IN PGENERIC_MAPPING GenericMapping
708 IN BOOLEAN HasObjectName
,
709 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
711 OUT PULONG ReturnLength
,
712 IN KPROCESSOR_MODE AccessMode
725 IN PVOID HiveData OPTIONAL
,
729 IN PCUNICODE_STRING FileName OPTIONAL
,
735 CmpHiveRootSecurityDescriptor(
742 IN PUNICODE_STRING LinkName
,
743 IN HANDLE RootDirectory
,
746 IN PSECURITY_DESCRIPTOR SecurityDescriptor
752 IN PCUNICODE_STRING BaseName
,
753 IN PCWSTR Extension OPTIONAL
,
756 IN PULONG PrimaryDisposition
,
757 IN PULONG LogDisposition
,
758 IN BOOLEAN CreateAllowed
,
759 IN BOOLEAN MarkAsSystemHive
,
760 IN BOOLEAN NoBuffering
,
761 OUT PULONG ClusterSize OPTIONAL
767 IN PCUNICODE_STRING HiveName
,
776 CmpInitializeHiveList(
781 // Registry Utility Functions
785 CmpTestRegistryLockExclusive(
797 CmpLockRegistryExclusive(
818 CmpAllocateDelayItem(
830 CmpDelayDerefKeyControlBlock(
831 IN PCM_KEY_CONTROL_BLOCK Kcb
836 CmpAddToDelayedClose(
837 IN PCM_KEY_CONTROL_BLOCK Kcb
,
838 IN BOOLEAN LockHeldExclusively
843 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb
);
847 CmpInitializeDelayedCloseTable(
854 PCM_KEY_CONTROL_BLOCK
856 CmpCreateKeyControlBlock(
858 IN HCELL_INDEX Index
,
859 IN PCM_KEY_NODE Node
,
860 IN PCM_KEY_CONTROL_BLOCK Parent
,
862 IN PUNICODE_STRING KeyName
865 PCM_KEY_CONTROL_BLOCK
867 CmpAllocateKeyControlBlock(
873 CmpFreeKeyControlBlock(
874 IN PCM_KEY_CONTROL_BLOCK Kcb
879 CmpRemoveKeyControlBlock(
880 IN PCM_KEY_CONTROL_BLOCK Kcb
885 CmpCleanUpKcbValueCache(
886 IN PCM_KEY_CONTROL_BLOCK Kcb
891 CmpCleanUpKcbCacheWithLock(
892 IN PCM_KEY_CONTROL_BLOCK Kcb
,
893 IN BOOLEAN LockHeldExclusively
898 CmpCleanUpSubKeyInfo(
899 IN PCM_KEY_CONTROL_BLOCK Kcb
905 IN PCM_KEY_CONTROL_BLOCK Kcb
910 CmpDereferenceKeyControlBlockWithLock(
911 IN PCM_KEY_CONTROL_BLOCK Kcb
,
912 IN BOOLEAN LockHeldExclusively
917 CmpDereferenceKeyControlBlock(
918 IN PCM_KEY_CONTROL_BLOCK Kcb
923 EnlistKeyBodyWithKCB(
924 IN PCM_KEY_BODY KeyObject
,
930 DelistKeyBodyFromKCB(
931 IN PCM_KEY_BODY KeyBody
,
945 CmpAcquireTwoKcbLocksExclusiveByKey(
952 CmpReleaseTwoKcbLockByKey(
962 CmpCompareCompressedName(
963 IN PCUNICODE_STRING SearchName
,
964 IN PWCHAR CompressedName
,
972 IN PUNICODE_STRING Name
977 CmpCompressedNameSize(
984 CmpCopyCompressedName(
985 IN PWCHAR Destination
,
986 IN ULONG DestinationLength
,
988 IN ULONG SourceLength
995 IN PWCHAR Destination
,
996 IN PUNICODE_STRING Source
1003 IN PCHILD_LIST ChildList
,
1004 IN PUNICODE_STRING Name
,
1005 IN PULONG ChildIndex
,
1006 IN PHCELL_INDEX CellIndex
1015 IN OUT PUNICODE_STRING RemainingName
,
1016 OUT PUNICODE_STRING NextName
,
1017 OUT PBOOLEAN LastName
1021 // Command Routines (Flush, Open, Close, Init);
1026 IN BOOLEAN ForceFlush
1038 IN BOOLEAN SetupBoot
1044 IN POBJECT_ATTRIBUTES FileAttributes
,
1045 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext
,
1046 IN OUT PBOOLEAN Allocate
,
1047 OUT PCMHIVE
*NewHive
,
1058 // Open/Create Routines
1064 IN HCELL_INDEX Cell
,
1065 IN PACCESS_STATE AccessState
,
1066 IN PUNICODE_STRING Name
,
1067 IN KPROCESSOR_MODE AccessMode
,
1068 IN PCM_PARSE_CONTEXT Context
,
1069 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1077 IN HCELL_INDEX Cell
,
1078 IN PACCESS_STATE AccessState
,
1079 IN UNICODE_STRING Name
,
1080 IN KPROCESSOR_MODE AccessMode
,
1081 IN ULONG CreateOptions
,
1082 IN PCM_PARSE_CONTEXT Context
,
1083 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1088 // Cell Index Routines
1093 CmpFindSubKeyByName(
1095 IN PCM_KEY_NODE Parent
,
1096 IN PCUNICODE_STRING SearchName
1101 CmpFindSubKeyByNumber(
1103 IN PCM_KEY_NODE Node
,
1111 IN PCUNICODE_STRING Name
,
1112 IN BOOLEAN AllowSeparators
1119 IN HCELL_INDEX Parent
,
1120 IN HCELL_INDEX Child
1127 IN HCELL_INDEX ParentKey
,
1128 IN HCELL_INDEX TargetKey
1135 HCELL_INDEX ParentKey
,
1136 HCELL_INDEX TargetKey
1140 // Cell Value Routines
1146 IN PCM_KEY_NODE KeyNode
,
1147 IN PUNICODE_STRING Name
1154 IN PCM_KEY_VALUE Value
,
1164 IN ULONG StorageType
,
1165 IN HCELL_INDEX ValueCell
,
1166 OUT PHCELL_INDEX DataCell
1173 IN HCELL_INDEX ValueCell
,
1176 IN OUT PCHILD_LIST ChildList
1188 CmpMarkValueDataDirty(
1190 IN PCM_KEY_VALUE Value
1197 IN HCELL_INDEX DataCell
,
1203 CmpRemoveValueFromList(
1206 IN OUT PCHILD_LIST ChildList
1213 IN PCM_KEY_VALUE Value
,
1216 OUT PBOOLEAN BufferAllocated
,
1217 OUT PHCELL_INDEX CellToRelease
1226 IN PHHIVE SystemHive
,
1227 IN HCELL_INDEX RootCell
,
1228 IN PUNICODE_STRING SelectKeyName
,
1229 OUT PBOOLEAN AutoSelect
1234 CmGetSystemControlValues(
1235 IN PVOID SystemHiveData
,
1236 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1241 // Hardware Configuration Routines
1245 CmpInitializeRegistryNode(
1246 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry
,
1247 IN HANDLE NodeHandle
,
1248 OUT PHANDLE NewHandle
,
1249 IN INTERFACE_TYPE InterfaceType
,
1251 IN PUSHORT DeviceIndexTable
1256 CmpInitializeMachineDependentConfiguration(
1257 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1262 CmpInitializeHardwareConfiguration(
1263 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1272 IN EVENT_TYPE EventType
,
1273 OUT PHANDLE EventHandle
,
1295 IN PHHIVE RegistryHive
,
1297 IN OUT PULONG FileOffset
,
1299 IN SIZE_T BufferLength
1305 IN PHHIVE RegistryHive
,
1307 IN OUT PULONG FileOffset
,
1309 IN SIZE_T BufferLength
1315 IN PHHIVE RegistryHive
,
1318 IN ULONG OldFileSize
1324 IN PHHIVE RegistryHive
,
1326 IN OUT PLARGE_INTEGER FileOffset
,
1331 // Configuration Manager side of Registry System Calls
1335 CmEnumerateValueKey(
1336 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1338 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1339 IN PVOID KeyValueInformation
,
1341 IN PULONG ResultLength
);
1346 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1347 IN PUNICODE_STRING ValueName
,
1354 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1355 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1356 IN PVOID KeyInformation
,
1358 IN PULONG ResultLength
1363 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1365 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1366 IN PVOID KeyInformation
,
1368 IN PULONG ResultLength
1374 IN PCM_KEY_BODY KeyBody
1380 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1381 IN BOOLEAN EclusiveLock
1387 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1388 IN UNICODE_STRING ValueName
1394 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1395 IN UNICODE_STRING ValueName
,
1396 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1397 IN PVOID KeyValueInformation
,
1399 IN PULONG ResultLength
1405 IN POBJECT_ATTRIBUTES TargetKey
,
1406 IN POBJECT_ATTRIBUTES SourceFile
,
1408 IN PCM_KEY_BODY KeyBody
1412 // Startup and Shutdown
1427 // Global variables accessible from all of Cm
1429 extern BOOLEAN CmpSpecialBootCondition
;
1430 extern BOOLEAN CmpFlushOnLockRelease
;
1431 extern BOOLEAN CmpShareSystemHives
;
1432 extern BOOLEAN CmpMiniNTBoot
;
1433 extern EX_PUSH_LOCK CmpHiveListHeadLock
, CmpLoadHiveLock
;
1434 extern LIST_ENTRY CmpHiveListHead
;
1435 extern POBJECT_TYPE CmpKeyObjectType
;
1436 extern ERESOURCE CmpRegistryLock
;
1437 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
;
1438 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
;
1439 extern KGUARDED_MUTEX CmpDelayedCloseTableLock
;
1440 extern CMHIVE CmControlHive
;
1441 extern WCHAR CmDefaultLanguageId
[];
1442 extern ULONG CmDefaultLanguageIdLength
;
1443 extern ULONG CmDefaultLanguageIdType
;
1444 extern WCHAR CmInstallUILanguageId
[];
1445 extern ULONG CmInstallUILanguageIdLength
;
1446 extern ULONG CmInstallUILanguageIdType
;
1447 extern LANGID PsInstallUILanguageId
;
1448 extern LANGID PsDefaultUILanguageId
;
1449 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector
[];
1450 extern ULONG CmpConfigurationAreaSize
;
1451 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData
;
1452 extern UNICODE_STRING CmTypeName
[];
1453 extern UNICODE_STRING CmClassName
[];
1454 extern CMP_MF_TYPE CmpMultifunctionTypes
[];
1455 extern USHORT CmpUnknownBusCount
;
1456 extern ULONG CmpTypeCount
[MaximumType
+ 1];
1457 extern HIVE_LIST_ENTRY CmpMachineHiveList
[];
1458 extern UNICODE_STRING CmSymbolicLinkValueName
;
1459 extern UNICODE_STRING CmpSystemStartOptions
;
1460 extern UNICODE_STRING CmpLoadOptions
;
1461 extern BOOLEAN CmSelfHeal
;
1462 extern BOOLEAN CmpSelfHeal
;
1463 extern ULONG CmpBootType
;
1464 extern HANDLE CmpRegistryRootHandle
;
1465 extern BOOLEAN ExpInTextModeSetup
;
1466 extern BOOLEAN InitIsWinPEMode
;
1467 extern ULONG CmpHashTableSize
;
1468 extern ULONG CmpDelayedCloseSize
, CmpDelayedCloseIndex
;
1469 extern BOOLEAN CmpNoWrite
;
1470 extern BOOLEAN CmpForceForceFlush
;
1471 extern BOOLEAN CmpWasSetupBoot
;
1472 extern PCMHIVE CmiVolatileHive
;
1473 extern LIST_ENTRY CmiKeyObjectListHead
;
1474 extern BOOLEAN CmpHoldLazyFlush
;
1477 // Inlined functions