- Make identifiers in configuration trees ASCII-strings, as they are in real NT.
[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 VOID
903 NTAPI
904 CmpDereferenceKeyControlBlockWithLock(
905 IN PCM_KEY_CONTROL_BLOCK Kcb,
906 IN BOOLEAN LockHeldExclusively
907 );
908
909 VOID
910 NTAPI
911 CmpDereferenceKeyControlBlock(
912 IN PCM_KEY_CONTROL_BLOCK Kcb
913 );
914
915 VOID
916 NTAPI
917 EnlistKeyBodyWithKCB(
918 IN PCM_KEY_BODY KeyObject,
919 IN ULONG Flags
920 );
921
922 VOID
923 NTAPI
924 DelistKeyBodyFromKCB(
925 IN PCM_KEY_BODY KeyBody,
926 IN BOOLEAN LockHeld
927 );
928
929 NTSTATUS
930 NTAPI
931 CmpFreeKeyByCell(
932 IN PHHIVE Hive,
933 IN HCELL_INDEX Cell,
934 IN BOOLEAN Unlink
935 );
936
937 VOID
938 NTAPI
939 CmpAcquireTwoKcbLocksExclusiveByKey(
940 IN ULONG ConvKey1,
941 IN ULONG ConvKey2
942 );
943
944 VOID
945 NTAPI
946 CmpReleaseTwoKcbLockByKey(
947 IN ULONG ConvKey1,
948 IN ULONG ConvKey2
949 );
950
951 //
952 // Name Functions
953 //
954 LONG
955 NTAPI
956 CmpCompareCompressedName(
957 IN PCUNICODE_STRING SearchName,
958 IN PWCHAR CompressedName,
959 IN ULONG NameLength
960 );
961
962 USHORT
963 NTAPI
964 CmpNameSize(
965 IN PHHIVE Hive,
966 IN PUNICODE_STRING Name
967 );
968
969 USHORT
970 NTAPI
971 CmpCompressedNameSize(
972 IN PWCHAR Name,
973 IN ULONG Length
974 );
975
976 VOID
977 NTAPI
978 CmpCopyCompressedName(
979 IN PWCHAR Destination,
980 IN ULONG DestinationLength,
981 IN PWCHAR Source,
982 IN ULONG SourceLength
983 );
984
985 USHORT
986 NTAPI
987 CmpCopyName(
988 IN PHHIVE Hive,
989 IN PWCHAR Destination,
990 IN PUNICODE_STRING Source
991 );
992
993 BOOLEAN
994 NTAPI
995 CmpFindNameInList(
996 IN PHHIVE Hive,
997 IN PCHILD_LIST ChildList,
998 IN PUNICODE_STRING Name,
999 IN PULONG ChildIndex,
1000 IN PHCELL_INDEX CellIndex
1001 );
1002
1003 //
1004 // Parse Routines
1005 //
1006 BOOLEAN
1007 NTAPI
1008 CmpGetNextName(
1009 IN OUT PUNICODE_STRING RemainingName,
1010 OUT PUNICODE_STRING NextName,
1011 OUT PBOOLEAN LastName
1012 );
1013
1014 //
1015 // Command Routines (Flush, Open, Close, Init);
1016 //
1017 BOOLEAN
1018 NTAPI
1019 CmpDoFlushAll(
1020 IN BOOLEAN ForceFlush
1021 );
1022
1023 VOID
1024 NTAPI
1025 CmpShutdownWorkers(
1026 VOID
1027 );
1028
1029 VOID
1030 NTAPI
1031 CmpCmdInit(
1032 IN BOOLEAN SetupBoot
1033 );
1034
1035 NTSTATUS
1036 NTAPI
1037 CmpCmdHiveOpen(
1038 IN POBJECT_ATTRIBUTES FileAttributes,
1039 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext,
1040 IN OUT PBOOLEAN Allocate,
1041 OUT PCMHIVE *NewHive,
1042 IN ULONG CheckFlags
1043 );
1044
1045 VOID
1046 NTAPI
1047 CmpLazyFlush(
1048 VOID
1049 );
1050
1051 //
1052 // Open/Create Routines
1053 //
1054 NTSTATUS
1055 NTAPI
1056 CmpDoCreate(
1057 IN PHHIVE Hive,
1058 IN HCELL_INDEX Cell,
1059 IN PACCESS_STATE AccessState,
1060 IN PUNICODE_STRING Name,
1061 IN KPROCESSOR_MODE AccessMode,
1062 IN PCM_PARSE_CONTEXT Context,
1063 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1064 OUT PVOID *Object
1065 );
1066
1067 NTSTATUS
1068 NTAPI
1069 CmpCreateLinkNode(
1070 IN PHHIVE Hive,
1071 IN HCELL_INDEX Cell,
1072 IN PACCESS_STATE AccessState,
1073 IN UNICODE_STRING Name,
1074 IN KPROCESSOR_MODE AccessMode,
1075 IN ULONG CreateOptions,
1076 IN PCM_PARSE_CONTEXT Context,
1077 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1078 OUT PVOID *Object
1079 );
1080
1081 //
1082 // Cell Index Routines
1083 //
1084
1085 HCELL_INDEX
1086 NTAPI
1087 CmpFindSubKeyByName(
1088 IN PHHIVE Hive,
1089 IN PCM_KEY_NODE Parent,
1090 IN PCUNICODE_STRING SearchName
1091 );
1092
1093 HCELL_INDEX
1094 NTAPI
1095 CmpFindSubKeyByNumber(
1096 IN PHHIVE Hive,
1097 IN PCM_KEY_NODE Node,
1098 IN ULONG Number
1099 );
1100
1101 ULONG
1102 NTAPI
1103 CmpComputeHashKey(
1104 IN ULONG Hash,
1105 IN PCUNICODE_STRING Name,
1106 IN BOOLEAN AllowSeparators
1107 );
1108
1109 BOOLEAN
1110 NTAPI
1111 CmpAddSubKey(
1112 IN PHHIVE Hive,
1113 IN HCELL_INDEX Parent,
1114 IN HCELL_INDEX Child
1115 );
1116
1117 BOOLEAN
1118 NTAPI
1119 CmpRemoveSubKey(
1120 IN PHHIVE Hive,
1121 IN HCELL_INDEX ParentKey,
1122 IN HCELL_INDEX TargetKey
1123 );
1124
1125 BOOLEAN
1126 NTAPI
1127 CmpMarkIndexDirty(
1128 IN PHHIVE Hive,
1129 HCELL_INDEX ParentKey,
1130 HCELL_INDEX TargetKey
1131 );
1132
1133 //
1134 // Cell Value Routines
1135 //
1136 HCELL_INDEX
1137 NTAPI
1138 CmpFindValueByName(
1139 IN PHHIVE Hive,
1140 IN PCM_KEY_NODE KeyNode,
1141 IN PUNICODE_STRING Name
1142 );
1143
1144 PCELL_DATA
1145 NTAPI
1146 CmpValueToData(
1147 IN PHHIVE Hive,
1148 IN PCM_KEY_VALUE Value,
1149 OUT PULONG Length
1150 );
1151
1152 NTSTATUS
1153 NTAPI
1154 CmpSetValueDataNew(
1155 IN PHHIVE Hive,
1156 IN PVOID Data,
1157 IN ULONG DataSize,
1158 IN ULONG StorageType,
1159 IN HCELL_INDEX ValueCell,
1160 OUT PHCELL_INDEX DataCell
1161 );
1162
1163 NTSTATUS
1164 NTAPI
1165 CmpAddValueToList(
1166 IN PHHIVE Hive,
1167 IN HCELL_INDEX ValueCell,
1168 IN ULONG Index,
1169 IN ULONG Type,
1170 IN OUT PCHILD_LIST ChildList
1171 );
1172
1173 BOOLEAN
1174 NTAPI
1175 CmpFreeValue(
1176 IN PHHIVE Hive,
1177 IN HCELL_INDEX Cell
1178 );
1179
1180 BOOLEAN
1181 NTAPI
1182 CmpMarkValueDataDirty(
1183 IN PHHIVE Hive,
1184 IN PCM_KEY_VALUE Value
1185 );
1186
1187 BOOLEAN
1188 NTAPI
1189 CmpFreeValueData(
1190 IN PHHIVE Hive,
1191 IN HCELL_INDEX DataCell,
1192 IN ULONG DataLength
1193 );
1194
1195 NTSTATUS
1196 NTAPI
1197 CmpRemoveValueFromList(
1198 IN PHHIVE Hive,
1199 IN ULONG Index,
1200 IN OUT PCHILD_LIST ChildList
1201 );
1202
1203 BOOLEAN
1204 NTAPI
1205 CmpGetValueData(
1206 IN PHHIVE Hive,
1207 IN PCM_KEY_VALUE Value,
1208 IN PULONG Length,
1209 OUT PVOID *Buffer,
1210 OUT PBOOLEAN BufferAllocated,
1211 OUT PHCELL_INDEX CellToRelease
1212 );
1213
1214 //
1215 // Boot Routines
1216 //
1217 HCELL_INDEX
1218 NTAPI
1219 CmpFindControlSet(
1220 IN PHHIVE SystemHive,
1221 IN HCELL_INDEX RootCell,
1222 IN PUNICODE_STRING SelectKeyName,
1223 OUT PBOOLEAN AutoSelect
1224 );
1225
1226 VOID
1227 NTAPI
1228 CmGetSystemControlValues(
1229 IN PVOID SystemHiveData,
1230 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1231 );
1232
1233
1234 //
1235 // Hardware Configuration Routines
1236 //
1237 NTSTATUS
1238 NTAPI
1239 CmpInitializeRegistryNode(
1240 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
1241 IN HANDLE NodeHandle,
1242 OUT PHANDLE NewHandle,
1243 IN INTERFACE_TYPE InterfaceType,
1244 IN ULONG BusNumber,
1245 IN PUSHORT DeviceIndexTable
1246 );
1247
1248 NTSTATUS
1249 NTAPI
1250 CmpInitializeMachineDependentConfiguration(
1251 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1252 );
1253
1254 NTSTATUS
1255 NTAPI
1256 CmpInitializeHardwareConfiguration(
1257 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1258 );
1259
1260 //
1261 // Wrapper Routines
1262 //
1263 NTSTATUS
1264 NTAPI
1265 CmpCreateEvent(
1266 IN EVENT_TYPE EventType,
1267 OUT PHANDLE EventHandle,
1268 OUT PKEVENT *Event
1269 );
1270
1271 PVOID
1272 NTAPI
1273 CmpAllocate(
1274 IN ULONG Size,
1275 IN BOOLEAN Paged,
1276 IN ULONG Tag
1277 );
1278
1279 VOID
1280 NTAPI
1281 CmpFree(
1282 IN PVOID Ptr,
1283 IN ULONG Quota
1284 );
1285
1286 BOOLEAN
1287 NTAPI
1288 CmpFileRead(
1289 IN PHHIVE RegistryHive,
1290 IN ULONG FileType,
1291 IN OUT PULONG FileOffset,
1292 OUT PVOID Buffer,
1293 IN SIZE_T BufferLength
1294 );
1295
1296 BOOLEAN
1297 NTAPI
1298 CmpFileWrite(
1299 IN PHHIVE RegistryHive,
1300 IN ULONG FileType,
1301 IN OUT PULONG FileOffset,
1302 IN PVOID Buffer,
1303 IN SIZE_T BufferLength
1304 );
1305
1306 BOOLEAN
1307 NTAPI
1308 CmpFileSetSize(
1309 IN PHHIVE RegistryHive,
1310 IN ULONG FileType,
1311 IN ULONG FileSize,
1312 IN ULONG OldFileSize
1313 );
1314
1315 BOOLEAN
1316 NTAPI
1317 CmpFileFlush(
1318 IN PHHIVE RegistryHive,
1319 IN ULONG FileType,
1320 IN OUT PLARGE_INTEGER FileOffset,
1321 IN ULONG Length
1322 );
1323
1324 //
1325 // Configuration Manager side of Registry System Calls
1326 //
1327 NTSTATUS
1328 NTAPI
1329 CmEnumerateValueKey(
1330 IN PCM_KEY_CONTROL_BLOCK Kcb,
1331 IN ULONG Index,
1332 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1333 IN PVOID KeyValueInformation,
1334 IN ULONG Length,
1335 IN PULONG ResultLength);
1336
1337 NTSTATUS
1338 NTAPI
1339 CmSetValueKey(
1340 IN PCM_KEY_CONTROL_BLOCK Kcb,
1341 IN PUNICODE_STRING ValueName,
1342 IN ULONG Type,
1343 IN PVOID Data,
1344 IN ULONG DataSize);
1345
1346 NTSTATUS
1347 NTAPI
1348 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1349 IN KEY_INFORMATION_CLASS KeyInformationClass,
1350 IN PVOID KeyInformation,
1351 IN ULONG Length,
1352 IN PULONG ResultLength
1353 );
1354
1355 NTSTATUS
1356 NTAPI
1357 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1358 IN ULONG Index,
1359 IN KEY_INFORMATION_CLASS KeyInformationClass,
1360 IN PVOID KeyInformation,
1361 IN ULONG Length,
1362 IN PULONG ResultLength
1363 );
1364
1365 NTSTATUS
1366 NTAPI
1367 CmDeleteKey(
1368 IN PCM_KEY_BODY KeyBody
1369 );
1370
1371 NTSTATUS
1372 NTAPI
1373 CmFlushKey(
1374 IN PCM_KEY_CONTROL_BLOCK Kcb,
1375 IN BOOLEAN EclusiveLock
1376 );
1377
1378 NTSTATUS
1379 NTAPI
1380 CmDeleteValueKey(
1381 IN PCM_KEY_CONTROL_BLOCK Kcb,
1382 IN UNICODE_STRING ValueName
1383 );
1384
1385 NTSTATUS
1386 NTAPI
1387 CmQueryValueKey(
1388 IN PCM_KEY_CONTROL_BLOCK Kcb,
1389 IN UNICODE_STRING ValueName,
1390 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1391 IN PVOID KeyValueInformation,
1392 IN ULONG Length,
1393 IN PULONG ResultLength
1394 );
1395
1396 NTSTATUS
1397 NTAPI
1398 CmLoadKey(
1399 IN POBJECT_ATTRIBUTES TargetKey,
1400 IN POBJECT_ATTRIBUTES SourceFile,
1401 IN ULONG Flags,
1402 IN PCM_KEY_BODY KeyBody
1403 );
1404
1405 //
1406 // Startup and Shutdown
1407 //
1408 VOID
1409 NTAPI
1410 CmShutdownSystem(
1411 VOID
1412 );
1413
1414 //
1415 // Global variables accessible from all of Cm
1416 //
1417 extern BOOLEAN CmpSpecialBootCondition;
1418 extern BOOLEAN CmpFlushOnLockRelease;
1419 extern BOOLEAN CmpShareSystemHives;
1420 extern BOOLEAN CmpMiniNTBoot;
1421 extern EX_PUSH_LOCK CmpHiveListHeadLock, CmpLoadHiveLock;
1422 extern LIST_ENTRY CmpHiveListHead;
1423 extern POBJECT_TYPE CmpKeyObjectType;
1424 extern ERESOURCE CmpRegistryLock;
1425 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable;
1426 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable;
1427 extern KGUARDED_MUTEX CmpDelayedCloseTableLock;
1428 extern CMHIVE CmControlHive;
1429 extern WCHAR CmDefaultLanguageId[];
1430 extern ULONG CmDefaultLanguageIdLength;
1431 extern ULONG CmDefaultLanguageIdType;
1432 extern WCHAR CmInstallUILanguageId[];
1433 extern ULONG CmInstallUILanguageIdLength;
1434 extern ULONG CmInstallUILanguageIdType;
1435 extern LANGID PsInstallUILanguageId;
1436 extern LANGID PsDefaultUILanguageId;
1437 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector[];
1438 extern ULONG CmpConfigurationAreaSize;
1439 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData;
1440 extern UNICODE_STRING CmTypeName[];
1441 extern UNICODE_STRING CmClassName[];
1442 extern CMP_MF_TYPE CmpMultifunctionTypes[];
1443 extern USHORT CmpUnknownBusCount;
1444 extern ULONG CmpTypeCount[MaximumType + 1];
1445 extern HIVE_LIST_ENTRY CmpMachineHiveList[];
1446 extern UNICODE_STRING CmSymbolicLinkValueName;
1447 extern UNICODE_STRING CmpSystemStartOptions;
1448 extern UNICODE_STRING CmpLoadOptions;
1449 extern BOOLEAN CmSelfHeal;
1450 extern BOOLEAN CmpSelfHeal;
1451 extern ULONG CmpBootType;
1452 extern HANDLE CmpRegistryRootHandle;
1453 extern BOOLEAN ExpInTextModeSetup;
1454 extern BOOLEAN InitIsWinPEMode;
1455 extern ULONG CmpHashTableSize;
1456 extern ULONG CmpDelayedCloseSize, CmpDelayedCloseIndex;
1457 extern BOOLEAN CmpNoWrite;
1458 extern BOOLEAN CmpForceForceFlush;
1459 extern BOOLEAN CmpWasSetupBoot;
1460 extern PCMHIVE CmiVolatileHive;
1461 extern LIST_ENTRY CmiKeyObjectListHead;
1462 extern BOOLEAN CmpHoldLazyFlush;
1463
1464 //
1465 // Inlined functions
1466 //
1467 #include "cm_x.h"