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