Reactos
1/*
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)
7 */
8
9#pragma once
10
11#include <cmlib.h>
12#include <cmreslist.h>
13#include "cmboot.h"
14
15//
16// Define this if you want debugging support
17//
18#define _CM_DEBUG_ 0x00
19
20//
21// These define the Debug Masks Supported
22//
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
28
29//
30// Debug/Tracing support
31//
32#if _CM_DEBUG_
33#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
34#define CMTRACE DbgPrintEx
35#else
36#define CMTRACE(x, ...) \
37 if (x & CmpTraceLevel) DbgPrint(__VA_ARGS__)
38#endif
39#else
40#define CMTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
41#endif
42
43//
44// CM_KEY_CONTROL_BLOCK Signatures
45//
46#define CM_KCB_SIGNATURE 'bKmC'
47#define CM_KCB_INVALID_SIGNATURE '4FmC'
48
49//
50// CM_KEY_CONTROL_BLOCK ExtFlags
51//
52#define CM_KCB_NO_SUBKEY 0x01
53#define CM_KCB_SUBKEY_ONE 0x02
54#define CM_KCB_SUBKEY_HINT 0x04
55#define CM_KCB_SYM_LINK_FOUND 0x08
56#define CM_KCB_KEY_NON_EXIST 0x10
57#define CM_KCB_NO_DELAY_CLOSE 0x20
58#define CM_KCB_INVALID_CACHED_INFO 0x40
59#define CM_KCB_READ_ONLY_KEY 0x80
60
61//
62// CM_KEY_BODY Types
63//
64#define CM_KEY_BODY_TYPE 0x6B793032 // 'ky02'
65
66//
67// Number of various lists and hashes
68//
69#if 0 // See sdk/lib/cmlib/cmlib.h
70#define CMP_SECURITY_HASH_LISTS 64
71#endif
72#define CMP_MAX_CALLBACKS 100
73
74//
75// Hashing Constants
76//
77#define CMP_HASH_IRRATIONAL 314159269
78#define CMP_HASH_PRIME 1000000007
79
80//
81// CmpCreateKeyControlBlock Flags
82//
83#define CMP_CREATE_FAKE_KCB 0x1
84#define CMP_LOCK_HASHES_FOR_KCB 0x2
85
86//
87// CmpDoCreate and CmpDoOpen flags
88//
89#define CMP_CREATE_KCB_KCB_LOCKED 0x2
90#define CMP_OPEN_KCB_NO_CREATE 0x4
91
92//
93// EnlistKeyBodyWithKCB Flags
94//
95#define CMP_ENLIST_KCB_LOCKED_SHARED 0x1
96#define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE 0x2
97
98//
99// CmpBuildAndLockKcbArray & CmpLockKcbArray Flags
100//
101#define CMP_LOCK_KCB_ARRAY_EXCLUSIVE 0x1
102#define CMP_LOCK_KCB_ARRAY_SHARED 0x2
103
104//
105// Unload Flags
106//
107#define CMP_UNLOCK_KCB_LOCKED 0x1
108#define CMP_UNLOCK_REGISTRY_LOCKED 0x2
109
110//
111// Maximum size of Value Cache
112//
113#define MAXIMUM_CACHED_DATA (2 * PAGE_SIZE)
114
115//
116// Hives to load on startup
117//
118#define CM_NUMBER_OF_MACHINE_HIVES 6
119
120//
121// Number of items that can fit inside an Allocation Page
122//
123#define CM_KCBS_PER_PAGE \
124 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_KEY_CONTROL_BLOCK))
125#define CM_DELAYS_PER_PAGE \
126 ((PAGE_SIZE - FIELD_OFFSET(CM_ALLOC_PAGE, AllocPage)) / sizeof(CM_DELAY_ALLOC))
127
128//
129// Cache Lookup & KCB Array constructs
130//
131#define CMP_SUBKEY_LEVELS_DEPTH_LIMIT 32
132#define CMP_KCBS_IN_ARRAY_LIMIT (CMP_SUBKEY_LEVELS_DEPTH_LIMIT + 2)
133
134//
135// Value Search Results
136//
137typedef enum _VALUE_SEARCH_RETURN_TYPE
138{
139 SearchSuccess,
140 SearchNeedExclusiveLock,
141 SearchFail
142} VALUE_SEARCH_RETURN_TYPE;
143
144//
145// Key Hash
146//
147typedef struct _CM_KEY_HASH
148{
149 ULONG ConvKey;
150 struct _CM_KEY_HASH *NextHash;
151 PHHIVE KeyHive;
152 HCELL_INDEX KeyCell;
153} CM_KEY_HASH, *PCM_KEY_HASH;
154
155//
156// Key Hash Table Entry
157//
158typedef struct _CM_KEY_HASH_TABLE_ENTRY
159{
160 EX_PUSH_LOCK Lock;
161 PKTHREAD Owner;
162 PCM_KEY_HASH Entry;
163#if DBG
164 PVOID LockBackTrace[5];
165#endif
166} CM_KEY_HASH_TABLE_ENTRY, *PCM_KEY_HASH_TABLE_ENTRY;
167
168//
169// Name Hash
170//
171typedef struct _CM_NAME_HASH
172{
173 ULONG ConvKey;
174 struct _CM_NAME_HASH *NextHash;
175 USHORT NameLength;
176 WCHAR Name[ANYSIZE_ARRAY];
177} CM_NAME_HASH, *PCM_NAME_HASH;
178
179//
180// Name Hash Table Entry
181//
182typedef struct _CM_NAME_HASH_TABLE_ENTRY
183{
184 EX_PUSH_LOCK Lock;
185 PCM_NAME_HASH Entry;
186} CM_NAME_HASH_TABLE_ENTRY, *PCM_NAME_HASH_TABLE_ENTRY;
187
188//
189// Key Security Cache
190//
191typedef struct _CM_KEY_SECURITY_CACHE
192{
193 HCELL_INDEX Cell;
194 ULONG ConvKey;
195 LIST_ENTRY List;
196 ULONG DescriptorLength;
197 SECURITY_DESCRIPTOR_RELATIVE Descriptor;
198} CM_KEY_SECURITY_CACHE, *PCM_KEY_SECURITY_CACHE;
199
200//
201// Key Security Cache Entry
202//
203typedef struct _CM_KEY_SECURITY_CACHE_ENTRY
204{
205 HCELL_INDEX Cell;
206 PCM_KEY_SECURITY_CACHE CachedSecurity;
207} CM_KEY_SECURITY_CACHE_ENTRY, *PCM_KEY_SECURITY_CACHE_ENTRY;
208
209//
210// Cached Child List
211//
212typedef struct _CACHED_CHILD_LIST
213{
214 ULONG Count;
215 union
216 {
217 ULONG ValueList;
218 struct _CM_KEY_CONTROL_BLOCK *RealKcb;
219 };
220} CACHED_CHILD_LIST, *PCACHED_CHILD_LIST;
221
222//
223// Index Hint Block
224//
225typedef struct _CM_INDEX_HINT_BLOCK
226{
227 ULONG Count;
228 ULONG HashKey[ANYSIZE_ARRAY];
229} CM_INDEX_HINT_BLOCK, *PCM_INDEX_HINT_BLOCK;
230
231//
232// Key Body
233//
234typedef struct _CM_KEY_BODY
235{
236 ULONG Type;
237 struct _CM_KEY_CONTROL_BLOCK *KeyControlBlock;
238 struct _CM_NOTIFY_BLOCK *NotifyBlock;
239 HANDLE ProcessID;
240 LIST_ENTRY KeyBodyList;
241
242 /* ReactOS specific -- boolean flag to avoid recursive locking of the KCB */
243 BOOLEAN KcbLocked;
244} CM_KEY_BODY, *PCM_KEY_BODY;
245
246//
247// Name Control Block (NCB)
248//
249typedef struct _CM_NAME_CONTROL_BLOCK
250{
251 BOOLEAN Compressed;
252 USHORT RefCount;
253 union
254 {
255 CM_NAME_HASH NameHash;
256 struct
257 {
258 ULONG ConvKey;
259 PCM_KEY_HASH NextHash;
260 USHORT NameLength;
261 WCHAR Name[ANYSIZE_ARRAY];
262 };
263 };
264} CM_NAME_CONTROL_BLOCK, *PCM_NAME_CONTROL_BLOCK;
265
266//
267// Key Control Block (KCB)
268//
269typedef struct _CM_KEY_CONTROL_BLOCK
270{
271 ULONG Signature;
272 ULONG RefCount;
273 struct
274 {
275 ULONG ExtFlags:8;
276 ULONG PrivateAlloc:1;
277 ULONG Delete:1;
278 ULONG DelayedCloseIndex:12;
279 ULONG TotalLevels:10;
280 };
281 union
282 {
283 CM_KEY_HASH KeyHash;
284 struct
285 {
286 ULONG ConvKey;
287 PCM_KEY_HASH NextHash;
288 PHHIVE KeyHive;
289 HCELL_INDEX KeyCell;
290 };
291 };
292 struct _CM_KEY_CONTROL_BLOCK *ParentKcb;
293 PCM_NAME_CONTROL_BLOCK NameBlock;
294 PCM_KEY_SECURITY_CACHE CachedSecurity;
295 CACHED_CHILD_LIST ValueCache;
296 union
297 {
298 PCM_INDEX_HINT_BLOCK IndexHint;
299 ULONG HashKey;
300 ULONG SubKeyCount;
301 };
302 union
303 {
304 LIST_ENTRY KeyBodyListHead;
305 LIST_ENTRY FreeListEntry;
306 };
307 PCM_KEY_BODY KeyBodyArray[4];
308 PVOID DelayCloseEntry;
309 LARGE_INTEGER KcbLastWriteTime;
310 USHORT KcbMaxNameLen;
311 USHORT KcbMaxValueNameLen;
312 ULONG KcbMaxValueDataLen;
313 struct
314 {
315 ULONG KcbUserFlags : 4;
316 ULONG KcbVirtControlFlags : 4;
317 ULONG KcbDebug : 8;
318 ULONG Flags : 16;
319 };
320 ULONG InDelayClose;
321} CM_KEY_CONTROL_BLOCK, *PCM_KEY_CONTROL_BLOCK;
322
323//
324// Notify Block
325//
326typedef struct _CM_NOTIFY_BLOCK
327{
328 LIST_ENTRY HiveList;
329 LIST_ENTRY PostList;
330 PCM_KEY_CONTROL_BLOCK KeyControlBlock;
331 PCM_KEY_BODY KeyBody;
332 ULONG Filter:29;
333 ULONG WatchTree:30;
334 ULONG NotifyPending:31;
335} CM_NOTIFY_BLOCK, *PCM_NOTIFY_BLOCK;
336
337//
338// Re-map Block
339//
340typedef struct _CM_CELL_REMAP_BLOCK
341{
342 HCELL_INDEX OldCell;
343 HCELL_INDEX NewCell;
344} CM_CELL_REMAP_BLOCK, *PCM_CELL_REMAP_BLOCK;
345
346//
347// Allocation Page
348//
349typedef struct _CM_ALLOC_PAGE
350{
351 ULONG FreeCount;
352 ULONG Reserved;
353 PVOID AllocPage;
354} CM_ALLOC_PAGE, *PCM_ALLOC_PAGE;
355
356//
357// Allocation Page Entry
358//
359typedef struct _CM_DELAY_ALLOC
360{
361 LIST_ENTRY ListEntry;
362 PCM_KEY_CONTROL_BLOCK Kcb;
363} CM_DELAY_ALLOC, *PCM_DELAY_ALLOC;
364
365//
366// Delayed Close Entry
367//
368typedef struct _CM_DELAYED_CLOSE_ENTRY
369{
370 LIST_ENTRY DelayedLRUList;
371 PCM_KEY_CONTROL_BLOCK KeyControlBlock;
372} CM_DELAYED_CLOSE_ENTRY, *PCM_DELAYED_CLOSE_ENTRY;
373
374//
375// Delayed KCB Dereference Entry
376//
377typedef struct _CM_DELAY_DEREF_KCB_ITEM
378{
379 LIST_ENTRY ListEntry;
380 PCM_KEY_CONTROL_BLOCK Kcb;
381} CM_DELAY_DEREF_KCB_ITEM, *PCM_DELAY_DEREF_KCB_ITEM;
382
383//
384// Cached Value Index
385//
386typedef struct _CM_CACHED_VALUE_INDEX
387{
388 HCELL_INDEX CellIndex;
389 union
390 {
391 CELL_DATA CellData;
392 ULONG_PTR List[ANYSIZE_ARRAY];
393 } Data;
394} CM_CACHED_VALUE_INDEX, *PCM_CACHED_VALUE_INDEX;
395
396//
397// Cached Value
398//
399typedef struct _CM_CACHED_VALUE
400{
401 USHORT DataCacheType;
402 USHORT ValueKeySize;
403 ULONG HashKey;
404 CM_KEY_VALUE KeyValue;
405} CM_CACHED_VALUE, *PCM_CACHED_VALUE;
406
407//
408// Hive List Entry
409//
410typedef struct _HIVE_LIST_ENTRY
411{
412 PWSTR Name;
413 PWSTR BaseName;
414 PCMHIVE CmHive;
415 ULONG HHiveFlags;
416 ULONG CmHiveFlags;
417 PCMHIVE CmHive2;
418 BOOLEAN ThreadFinished;
419 BOOLEAN ThreadStarted;
420 BOOLEAN Allocate;
421} HIVE_LIST_ENTRY, *PHIVE_LIST_ENTRY;
422
423//
424// Hash Cache Stack
425//
426typedef struct _CM_HASH_CACHE_STACK
427{
428 UNICODE_STRING NameOfKey;
429 ULONG ConvKey;
430} CM_HASH_CACHE_STACK, *PCM_HASH_CACHE_STACK;
431
432//
433// Parse context for Key Object
434//
435typedef struct _CM_PARSE_CONTEXT
436{
437 ULONG TitleIndex;
438 UNICODE_STRING Class;
439 ULONG CreateOptions;
440 ULONG Disposition;
441 CM_KEY_REFERENCE ChildHive;
442 HANDLE PredefinedHandle;
443 BOOLEAN CreateLink;
444 BOOLEAN CreateOperation;
445 PCMHIVE OriginatingPoint;
446} CM_PARSE_CONTEXT, *PCM_PARSE_CONTEXT;
447
448//
449// MultiFunction Adapter Recognizer Structure
450//
451typedef struct _CMP_MF_TYPE
452{
453 PCHAR Identifier;
454 USHORT InterfaceType;
455 USHORT Count;
456} CMP_MF_TYPE, *PCMP_MF_TYPE;
457
458//
459// System Control Vector
460//
461typedef struct _CM_SYSTEM_CONTROL_VECTOR
462{
463 PWCHAR KeyPath;
464 PWCHAR ValueName;
465 PVOID Buffer;
466 PULONG BufferLength;
467 PULONG Type;
468} CM_SYSTEM_CONTROL_VECTOR, *PCM_SYSTEM_CONTROL_VECTOR;
469
470//
471// Structure for CmpQueryValueDataFromCache
472//
473typedef struct _KEY_VALUE_INFORMATION
474{
475 union
476 {
477 KEY_VALUE_BASIC_INFORMATION KeyValueBasicInformation;
478 KEY_VALUE_FULL_INFORMATION KeyValueFullInformation;
479 KEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInformation;
480 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 KeyValuePartialInformationAlign64;
481 };
482} KEY_VALUE_INFORMATION, *PKEY_VALUE_INFORMATION;
483
484typedef struct _KEY_INFORMATION
485{
486 union
487 {
488 KEY_BASIC_INFORMATION KeyBasicInformation;
489 KEY_FULL_INFORMATION KeyFullInformation;
490 KEY_NODE_INFORMATION KeyNodeInformation;
491 };
492} KEY_INFORMATION, *PKEY_INFORMATION;
493
494///////////////////////////////////////////////////////////////////////////////
495//
496// BUGBUG Old Hive Stuff for Temporary Support
497//
498NTSTATUS CmiCallRegisteredCallbacks(IN REG_NOTIFY_CLASS Argument1, IN PVOID Argument2);
499///////////////////////////////////////////////////////////////////////////////
500
501//
502// Mapped View Hive Functions
503//
504VOID
505NTAPI
506CmpInitHiveViewList(
507 IN PCMHIVE Hive
508);
509
510VOID
511NTAPI
512CmpDestroyHiveViewList(
513 IN PCMHIVE Hive
514);
515
516//
517// Security Management Functions
518//
519NTSTATUS
520CmpAssignSecurityDescriptor(
521 IN PCM_KEY_CONTROL_BLOCK Kcb,
522 IN PSECURITY_DESCRIPTOR SecurityDescriptor
523);
524
525//
526// Security Cache Functions
527//
528VOID
529NTAPI
530CmpInitSecurityCache(
531 IN PCMHIVE Hive
532);
533
534VOID
535NTAPI
536CmpDestroySecurityCache(
537 IN PCMHIVE Hive
538);
539
540//
541// Value Cache Functions
542//
543VALUE_SEARCH_RETURN_TYPE
544NTAPI
545CmpFindValueByNameFromCache(
546 IN PCM_KEY_CONTROL_BLOCK Kcb,
547 IN PCUNICODE_STRING Name,
548 OUT PCM_CACHED_VALUE **CachedValue,
549 OUT ULONG *Index,
550 OUT PCM_KEY_VALUE *Value,
551 OUT BOOLEAN *ValueIsCached,
552 OUT PHCELL_INDEX CellToRelease
553);
554
555VALUE_SEARCH_RETURN_TYPE
556NTAPI
557CmpQueryKeyValueData(
558 IN PCM_KEY_CONTROL_BLOCK Kcb,
559 IN PCM_CACHED_VALUE *CachedValue,
560 IN PCM_KEY_VALUE ValueKey,
561 IN BOOLEAN ValueIsCached,
562 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
563 IN PVOID KeyValueInformation,
564 IN ULONG Length,
565 OUT PULONG ResultLength,
566 OUT PNTSTATUS Status
567);
568
569VALUE_SEARCH_RETURN_TYPE
570NTAPI
571CmpGetValueListFromCache(
572 IN PCM_KEY_CONTROL_BLOCK Kcb,
573 OUT PCELL_DATA *CellData,
574 OUT BOOLEAN *IndexIsCached,
575 OUT PHCELL_INDEX ValueListToRelease
576);
577
578VALUE_SEARCH_RETURN_TYPE
579NTAPI
580CmpGetValueKeyFromCache(
581 IN PCM_KEY_CONTROL_BLOCK Kcb,
582 IN PCELL_DATA CellData,
583 IN ULONG Index,
584 OUT PCM_CACHED_VALUE **CachedValue,
585 OUT PCM_KEY_VALUE *Value,
586 IN BOOLEAN IndexIsCached,
587 OUT BOOLEAN *ValueIsCached,
588 OUT PHCELL_INDEX CellToRelease
589);
590
591VALUE_SEARCH_RETURN_TYPE
592NTAPI
593CmpCompareNewValueDataAgainstKCBCache(
594 IN PCM_KEY_CONTROL_BLOCK Kcb,
595 IN PUNICODE_STRING ValueName,
596 IN ULONG Type,
597 IN PVOID Data,
598 IN ULONG DataSize
599);
600
601//
602// Hive List Routines
603//
604BOOLEAN
605NTAPI
606CmpGetHiveName(
607 IN PCMHIVE Hive,
608 OUT PUNICODE_STRING HiveName
609);
610
611NTSTATUS
612NTAPI
613CmpAddToHiveFileList(
614 IN PCMHIVE Hive
615);
616
617VOID
618NTAPI
619CmpRemoveFromHiveFileList(
620 IN PCMHIVE Hive
621);
622
623//
624// Quota Routines
625//
626VOID
627NTAPI
628CmpSetGlobalQuotaAllowed(
629 VOID
630);
631
632//
633// Notification Routines
634//
635VOID
636NTAPI
637CmpReportNotify(
638 IN PCM_KEY_CONTROL_BLOCK Kcb,
639 IN PHHIVE Hive,
640 IN HCELL_INDEX Cell,
641 IN ULONG Filter
642);
643
644VOID
645NTAPI
646CmpFlushNotify(
647 IN PCM_KEY_BODY KeyBody,
648 IN BOOLEAN LockHeld
649);
650
651CODE_SEG("INIT")
652VOID
653NTAPI
654CmpInitCallback(
655 VOID
656);
657
658//
659// KCB Cache/Delay Routines
660//
661CODE_SEG("INIT")
662VOID
663NTAPI
664CmpInitializeCache(
665 VOID
666);
667
668CODE_SEG("INIT")
669VOID
670NTAPI
671CmpInitCmPrivateDelayAlloc(
672 VOID
673);
674
675CODE_SEG("INIT")
676VOID
677NTAPI
678CmpInitCmPrivateAlloc(
679 VOID
680);
681
682CODE_SEG("INIT")
683VOID
684NTAPI
685CmpInitDelayDerefKCBEngine(
686 VOID
687);
688
689//
690// Key Object Routines
691//
692VOID
693NTAPI
694CmpCloseKeyObject(
695 IN PEPROCESS Process OPTIONAL,
696 IN PVOID Object,
697 IN ACCESS_MASK GrantedAccess,
698 IN ULONG ProcessHandleCount,
699 IN ULONG SystemHandleCount
700);
701
702VOID
703NTAPI
704CmpDeleteKeyObject(
705 IN PVOID Object
706);
707
708NTSTATUS
709NTAPI
710CmpParseKey(
711 IN PVOID ParseObject,
712 IN PVOID ObjectType,
713 IN OUT PACCESS_STATE AccessState,
714 IN KPROCESSOR_MODE AccessMode,
715 IN ULONG Attributes,
716 IN OUT PUNICODE_STRING CompleteName,
717 IN OUT PUNICODE_STRING RemainingName,
718 IN OUT PVOID Context OPTIONAL,
719 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
720 OUT PVOID *Object
721);
722
723NTSTATUS
724NTAPI
725CmpSecurityMethod(
726 IN PVOID Object,
727 IN SECURITY_OPERATION_CODE OperationType,
728 IN PSECURITY_INFORMATION SecurityInformation,
729 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
730 IN OUT PULONG CapturedLength,
731 IN OUT PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor,
732 IN POOL_TYPE PoolType,
733 IN PGENERIC_MAPPING GenericMapping
734);
735
736NTSTATUS
737NTAPI
738CmpQueryKeyName(
739 IN PVOID Object,
740 IN BOOLEAN HasObjectName,
741 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
742 IN ULONG Length,
743 OUT PULONG ReturnLength,
744 IN KPROCESSOR_MODE AccessMode
745);
746
747//
748// Hive Routines
749//
750NTSTATUS
751NTAPI
752CmpInitializeHive(
753 _Out_ PCMHIVE *CmHive,
754 _In_ ULONG OperationType,
755 _In_ ULONG HiveFlags,
756 _In_ ULONG FileType,
757 _In_opt_ PVOID HiveData,
758 _In_ HANDLE Primary,
759 _In_ HANDLE Log,
760 _In_ HANDLE External,
761 _In_ HANDLE Alternate,
762 _In_opt_ PCUNICODE_STRING FileName,
763 _In_ ULONG CheckFlags
764);
765
766NTSTATUS
767NTAPI
768CmpDestroyHive(
769 IN PCMHIVE CmHive
770);
771
772PSECURITY_DESCRIPTOR
773NTAPI
774CmpHiveRootSecurityDescriptor(
775 VOID
776);
777
778NTSTATUS
779NTAPI
780CmpLinkHiveToMaster(
781 IN PUNICODE_STRING LinkName,
782 IN HANDLE RootDirectory,
783 IN PCMHIVE CmHive,
784 IN BOOLEAN Allocate,
785 IN PSECURITY_DESCRIPTOR SecurityDescriptor
786);
787
788NTSTATUS
789NTAPI
790CmpOpenHiveFiles(
791 IN PCUNICODE_STRING BaseName,
792 IN PCWSTR Extension OPTIONAL,
793 OUT PHANDLE Primary,
794 OUT PHANDLE Log,
795 OUT PULONG PrimaryDisposition,
796 OUT PULONG LogDisposition,
797 IN BOOLEAN CreateAllowed,
798 IN BOOLEAN MarkAsSystemHive,
799 IN BOOLEAN NoBuffering,
800 OUT PULONG ClusterSize OPTIONAL
801);
802
803VOID
804NTAPI
805CmpCloseHiveFiles(
806 IN PCMHIVE Hive
807);
808
809NTSTATUS
810NTAPI
811CmpInitHiveFromFile(
812 IN PCUNICODE_STRING HiveName,
813 IN ULONG HiveFlags,
814 OUT PCMHIVE *Hive,
815 IN OUT PBOOLEAN New,
816 IN ULONG CheckFlags
817);
818
819VOID
820NTAPI
821CmpInitializeHiveList(
822 VOID
823);
824
825//
826// Registry Utility Functions
827//
828BOOLEAN
829NTAPI
830CmpTestRegistryLockExclusive(
831 VOID
832);
833
834BOOLEAN
835NTAPI
836CmpTestRegistryLock(
837 VOID
838);
839
840VOID
841NTAPI
842CmpLockRegistryExclusive(
843 VOID
844);
845
846VOID
847NTAPI
848CmpLockRegistry(
849 VOID
850);
851
852VOID
853NTAPI
854CmpUnlockRegistry(
855 VOID
856);
857
858VOID
859NTAPI
860CmpLockHiveFlusherExclusive(
861 IN PCMHIVE Hive
862);
863
864VOID
865NTAPI
866CmpLockHiveFlusherShared(
867 IN PCMHIVE Hive
868);
869
870BOOLEAN
871NTAPI
872CmpTestHiveFlusherLockExclusive(
873 IN PCMHIVE Hive
874);
875
876BOOLEAN
877NTAPI
878CmpTestHiveFlusherLockShared(
879 IN PCMHIVE Hive
880);
881
882VOID
883NTAPI
884CmpUnlockHiveFlusher(
885 IN PCMHIVE Hive
886);
887
888//
889// Delay Functions
890//
891PVOID
892NTAPI
893CmpAllocateDelayItem(
894 VOID
895);
896
897VOID
898NTAPI
899CmpFreeDelayItem(
900 PVOID Entry
901);
902
903VOID
904NTAPI
905CmpDelayDerefKeyControlBlock(
906 IN PCM_KEY_CONTROL_BLOCK Kcb
907);
908
909VOID
910NTAPI
911CmpAddToDelayedClose(
912 IN PCM_KEY_CONTROL_BLOCK Kcb,
913 IN BOOLEAN LockHeldExclusively
914);
915
916VOID
917NTAPI
918CmpArmDelayedCloseTimer(
919 VOID
920);
921
922VOID
923NTAPI
924CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb);
925
926CODE_SEG("INIT")
927VOID
928NTAPI
929CmpInitializeDelayedCloseTable(
930 VOID
931);
932
933//
934// KCB Functions
935//
936PCM_KEY_CONTROL_BLOCK
937NTAPI
938CmpCreateKeyControlBlock(
939 IN PHHIVE Hive,
940 IN HCELL_INDEX Index,
941 IN PCM_KEY_NODE Node,
942 IN PCM_KEY_CONTROL_BLOCK Parent,
943 IN ULONG Flags,
944 IN PUNICODE_STRING KeyName
945);
946
947PCM_KEY_CONTROL_BLOCK
948NTAPI
949CmpAllocateKeyControlBlock(
950 VOID
951);
952
953VOID
954NTAPI
955CmpFreeKeyControlBlock(
956 IN PCM_KEY_CONTROL_BLOCK Kcb
957);
958
959VOID
960NTAPI
961CmpRemoveKeyControlBlock(
962 IN PCM_KEY_CONTROL_BLOCK Kcb
963);
964
965VOID
966NTAPI
967CmpCleanUpKcbValueCache(
968 IN PCM_KEY_CONTROL_BLOCK Kcb
969);
970
971VOID
972NTAPI
973CmpCleanUpKcbCacheWithLock(
974 IN PCM_KEY_CONTROL_BLOCK Kcb,
975 IN BOOLEAN LockHeldExclusively
976);
977
978VOID
979NTAPI
980CmpCleanUpSubKeyInfo(
981 IN PCM_KEY_CONTROL_BLOCK Kcb
982);
983
984PUNICODE_STRING
985NTAPI
986CmpConstructName(
987 IN PCM_KEY_CONTROL_BLOCK Kcb
988);
989
990BOOLEAN
991NTAPI
992CmpReferenceKeyControlBlock(
993 IN PCM_KEY_CONTROL_BLOCK Kcb
994);
995
996VOID
997NTAPI
998CmpDereferenceKeyControlBlockWithLock(
999 IN PCM_KEY_CONTROL_BLOCK Kcb,
1000 IN BOOLEAN LockHeldExclusively
1001);
1002
1003VOID
1004NTAPI
1005CmpDereferenceKeyControlBlock(
1006 IN PCM_KEY_CONTROL_BLOCK Kcb
1007);
1008
1009VOID
1010NTAPI
1011EnlistKeyBodyWithKCB(
1012 IN PCM_KEY_BODY KeyObject,
1013 IN ULONG Flags
1014);
1015
1016VOID
1017NTAPI
1018DelistKeyBodyFromKCB(
1019 IN PCM_KEY_BODY KeyBody,
1020 IN BOOLEAN LockHeld
1021);
1022
1023VOID
1024CmpUnLockKcbArray(
1025 _In_ PULONG LockedKcbs
1026);
1027
1028PULONG
1029NTAPI
1030CmpBuildAndLockKcbArray(
1031 _In_ PCM_HASH_CACHE_STACK HashCacheStack,
1032 _In_ ULONG KcbLockFlags,
1033 _In_ PCM_KEY_CONTROL_BLOCK Kcb,
1034 _Inout_ PULONG OuterStackArray,
1035 _In_ ULONG TotalRemainingSubkeys,
1036 _In_ ULONG MatchRemainSubkeyLevel
1037);
1038
1039VOID
1040NTAPI
1041CmpAcquireTwoKcbLocksExclusiveByKey(
1042 IN ULONG ConvKey1,
1043 IN ULONG ConvKey2
1044);
1045
1046VOID
1047NTAPI
1048CmpReleaseTwoKcbLockByKey(
1049 IN ULONG ConvKey1,
1050 IN ULONG ConvKey2
1051);
1052
1053VOID
1054NTAPI
1055CmpFlushNotifiesOnKeyBodyList(
1056 IN PCM_KEY_CONTROL_BLOCK Kcb,
1057 IN BOOLEAN LockHeld
1058);
1059
1060//
1061// Parse Routines
1062//
1063BOOLEAN
1064NTAPI
1065CmpGetNextName(
1066 IN OUT PUNICODE_STRING RemainingName,
1067 OUT PUNICODE_STRING NextName,
1068 OUT PBOOLEAN LastName
1069);
1070
1071//
1072// Command Routines (Flush, Open, Close, Init);
1073//
1074BOOLEAN
1075NTAPI
1076CmpDoFlushAll(
1077 IN BOOLEAN ForceFlush
1078);
1079
1080VOID
1081NTAPI
1082CmpShutdownWorkers(
1083 VOID
1084);
1085
1086VOID
1087NTAPI
1088CmpCmdInit(
1089 IN BOOLEAN SetupBoot
1090);
1091
1092NTSTATUS
1093NTAPI
1094CmpCmdHiveOpen(
1095 IN POBJECT_ATTRIBUTES FileAttributes,
1096 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext,
1097 IN OUT PBOOLEAN Allocate,
1098 OUT PCMHIVE *NewHive,
1099 IN ULONG CheckFlags
1100);
1101
1102VOID
1103NTAPI
1104CmpLazyFlush(
1105 VOID
1106);
1107
1108//
1109// Open/Create Routines
1110//
1111NTSTATUS
1112NTAPI
1113CmpDoCreate(
1114 IN PHHIVE Hive,
1115 IN HCELL_INDEX Cell,
1116 IN PACCESS_STATE AccessState,
1117 IN PUNICODE_STRING Name,
1118 IN KPROCESSOR_MODE AccessMode,
1119 IN PCM_PARSE_CONTEXT Context,
1120 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1121 OUT PVOID *Object
1122);
1123
1124NTSTATUS
1125NTAPI
1126CmpCreateLinkNode(
1127 IN PHHIVE Hive,
1128 IN HCELL_INDEX Cell,
1129 IN PACCESS_STATE AccessState,
1130 IN UNICODE_STRING Name,
1131 IN KPROCESSOR_MODE AccessMode,
1132 IN ULONG CreateOptions,
1133 IN PCM_PARSE_CONTEXT Context,
1134 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1135 IN PULONG KcbsLocked,
1136 OUT PVOID *Object
1137);
1138
1139//
1140// Boot Routines
1141//
1142CODE_SEG("INIT")
1143VOID
1144NTAPI
1145CmGetSystemControlValues(
1146 IN PVOID SystemHiveData,
1147 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1148);
1149
1150NTSTATUS
1151NTAPI
1152CmpSaveBootControlSet(
1153 IN USHORT ControlSet
1154);
1155
1156//
1157// Hardware Configuration Routines
1158//
1159CODE_SEG("INIT")
1160NTSTATUS
1161NTAPI
1162CmpInitializeRegistryNode(
1163 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
1164 IN HANDLE NodeHandle,
1165 OUT PHANDLE NewHandle,
1166 IN INTERFACE_TYPE InterfaceType,
1167 IN ULONG BusNumber,
1168 IN PUSHORT DeviceIndexTable
1169);
1170
1171NTSTATUS
1172NTAPI
1173CmpInitializeMachineDependentConfiguration(
1174 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1175);
1176
1177CODE_SEG("INIT")
1178NTSTATUS
1179NTAPI
1180CmpInitializeHardwareConfiguration(
1181 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1182);
1183
1184//
1185// Wrapper Routines
1186//
1187NTSTATUS
1188NTAPI
1189CmpCreateEvent(
1190 IN EVENT_TYPE EventType,
1191 OUT PHANDLE EventHandle,
1192 OUT PKEVENT *Event
1193);
1194
1195PVOID
1196NTAPI
1197CmpAllocate(
1198 IN SIZE_T Size,
1199 IN BOOLEAN Paged,
1200 IN ULONG Tag
1201);
1202
1203VOID
1204NTAPI
1205CmpFree(
1206 IN PVOID Ptr,
1207 IN ULONG Quota
1208);
1209
1210BOOLEAN
1211NTAPI
1212CmpFileRead(
1213 IN PHHIVE RegistryHive,
1214 IN ULONG FileType,
1215 IN OUT PULONG FileOffset,
1216 OUT PVOID Buffer,
1217 IN SIZE_T BufferLength
1218);
1219
1220BOOLEAN
1221NTAPI
1222CmpFileWrite(
1223 IN PHHIVE RegistryHive,
1224 IN ULONG FileType,
1225 IN OUT PULONG FileOffset,
1226 IN PVOID Buffer,
1227 IN SIZE_T BufferLength
1228);
1229
1230BOOLEAN
1231NTAPI
1232CmpFileSetSize(
1233 _In_ PHHIVE RegistryHive,
1234 _In_ ULONG FileType,
1235 _In_ ULONG FileSize,
1236 _In_ ULONG OldFileSize
1237);
1238
1239BOOLEAN
1240NTAPI
1241CmpFileFlush(
1242 IN PHHIVE RegistryHive,
1243 IN ULONG FileType,
1244 IN OUT PLARGE_INTEGER FileOffset,
1245 IN ULONG Length
1246);
1247
1248//
1249// Configuration Manager side of Registry System Calls
1250//
1251NTSTATUS
1252NTAPI
1253CmEnumerateValueKey(
1254 IN PCM_KEY_CONTROL_BLOCK Kcb,
1255 IN ULONG Index,
1256 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1257 IN PVOID KeyValueInformation,
1258 IN ULONG Length,
1259 IN PULONG ResultLength);
1260
1261NTSTATUS
1262NTAPI
1263CmSetValueKey(
1264 IN PCM_KEY_CONTROL_BLOCK Kcb,
1265 IN PUNICODE_STRING ValueName,
1266 IN ULONG Type,
1267 IN PVOID Data,
1268 IN ULONG DataSize);
1269
1270NTSTATUS
1271NTAPI
1272CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1273 IN KEY_INFORMATION_CLASS KeyInformationClass,
1274 IN PVOID KeyInformation,
1275 IN ULONG Length,
1276 IN PULONG ResultLength
1277);
1278
1279NTSTATUS
1280NTAPI
1281CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1282 IN ULONG Index,
1283 IN KEY_INFORMATION_CLASS KeyInformationClass,
1284 IN PVOID KeyInformation,
1285 IN ULONG Length,
1286 IN PULONG ResultLength
1287);
1288
1289NTSTATUS
1290NTAPI
1291CmDeleteKey(
1292 IN PCM_KEY_BODY KeyBody
1293);
1294
1295NTSTATUS
1296NTAPI
1297CmFlushKey(
1298 IN PCM_KEY_CONTROL_BLOCK Kcb,
1299 IN BOOLEAN EclusiveLock
1300);
1301
1302NTSTATUS
1303NTAPI
1304CmDeleteValueKey(
1305 IN PCM_KEY_CONTROL_BLOCK Kcb,
1306 IN UNICODE_STRING ValueName
1307);
1308
1309NTSTATUS
1310NTAPI
1311CmQueryValueKey(
1312 IN PCM_KEY_CONTROL_BLOCK Kcb,
1313 IN UNICODE_STRING ValueName,
1314 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1315 IN PVOID KeyValueInformation,
1316 IN ULONG Length,
1317 IN PULONG ResultLength
1318);
1319
1320NTSTATUS
1321NTAPI
1322CmLoadKey(
1323 IN POBJECT_ATTRIBUTES TargetKey,
1324 IN POBJECT_ATTRIBUTES SourceFile,
1325 IN ULONG Flags,
1326 IN PCM_KEY_BODY KeyBody
1327);
1328
1329NTSTATUS
1330NTAPI
1331CmUnloadKey(
1332 _In_ PCM_KEY_CONTROL_BLOCK Kcb,
1333 _In_ ULONG Flags
1334);
1335
1336ULONG
1337NTAPI
1338CmpEnumerateOpenSubKeys(
1339 _In_ PCM_KEY_CONTROL_BLOCK RootKcb,
1340 _In_ BOOLEAN RemoveEmptyCacheEntries,
1341 _In_ BOOLEAN DereferenceOpenedEntries
1342);
1343
1344HCELL_INDEX
1345NTAPI
1346CmpCopyCell(
1347 IN PHHIVE SourceHive,
1348 IN HCELL_INDEX SourceCell,
1349 IN PHHIVE DestinationHive,
1350 IN HSTORAGE_TYPE StorageType
1351);
1352
1353NTSTATUS
1354NTAPI
1355CmpDeepCopyKey(
1356 IN PHHIVE SourceHive,
1357 IN HCELL_INDEX SrcKeyCell,
1358 IN PHHIVE DestinationHive,
1359 IN HSTORAGE_TYPE StorageType,
1360 OUT PHCELL_INDEX DestKeyCell OPTIONAL
1361);
1362
1363NTSTATUS
1364NTAPI
1365CmSaveKey(
1366 IN PCM_KEY_CONTROL_BLOCK Kcb,
1367 IN HANDLE FileHandle,
1368 IN ULONG Flags
1369);
1370
1371NTSTATUS
1372NTAPI
1373CmSaveMergedKeys(
1374 IN PCM_KEY_CONTROL_BLOCK HighKcb,
1375 IN PCM_KEY_CONTROL_BLOCK LowKcb,
1376 IN HANDLE FileHandle
1377);
1378
1379//
1380// Startup and Shutdown
1381//
1382CODE_SEG("INIT")
1383BOOLEAN
1384NTAPI
1385CmInitSystem1(
1386 VOID
1387);
1388
1389VOID
1390NTAPI
1391CmShutdownSystem(
1392 VOID
1393);
1394
1395VOID
1396NTAPI
1397CmSetLazyFlushState(
1398 IN BOOLEAN Enable
1399);
1400
1401VOID
1402NTAPI
1403CmpSetVersionData(
1404 VOID
1405);
1406
1407//
1408// Driver List Routines
1409//
1410CODE_SEG("INIT")
1411PUNICODE_STRING*
1412NTAPI
1413CmGetSystemDriverList(
1414 VOID
1415);
1416
1417//
1418// Global variables accessible from all of Cm
1419//
1420extern ULONG CmpTraceLevel;
1421extern BOOLEAN CmpSpecialBootCondition;
1422extern BOOLEAN CmpFlushOnLockRelease;
1423extern ULONG CmpVolatileBoot;
1424extern BOOLEAN CmpShareSystemHives;
1425extern BOOLEAN CmpMiniNTBoot;
1426extern BOOLEAN CmpNoVolatileCreates;
1427extern EX_PUSH_LOCK CmpHiveListHeadLock, CmpLoadHiveLock;
1428extern LIST_ENTRY CmpHiveListHead;
1429extern POBJECT_TYPE CmpKeyObjectType;
1430extern ERESOURCE CmpRegistryLock;
1431extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable;
1432extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable;
1433extern KGUARDED_MUTEX CmpDelayedCloseTableLock;
1434extern CMHIVE CmControlHive;
1435extern WCHAR CmDefaultLanguageId[];
1436extern ULONG CmDefaultLanguageIdLength;
1437extern ULONG CmDefaultLanguageIdType;
1438extern WCHAR CmInstallUILanguageId[];
1439extern ULONG CmInstallUILanguageIdLength;
1440extern ULONG CmInstallUILanguageIdType;
1441extern ULONG CmNtGlobalFlag;
1442extern LANGID PsInstallUILanguageId;
1443extern LANGID PsDefaultUILanguageId;
1444extern CM_SYSTEM_CONTROL_VECTOR CmControlVector[];
1445extern ULONG CmpConfigurationAreaSize;
1446extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData;
1447extern UNICODE_STRING CmTypeName[];
1448extern UNICODE_STRING CmClassName[];
1449extern CMP_MF_TYPE CmpMultifunctionTypes[];
1450extern USHORT CmpUnknownBusCount;
1451extern ULONG CmpTypeCount[MaximumType + 1];
1452extern HIVE_LIST_ENTRY CmpMachineHiveList[];
1453extern UNICODE_STRING CmSymbolicLinkValueName;
1454extern UNICODE_STRING CmpSystemStartOptions;
1455extern UNICODE_STRING CmpLoadOptions;
1456extern ULONG CmpBootType;
1457extern ULONG CmSelfHeal;
1458extern BOOLEAN CmpSelfHeal;
1459extern HANDLE CmpRegistryRootHandle;
1460extern BOOLEAN ExpInTextModeSetup;
1461extern BOOLEAN InitIsWinPEMode;
1462extern ULONG CmpHashTableSize;
1463extern ULONG CmpDelayedCloseSize;
1464extern BOOLEAN CmpNoWrite;
1465extern BOOLEAN CmpForceForceFlush;
1466extern BOOLEAN CmpWasSetupBoot;
1467extern BOOLEAN CmpProfileLoaded;
1468extern PCMHIVE CmiVolatileHive;
1469extern LIST_ENTRY CmiKeyObjectListHead;
1470extern BOOLEAN CmpHoldLazyFlush;
1471extern ULONG CmpLazyFlushIntervalInSeconds;
1472extern ULONG CmpLazyFlushHiveCount;
1473extern BOOLEAN HvShutdownComplete;
1474
1475//
1476// Inlined functions
1477//
1478#include "cm_x.h"