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