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