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