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 #include <cmreslist.h>
16 // Define this if you want debugging support
18 #define _CM_DEBUG_ 0x00
21 // These define the Debug Masks Supported
23 #define CM_HANDLE_DEBUG 0x01
24 #define CM_NAMESPACE_DEBUG 0x02
25 #define CM_SECURITY_DEBUG 0x04
26 #define CM_REFERENCE_DEBUG 0x08
27 #define CM_CALLBACK_DEBUG 0x10
30 // Debug/Tracing support
33 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
34 #define CMTRACE DbgPrintEx
36 #define CMTRACE(x, ...) \
37 if (x & CmpTraceLevel) DbgPrint(__VA_ARGS__)
40 #define CMTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
44 // Hack since bigkeys are not yet supported
46 #define ASSERT_VALUE_BIG(h, s) \
47 ASSERTMSG("Big keys not supported!\n", !CmpIsKeyValueBig(h, s));
50 // CM_KEY_CONTROL_BLOCK Signatures
52 #define CM_KCB_SIGNATURE 'bKmC'
53 #define CM_KCB_INVALID_SIGNATURE '4FmC'
56 // CM_KEY_CONTROL_BLOCK ExtFlags
58 #define CM_KCB_NO_SUBKEY 0x01
59 #define CM_KCB_SUBKEY_ONE 0x02
60 #define CM_KCB_SUBKEY_HINT 0x04
61 #define CM_KCB_SYM_LINK_FOUND 0x08
62 #define CM_KCB_KEY_NON_EXIST 0x10
63 #define CM_KCB_NO_DELAY_CLOSE 0x20
64 #define CM_KCB_INVALID_CACHED_INFO 0x40
65 #define CM_KCB_READ_ONLY_KEY 0x80
70 #define CM_KEY_BODY_TYPE 0x6B793032
75 #define CM_KEY_VALUE_SMALL 0x4
76 #define CM_KEY_VALUE_BIG 0x3FD8
77 #define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000
80 // Number of various lists and hashes
82 #define CMP_SECURITY_HASH_LISTS 64
83 #define CMP_MAX_CALLBACKS 100
88 #define CMP_HASH_IRRATIONAL 314159269
89 #define CMP_HASH_PRIME 1000000007
92 // CmpCreateKeyControlBlock Flags
94 #define CMP_CREATE_FAKE_KCB 0x1
95 #define CMP_LOCK_HASHES_FOR_KCB 0x2
98 // CmpDoCreate and CmpDoOpen flags
100 #define CMP_CREATE_KCB_KCB_LOCKED 0x2
101 #define CMP_OPEN_KCB_NO_CREATE 0x4
104 // EnlistKeyBodyWithKCB Flags
106 #define CMP_ENLIST_KCB_LOCKED_SHARED 0x1
107 #define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE 0x2
112 #define CMP_UNLOCK_KCB_LOCKED 0x1
113 #define CMP_UNLOCK_REGISTRY_LOCKED 0x2
116 // Maximum size of Value Cache
118 #define MAXIMUM_CACHED_DATA 2 * PAGE_SIZE
121 // Hives to load on startup
123 #define CM_NUMBER_OF_MACHINE_HIVES 6
126 // Number of items that can fit inside an Allocation Page
128 #define CM_KCBS_PER_PAGE \
129 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_KEY_CONTROL_BLOCK))
130 #define CM_DELAYS_PER_PAGE \
131 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_DELAY_ALLOC))
134 // Value Search Results
136 typedef enum _VALUE_SEARCH_RETURN_TYPE
139 SearchNeedExclusiveLock
,
141 } VALUE_SEARCH_RETURN_TYPE
;
146 typedef struct _CM_KEY_HASH
149 struct _CM_KEY_HASH
*NextHash
;
152 } CM_KEY_HASH
, *PCM_KEY_HASH
;
155 // Key Hash Table Entry
157 typedef struct _CM_KEY_HASH_TABLE_ENTRY
162 } CM_KEY_HASH_TABLE_ENTRY
, *PCM_KEY_HASH_TABLE_ENTRY
;
167 typedef struct _CM_NAME_HASH
170 struct _CM_NAME_HASH
*NextHash
;
172 WCHAR Name
[ANYSIZE_ARRAY
];
173 } CM_NAME_HASH
, *PCM_NAME_HASH
;
176 // Name Hash Table Entry
178 typedef struct _CM_NAME_HASH_TABLE_ENTRY
182 } CM_NAME_HASH_TABLE_ENTRY
, *PCM_NAME_HASH_TABLE_ENTRY
;
185 // Key Security Cache
187 typedef struct _CM_KEY_SECURITY_CACHE
192 ULONG DescriptorLength
;
193 SECURITY_DESCRIPTOR_RELATIVE Descriptor
;
194 } CM_KEY_SECURITY_CACHE
, *PCM_KEY_SECURITY_CACHE
;
197 // Key Security Cache Entry
199 typedef struct _CM_KEY_SECURITY_CACHE_ENTRY
202 PCM_KEY_SECURITY_CACHE CachedSecurity
;
203 } CM_KEY_SECURITY_CACHE_ENTRY
, *PCM_KEY_SECURITY_CACHE_ENTRY
;
208 typedef struct _CACHED_CHILD_LIST
214 struct _CM_KEY_CONTROL_BLOCK
*RealKcb
;
216 } CACHED_CHILD_LIST
, *PCACHED_CHILD_LIST
;
221 typedef struct _CM_INDEX_HINT_BLOCK
224 ULONG HashKey
[ANYSIZE_ARRAY
];
225 } CM_INDEX_HINT_BLOCK
, *PCM_INDEX_HINT_BLOCK
;
230 typedef struct _CM_KEY_BODY
233 struct _CM_KEY_CONTROL_BLOCK
*KeyControlBlock
;
234 struct _CM_NOTIFY_BLOCK
*NotifyBlock
;
236 LIST_ENTRY KeyBodyList
;
237 } CM_KEY_BODY
, *PCM_KEY_BODY
;
240 // Name Control Block (NCB)
242 typedef struct _CM_NAME_CONTROL_BLOCK
248 CM_NAME_HASH NameHash
;
252 PCM_KEY_HASH NextHash
;
254 WCHAR Name
[ANYSIZE_ARRAY
];
257 } CM_NAME_CONTROL_BLOCK
, *PCM_NAME_CONTROL_BLOCK
;
260 // Key Control Block (KCB)
262 typedef struct _CM_KEY_CONTROL_BLOCK
269 ULONG PrivateAlloc
:1;
271 ULONG DelayedCloseIndex
:12;
272 ULONG TotalLevels
:10;
280 PCM_KEY_HASH NextHash
;
285 struct _CM_KEY_CONTROL_BLOCK
*ParentKcb
;
286 PCM_NAME_CONTROL_BLOCK NameBlock
;
287 PCM_KEY_SECURITY_CACHE CachedSecurity
;
288 CACHED_CHILD_LIST ValueCache
;
291 PCM_INDEX_HINT_BLOCK IndexHint
;
297 LIST_ENTRY KeyBodyListHead
;
298 LIST_ENTRY FreeListEntry
;
300 PCM_KEY_BODY KeyBodyArray
[4];
301 PVOID DelayCloseEntry
;
302 LARGE_INTEGER KcbLastWriteTime
;
303 USHORT KcbMaxNameLen
;
304 USHORT KcbMaxValueNameLen
;
305 ULONG KcbMaxValueDataLen
;
308 ULONG KcbUserFlags
: 4;
309 ULONG KcbVirtControlFlags
: 4;
314 } CM_KEY_CONTROL_BLOCK
, *PCM_KEY_CONTROL_BLOCK
;
319 typedef struct _CM_NOTIFY_BLOCK
323 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
324 PCM_KEY_BODY KeyBody
;
327 ULONG NotifyPending
:31;
328 } CM_NOTIFY_BLOCK
, *PCM_NOTIFY_BLOCK
;
333 typedef struct _CM_CELL_REMAP_BLOCK
337 } CM_CELL_REMAP_BLOCK
, *PCM_CELL_REMAP_BLOCK
;
342 typedef struct _CM_ALLOC_PAGE
347 } CM_ALLOC_PAGE
, *PCM_ALLOC_PAGE
;
350 // Allocation Page Entry
352 typedef struct _CM_DELAY_ALLOC
354 LIST_ENTRY ListEntry
;
355 PCM_KEY_CONTROL_BLOCK Kcb
;
356 } CM_DELAY_ALLOC
, *PCM_DELAY_ALLOC
;
359 // Delayed Close Entry
361 typedef struct _CM_DELAYED_CLOSE_ENTRY
363 LIST_ENTRY DelayedLRUList
;
364 PCM_KEY_CONTROL_BLOCK KeyControlBlock
;
365 } CM_DELAYED_CLOSE_ENTRY
, *PCM_DELAYED_CLOSE_ENTRY
;
368 // Delayed KCB Dereference Entry
370 typedef struct _CM_DELAY_DEREF_KCB_ITEM
372 LIST_ENTRY ListEntry
;
373 PCM_KEY_CONTROL_BLOCK Kcb
;
374 } CM_DELAY_DEREF_KCB_ITEM
, *PCM_DELAY_DEREF_KCB_ITEM
;
377 // Use Count Log and Entry
379 typedef struct _CM_USE_COUNT_LOG_ENTRY
383 } CM_USE_COUNT_LOG_ENTRY
, *PCM_USE_COUNT_LOG_ENTRY
;
385 typedef struct _CM_USE_COUNT_LOG
389 CM_USE_COUNT_LOG_ENTRY Log
[32];
390 } CM_USE_COUNT_LOG
, *PCM_USE_COUNT_LOG
;
393 // Configuration Manager Hive Structure
395 typedef struct _CMHIVE
398 HANDLE FileHandles
[HFILE_TYPE_MAX
];
399 LIST_ENTRY NotifyList
;
401 EX_PUSH_LOCK HiveLock
;
402 PKTHREAD HiveLockOwner
;
403 PKGUARDED_MUTEX ViewLock
;
404 PKTHREAD ViewLockOwner
;
405 EX_PUSH_LOCK WriterLock
;
406 PKTHREAD WriterLockOwner
;
407 PERESOURCE FlusherLock
;
408 EX_PUSH_LOCK SecurityLock
;
409 PKTHREAD HiveSecurityLockOwner
;
410 LIST_ENTRY LRUViewListHead
;
411 LIST_ENTRY PinViewListHead
;
412 PFILE_OBJECT FileObject
;
413 UNICODE_STRING FileFullPath
;
414 UNICODE_STRING FileUserName
;
419 ULONG SecurityCacheSize
;
420 LONG SecurityHitHint
;
421 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache
;
422 LIST_ENTRY SecurityHash
[CMP_SECURITY_HASH_LISTS
];
424 PCM_KEY_CONTROL_BLOCK RootKcb
;
426 PWORK_QUEUE_ITEM UnloadWorkItem
;
427 BOOLEAN GrowOnlyMode
;
429 LIST_ENTRY KcbConvertListHead
;
430 LIST_ENTRY KnodeConvertListHead
;
431 PCM_CELL_REMAP_BLOCK CellRemapArray
;
432 CM_USE_COUNT_LOG UseCountLog
;
433 CM_USE_COUNT_LOG LockHiveLog
;
435 LIST_ENTRY TrustClassEntry
;
437 BOOLEAN HiveIsLoading
;
438 PKTHREAD CreatorOwner
;
442 // Cached Value Index
444 typedef struct _CM_CACHED_VALUE_INDEX
446 HCELL_INDEX CellIndex
;
450 ULONG_PTR List
[ANYSIZE_ARRAY
];
452 } CM_CACHED_VALUE_INDEX
, *PCM_CACHED_VALUE_INDEX
;
457 typedef struct _CM_CACHED_VALUE
459 USHORT DataCacheType
;
462 CM_KEY_VALUE KeyValue
;
463 } CM_CACHED_VALUE
, *PCM_CACHED_VALUE
;
468 typedef struct _HIVE_LIST_ENTRY
476 BOOLEAN ThreadFinished
;
477 BOOLEAN ThreadStarted
;
479 } HIVE_LIST_ENTRY
, *PHIVE_LIST_ENTRY
;
482 // Parse context for Key Object
484 typedef struct _CM_PARSE_CONTEXT
487 UNICODE_STRING Class
;
490 CM_KEY_REFERENCE ChildHive
;
491 HANDLE PredefinedHandle
;
493 BOOLEAN CreateOperation
;
494 PCMHIVE OriginatingPoint
;
495 } CM_PARSE_CONTEXT
, *PCM_PARSE_CONTEXT
;
498 // MultiFunction Adapter Recognizer Structure
500 typedef struct _CMP_MF_TYPE
503 USHORT InterfaceType
;
505 } CMP_MF_TYPE
, *PCMP_MF_TYPE
;
508 // System Control Vector
510 typedef struct _CM_SYSTEM_CONTROL_VECTOR
517 } CM_SYSTEM_CONTROL_VECTOR
, *PCM_SYSTEM_CONTROL_VECTOR
;
520 // Structure for CmpQueryValueDataFromCache
522 typedef struct _KEY_VALUE_INFORMATION
526 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation
;
527 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation
;
528 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation
;
529 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64
;
531 } KEY_VALUE_INFORMATION
, *PKEY_VALUE_INFORMATION
;
533 typedef struct _KEY_INFORMATION
537 KEY_BASIC_INFORMATION KeyBasicInformation
;
538 KEY_FULL_INFORMATION KeyFullInformation
;
539 KEY_NODE_INFORMATION KeyNodeInformation
;
541 } KEY_INFORMATION
, *PKEY_INFORMATION
;
543 ///////////////////////////////////////////////////////////////////////////////
545 // BUGBUG Old Hive Stuff for Temporary Support
547 NTSTATUS
CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1
, IN PVOID Argument2
);
548 ///////////////////////////////////////////////////////////////////////////////
551 // Mapped View Hive Functions
561 CmpDestroyHiveViewList(
566 // Security Cache Functions
570 CmpInitSecurityCache(
576 CmpDestroySecurityCache(
581 // Value Cache Functions
583 VALUE_SEARCH_RETURN_TYPE
585 CmpFindValueByNameFromCache(
586 IN PCM_KEY_CONTROL_BLOCK Kcb
,
587 IN PCUNICODE_STRING Name
,
588 OUT PCM_CACHED_VALUE
**CachedValue
,
590 OUT PCM_KEY_VALUE
*Value
,
591 OUT BOOLEAN
*ValueIsCached
,
592 OUT PHCELL_INDEX CellToRelease
595 VALUE_SEARCH_RETURN_TYPE
597 CmpQueryKeyValueData(
598 IN PCM_KEY_CONTROL_BLOCK Kcb
,
599 IN PCM_CACHED_VALUE
*CachedValue
,
600 IN PCM_KEY_VALUE ValueKey
,
601 IN BOOLEAN ValueIsCached
,
602 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
603 IN PVOID KeyValueInformation
,
605 OUT PULONG ResultLength
,
609 VALUE_SEARCH_RETURN_TYPE
611 CmpGetValueListFromCache(
612 IN PCM_KEY_CONTROL_BLOCK Kcb
,
613 OUT PCELL_DATA
*CellData
,
614 OUT BOOLEAN
*IndexIsCached
,
615 OUT PHCELL_INDEX ValueListToRelease
618 VALUE_SEARCH_RETURN_TYPE
620 CmpGetValueKeyFromCache(
621 IN PCM_KEY_CONTROL_BLOCK Kcb
,
622 IN PCELL_DATA CellData
,
624 OUT PCM_CACHED_VALUE
**CachedValue
,
625 OUT PCM_KEY_VALUE
*Value
,
626 IN BOOLEAN IndexIsCached
,
627 OUT BOOLEAN
*ValueIsCached
,
628 OUT PHCELL_INDEX CellToRelease
631 VALUE_SEARCH_RETURN_TYPE
633 CmpCompareNewValueDataAgainstKCBCache(
634 IN PCM_KEY_CONTROL_BLOCK Kcb
,
635 IN PUNICODE_STRING ValueName
,
642 // Registry Validation Functions
652 // Hive List Routines
658 OUT PUNICODE_STRING HiveName
663 CmpAddToHiveFileList(
669 CmpRemoveFromHiveFileList(
678 CmpSetGlobalQuotaAllowed(
683 // Notification Routines
688 IN PCM_KEY_CONTROL_BLOCK Kcb
,
697 IN PCM_KEY_BODY KeyBody
,
709 // KCB Cache/Delay Routines
721 CmpInitCmPrivateDelayAlloc(
728 CmpInitCmPrivateAlloc(
735 CmpInitDelayDerefKCBEngine(
740 // Key Object Routines
745 IN PEPROCESS Process OPTIONAL
,
747 IN ACCESS_MASK GrantedAccess
,
748 IN ULONG ProcessHandleCount
,
749 IN ULONG SystemHandleCount
761 IN PVOID ParseObject
,
763 IN OUT PACCESS_STATE AccessState
,
764 IN KPROCESSOR_MODE AccessMode
,
766 IN OUT PUNICODE_STRING CompleteName
,
767 IN OUT PUNICODE_STRING RemainingName
,
768 IN OUT PVOID Context OPTIONAL
,
769 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
777 IN SECURITY_OPERATION_CODE OperationType
,
778 IN PSECURITY_INFORMATION SecurityInformation
,
779 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
780 IN OUT PULONG CapturedLength
,
781 IN OUT PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
782 IN POOL_TYPE PoolType
,
783 IN PGENERIC_MAPPING GenericMapping
790 IN BOOLEAN HasObjectName
,
791 OUT POBJECT_NAME_INFORMATION ObjectNameInfo
,
793 OUT PULONG ReturnLength
,
794 IN KPROCESSOR_MODE AccessMode
804 IN ULONG OperationType
,
807 IN PVOID HiveData OPTIONAL
,
811 IN PCUNICODE_STRING FileName OPTIONAL
,
823 CmpHiveRootSecurityDescriptor(
830 IN PUNICODE_STRING LinkName
,
831 IN HANDLE RootDirectory
,
834 IN PSECURITY_DESCRIPTOR SecurityDescriptor
840 IN PCUNICODE_STRING BaseName
,
841 IN PCWSTR Extension OPTIONAL
,
844 OUT PULONG PrimaryDisposition
,
845 OUT PULONG LogDisposition
,
846 IN BOOLEAN CreateAllowed
,
847 IN BOOLEAN MarkAsSystemHive
,
848 IN BOOLEAN NoBuffering
,
849 OUT PULONG ClusterSize OPTIONAL
861 IN PCUNICODE_STRING HiveName
,
870 CmpInitializeHiveList(
875 // Registry Utility Functions
879 CmpTestRegistryLockExclusive(
891 CmpLockRegistryExclusive(
909 CmpLockHiveFlusherExclusive(
915 CmpLockHiveFlusherShared(
921 CmpTestHiveFlusherLockExclusive(
927 CmpTestHiveFlusherLockShared(
933 CmpUnlockHiveFlusher(
942 CmpAllocateDelayItem(
954 CmpDelayDerefKeyControlBlock(
955 IN PCM_KEY_CONTROL_BLOCK Kcb
960 CmpAddToDelayedClose(
961 IN PCM_KEY_CONTROL_BLOCK Kcb
,
962 IN BOOLEAN LockHeldExclusively
967 CmpArmDelayedCloseTimer(
973 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb
);
978 CmpInitializeDelayedCloseTable(
985 PCM_KEY_CONTROL_BLOCK
987 CmpCreateKeyControlBlock(
989 IN HCELL_INDEX Index
,
990 IN PCM_KEY_NODE Node
,
991 IN PCM_KEY_CONTROL_BLOCK Parent
,
993 IN PUNICODE_STRING KeyName
996 PCM_KEY_CONTROL_BLOCK
998 CmpAllocateKeyControlBlock(
1004 CmpFreeKeyControlBlock(
1005 IN PCM_KEY_CONTROL_BLOCK Kcb
1010 CmpRemoveKeyControlBlock(
1011 IN PCM_KEY_CONTROL_BLOCK Kcb
1016 CmpCleanUpKcbValueCache(
1017 IN PCM_KEY_CONTROL_BLOCK Kcb
1022 CmpCleanUpKcbCacheWithLock(
1023 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1024 IN BOOLEAN LockHeldExclusively
1029 CmpCleanUpSubKeyInfo(
1030 IN PCM_KEY_CONTROL_BLOCK Kcb
1036 IN PCM_KEY_CONTROL_BLOCK Kcb
1041 CmpReferenceKeyControlBlock(
1042 IN PCM_KEY_CONTROL_BLOCK Kcb
1047 CmpDereferenceKeyControlBlockWithLock(
1048 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1049 IN BOOLEAN LockHeldExclusively
1054 CmpDereferenceKeyControlBlock(
1055 IN PCM_KEY_CONTROL_BLOCK Kcb
1060 EnlistKeyBodyWithKCB(
1061 IN PCM_KEY_BODY KeyObject
,
1067 DelistKeyBodyFromKCB(
1068 IN PCM_KEY_BODY KeyBody
,
1074 CmpAcquireTwoKcbLocksExclusiveByKey(
1081 CmpReleaseTwoKcbLockByKey(
1088 CmpFlushNotifiesOnKeyBodyList(
1089 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1099 IN OUT PUNICODE_STRING RemainingName
,
1100 OUT PUNICODE_STRING NextName
,
1101 OUT PBOOLEAN LastName
1105 // Command Routines (Flush, Open, Close, Init);
1110 IN BOOLEAN ForceFlush
1122 IN BOOLEAN SetupBoot
1128 IN POBJECT_ATTRIBUTES FileAttributes
,
1129 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext
,
1130 IN OUT PBOOLEAN Allocate
,
1131 OUT PCMHIVE
*NewHive
,
1142 // Open/Create Routines
1148 IN HCELL_INDEX Cell
,
1149 IN PACCESS_STATE AccessState
,
1150 IN PUNICODE_STRING Name
,
1151 IN KPROCESSOR_MODE AccessMode
,
1152 IN PCM_PARSE_CONTEXT Context
,
1153 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1161 IN HCELL_INDEX Cell
,
1162 IN PACCESS_STATE AccessState
,
1163 IN UNICODE_STRING Name
,
1164 IN KPROCESSOR_MODE AccessMode
,
1165 IN ULONG CreateOptions
,
1166 IN PCM_PARSE_CONTEXT Context
,
1167 IN PCM_KEY_CONTROL_BLOCK ParentKcb
,
1177 CmGetSystemControlValues(
1178 IN PVOID SystemHiveData
,
1179 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1184 CmpSaveBootControlSet(
1185 IN USHORT ControlSet
1189 // Hardware Configuration Routines
1194 CmpInitializeRegistryNode(
1195 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry
,
1196 IN HANDLE NodeHandle
,
1197 OUT PHANDLE NewHandle
,
1198 IN INTERFACE_TYPE InterfaceType
,
1200 IN PUSHORT DeviceIndexTable
1205 CmpInitializeMachineDependentConfiguration(
1206 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1212 CmpInitializeHardwareConfiguration(
1213 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1222 IN EVENT_TYPE EventType
,
1223 OUT PHANDLE EventHandle
,
1245 IN PHHIVE RegistryHive
,
1247 IN OUT PULONG FileOffset
,
1249 IN SIZE_T BufferLength
1255 IN PHHIVE RegistryHive
,
1257 IN OUT PULONG FileOffset
,
1259 IN SIZE_T BufferLength
1265 IN PHHIVE RegistryHive
,
1268 IN ULONG OldFileSize
1274 IN PHHIVE RegistryHive
,
1276 IN OUT PLARGE_INTEGER FileOffset
,
1281 // Configuration Manager side of Registry System Calls
1285 CmEnumerateValueKey(
1286 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1288 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1289 IN PVOID KeyValueInformation
,
1291 IN PULONG ResultLength
);
1296 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1297 IN PUNICODE_STRING ValueName
,
1304 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1305 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1306 IN PVOID KeyInformation
,
1308 IN PULONG ResultLength
1313 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb
,
1315 IN KEY_INFORMATION_CLASS KeyInformationClass
,
1316 IN PVOID KeyInformation
,
1318 IN PULONG ResultLength
1324 IN PCM_KEY_BODY KeyBody
1330 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1331 IN BOOLEAN EclusiveLock
1337 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1338 IN UNICODE_STRING ValueName
1344 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1345 IN UNICODE_STRING ValueName
,
1346 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
1347 IN PVOID KeyValueInformation
,
1349 IN PULONG ResultLength
1355 IN POBJECT_ATTRIBUTES TargetKey
,
1356 IN POBJECT_ATTRIBUTES SourceFile
,
1358 IN PCM_KEY_BODY KeyBody
1364 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1370 CmpEnumerateOpenSubKeys(
1371 IN PCM_KEY_CONTROL_BLOCK RootKcb
,
1372 IN BOOLEAN RemoveEmptyCacheEntries
,
1373 IN BOOLEAN DereferenceOpenedEntries
1379 IN PHHIVE SourceHive
,
1380 IN HCELL_INDEX SourceCell
,
1381 IN PHHIVE DestinationHive
,
1382 IN HSTORAGE_TYPE StorageType
1388 IN PHHIVE SourceHive
,
1389 IN HCELL_INDEX SrcKeyCell
,
1390 IN PHHIVE DestinationHive
,
1391 IN HSTORAGE_TYPE StorageType
,
1392 OUT PHCELL_INDEX DestKeyCell OPTIONAL
1398 IN PCM_KEY_CONTROL_BLOCK Kcb
,
1399 IN HANDLE FileHandle
,
1406 IN PCM_KEY_CONTROL_BLOCK HighKcb
,
1407 IN PCM_KEY_CONTROL_BLOCK LowKcb
,
1408 IN HANDLE FileHandle
1412 // Startup and Shutdown
1429 CmSetLazyFlushState(
1440 // Driver List Routines
1445 CmGetSystemDriverList(
1450 // Global variables accessible from all of Cm
1452 extern ULONG CmpTraceLevel
;
1453 extern BOOLEAN CmpSpecialBootCondition
;
1454 extern BOOLEAN CmpFlushOnLockRelease
;
1455 extern BOOLEAN CmpShareSystemHives
;
1456 extern BOOLEAN CmpMiniNTBoot
;
1457 extern BOOLEAN CmpNoVolatileCreates
;
1458 extern EX_PUSH_LOCK CmpHiveListHeadLock
, CmpLoadHiveLock
;
1459 extern LIST_ENTRY CmpHiveListHead
;
1460 extern POBJECT_TYPE CmpKeyObjectType
;
1461 extern ERESOURCE CmpRegistryLock
;
1462 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
;
1463 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
;
1464 extern KGUARDED_MUTEX CmpDelayedCloseTableLock
;
1465 extern CMHIVE CmControlHive
;
1466 extern WCHAR CmDefaultLanguageId
[];
1467 extern ULONG CmDefaultLanguageIdLength
;
1468 extern ULONG CmDefaultLanguageIdType
;
1469 extern WCHAR CmInstallUILanguageId
[];
1470 extern ULONG CmInstallUILanguageIdLength
;
1471 extern ULONG CmInstallUILanguageIdType
;
1472 extern ULONG CmNtGlobalFlag
;
1473 extern LANGID PsInstallUILanguageId
;
1474 extern LANGID PsDefaultUILanguageId
;
1475 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector
[];
1476 extern ULONG CmpConfigurationAreaSize
;
1477 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData
;
1478 extern UNICODE_STRING CmTypeName
[];
1479 extern UNICODE_STRING CmClassName
[];
1480 extern CMP_MF_TYPE CmpMultifunctionTypes
[];
1481 extern USHORT CmpUnknownBusCount
;
1482 extern ULONG CmpTypeCount
[MaximumType
+ 1];
1483 extern HIVE_LIST_ENTRY CmpMachineHiveList
[];
1484 extern UNICODE_STRING CmSymbolicLinkValueName
;
1485 extern UNICODE_STRING CmpSystemStartOptions
;
1486 extern UNICODE_STRING CmpLoadOptions
;
1487 extern BOOLEAN CmSelfHeal
;
1488 extern BOOLEAN CmpSelfHeal
;
1489 extern ULONG CmpBootType
;
1490 extern HANDLE CmpRegistryRootHandle
;
1491 extern BOOLEAN ExpInTextModeSetup
;
1492 extern BOOLEAN InitIsWinPEMode
;
1493 extern ULONG CmpHashTableSize
;
1494 extern ULONG CmpDelayedCloseSize
, CmpDelayedCloseIndex
;
1495 extern BOOLEAN CmpNoWrite
;
1496 extern BOOLEAN CmpForceForceFlush
;
1497 extern BOOLEAN CmpWasSetupBoot
;
1498 extern BOOLEAN CmpProfileLoaded
;
1499 extern PCMHIVE CmiVolatileHive
;
1500 extern LIST_ENTRY CmiKeyObjectListHead
;
1501 extern BOOLEAN CmpHoldLazyFlush
;
1504 // Inlined functions