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