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