Sync with trunk r64509.
[reactos.git] / 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_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 //
556 // Security Cache Functions
557 //
558 VOID
559 NTAPI
560 CmpInitSecurityCache(
561 IN PCMHIVE Hive
562 );
563
564 //
565 // Value Cache Functions
566 //
567 VALUE_SEARCH_RETURN_TYPE
568 NTAPI
569 CmpFindValueByNameFromCache(
570 IN PCM_KEY_CONTROL_BLOCK Kcb,
571 IN PCUNICODE_STRING Name,
572 OUT PCM_CACHED_VALUE **CachedValue,
573 OUT ULONG *Index,
574 OUT PCM_KEY_VALUE *Value,
575 OUT BOOLEAN *ValueIsCached,
576 OUT PHCELL_INDEX CellToRelease
577 );
578
579 VALUE_SEARCH_RETURN_TYPE
580 NTAPI
581 CmpQueryKeyValueData(
582 IN PCM_KEY_CONTROL_BLOCK Kcb,
583 IN PCM_CACHED_VALUE *CachedValue,
584 IN PCM_KEY_VALUE ValueKey,
585 IN BOOLEAN ValueIsCached,
586 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
587 IN PVOID KeyValueInformation,
588 IN ULONG Length,
589 OUT PULONG ResultLength,
590 OUT PNTSTATUS Status
591 );
592
593 VALUE_SEARCH_RETURN_TYPE
594 NTAPI
595 CmpGetValueListFromCache(
596 IN PCM_KEY_CONTROL_BLOCK Kcb,
597 OUT PCELL_DATA *CellData,
598 OUT BOOLEAN *IndexIsCached,
599 OUT PHCELL_INDEX ValueListToRelease
600 );
601
602 VALUE_SEARCH_RETURN_TYPE
603 NTAPI
604 CmpGetValueKeyFromCache(
605 IN PCM_KEY_CONTROL_BLOCK Kcb,
606 IN PCELL_DATA CellData,
607 IN ULONG Index,
608 OUT PCM_CACHED_VALUE **CachedValue,
609 OUT PCM_KEY_VALUE *Value,
610 IN BOOLEAN IndexIsCached,
611 OUT BOOLEAN *ValueIsCached,
612 OUT PHCELL_INDEX CellToRelease
613 );
614
615 VALUE_SEARCH_RETURN_TYPE
616 NTAPI
617 CmpCompareNewValueDataAgainstKCBCache(
618 IN PCM_KEY_CONTROL_BLOCK Kcb,
619 IN PUNICODE_STRING ValueName,
620 IN ULONG Type,
621 IN PVOID Data,
622 IN ULONG DataSize
623 );
624
625 //
626 // Registry Validation Functions
627 //
628 ULONG
629 NTAPI
630 CmCheckRegistry(
631 IN PCMHIVE Hive,
632 IN ULONG Flags
633 );
634
635 //
636 // Hive List Routines
637 //
638 BOOLEAN
639 NTAPI
640 CmpGetHiveName(
641 IN PCMHIVE Hive,
642 OUT PUNICODE_STRING HiveName
643 );
644
645 NTSTATUS
646 NTAPI
647 CmpAddToHiveFileList(
648 IN PCMHIVE Hive
649 );
650
651 VOID
652 NTAPI
653 CmpRemoveFromHiveFileList(
654 IN PCMHIVE Hive
655 );
656
657 //
658 // Quota Routines
659 //
660 VOID
661 NTAPI
662 CmpSetGlobalQuotaAllowed(
663 VOID
664 );
665
666 //
667 // Notification Routines
668 //
669 VOID
670 NTAPI
671 CmpReportNotify(
672 IN PCM_KEY_CONTROL_BLOCK Kcb,
673 IN PHHIVE Hive,
674 IN HCELL_INDEX Cell,
675 IN ULONG Filter
676 );
677
678 VOID
679 NTAPI
680 CmpFlushNotify(
681 IN PCM_KEY_BODY KeyBody,
682 IN BOOLEAN LockHeld
683 );
684
685 VOID
686 NTAPI
687 CmpInitCallback(
688 VOID
689 );
690
691 //
692 // KCB Cache/Delay Routines
693 //
694 VOID
695 NTAPI
696 CmpInitializeCache(
697 VOID
698 );
699
700 VOID
701 NTAPI
702 CmpInitCmPrivateDelayAlloc(
703 VOID
704 );
705
706 VOID
707 NTAPI
708 CmpInitCmPrivateAlloc(
709 VOID
710 );
711
712 VOID
713 NTAPI
714 CmpInitDelayDerefKCBEngine(
715 VOID
716 );
717
718 //
719 // Key Object Routines
720 //
721 VOID
722 NTAPI
723 CmpCloseKeyObject(
724 IN PEPROCESS Process OPTIONAL,
725 IN PVOID Object,
726 IN ACCESS_MASK GrantedAccess,
727 IN ULONG ProcessHandleCount,
728 IN ULONG SystemHandleCount
729 );
730
731 VOID
732 NTAPI
733 CmpDeleteKeyObject(
734 IN PVOID Object
735 );
736
737 NTSTATUS
738 NTAPI
739 CmpParseKey(
740 IN PVOID ParseObject,
741 IN PVOID ObjectType,
742 IN OUT PACCESS_STATE AccessState,
743 IN KPROCESSOR_MODE AccessMode,
744 IN ULONG Attributes,
745 IN OUT PUNICODE_STRING CompleteName,
746 IN OUT PUNICODE_STRING RemainingName,
747 IN OUT PVOID Context OPTIONAL,
748 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
749 OUT PVOID *Object
750 );
751
752 NTSTATUS
753 NTAPI
754 CmpSecurityMethod(
755 IN PVOID Object,
756 IN SECURITY_OPERATION_CODE OperationType,
757 IN PSECURITY_INFORMATION SecurityInformation,
758 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
759 IN OUT PULONG CapturedLength,
760 IN OUT PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor,
761 IN POOL_TYPE PoolType,
762 IN PGENERIC_MAPPING GenericMapping
763 );
764
765 NTSTATUS
766 NTAPI
767 CmpQueryKeyName(
768 IN PVOID Object,
769 IN BOOLEAN HasObjectName,
770 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
771 IN ULONG Length,
772 OUT PULONG ReturnLength,
773 IN KPROCESSOR_MODE AccessMode
774 );
775
776 //
777 // Hive Routines
778 //
779 NTSTATUS
780 NTAPI
781 CmpInitializeHive(
782 OUT PCMHIVE *CmHive,
783 IN ULONG Operation,
784 IN ULONG Flags,
785 IN ULONG FileType,
786 IN PVOID HiveData OPTIONAL,
787 IN HANDLE Primary,
788 IN HANDLE Log,
789 IN HANDLE External,
790 IN PCUNICODE_STRING FileName OPTIONAL,
791 IN ULONG CheckFlags
792 );
793
794 NTSTATUS
795 NTAPI
796 CmpDestroyHive(
797 IN PCMHIVE CmHive
798 );
799
800 PSECURITY_DESCRIPTOR
801 NTAPI
802 CmpHiveRootSecurityDescriptor(
803 VOID
804 );
805
806 NTSTATUS
807 NTAPI
808 CmpLinkHiveToMaster(
809 IN PUNICODE_STRING LinkName,
810 IN HANDLE RootDirectory,
811 IN PCMHIVE CmHive,
812 IN BOOLEAN Allocate,
813 IN PSECURITY_DESCRIPTOR SecurityDescriptor
814 );
815
816 NTSTATUS
817 NTAPI
818 CmpOpenHiveFiles(
819 IN PCUNICODE_STRING BaseName,
820 IN PCWSTR Extension OPTIONAL,
821 OUT PHANDLE Primary,
822 OUT PHANDLE Log,
823 OUT PULONG PrimaryDisposition,
824 OUT PULONG LogDisposition,
825 IN BOOLEAN CreateAllowed,
826 IN BOOLEAN MarkAsSystemHive,
827 IN BOOLEAN NoBuffering,
828 OUT PULONG ClusterSize OPTIONAL
829 );
830
831 NTSTATUS
832 NTAPI
833 CmpInitHiveFromFile(
834 IN PCUNICODE_STRING HiveName,
835 IN ULONG HiveFlags,
836 OUT PCMHIVE *Hive,
837 IN OUT PBOOLEAN New,
838 IN ULONG CheckFlags
839 );
840
841 VOID
842 NTAPI
843 CmpInitializeHiveList(
844 IN USHORT Flag
845 );
846
847 //
848 // Registry Utility Functions
849 //
850 BOOLEAN
851 NTAPI
852 CmpTestRegistryLockExclusive(
853 VOID
854 );
855
856 BOOLEAN
857 NTAPI
858 CmpTestRegistryLock(
859 VOID
860 );
861
862 VOID
863 NTAPI
864 CmpLockRegistryExclusive(
865 VOID
866 );
867
868 VOID
869 NTAPI
870 CmpLockRegistry(
871 VOID
872 );
873
874 VOID
875 NTAPI
876 CmpUnlockRegistry(
877 VOID
878 );
879
880 VOID
881 NTAPI
882 CmpLockHiveFlusherExclusive(
883 IN PCMHIVE Hive
884 );
885
886 VOID
887 NTAPI
888 CmpLockHiveFlusherShared(
889 IN PCMHIVE Hive
890 );
891
892 BOOLEAN
893 NTAPI
894 CmpTestHiveFlusherLockExclusive(
895 IN PCMHIVE Hive
896 );
897
898 BOOLEAN
899 NTAPI
900 CmpTestHiveFlusherLockShared(
901 IN PCMHIVE Hive
902 );
903
904 VOID
905 NTAPI
906 CmpUnlockHiveFlusher(
907 IN PCMHIVE Hive
908 );
909
910 //
911 // Delay Functions
912 //
913 PVOID
914 NTAPI
915 CmpAllocateDelayItem(
916 VOID
917 );
918
919 VOID
920 NTAPI
921 CmpFreeDelayItem(
922 PVOID Entry
923 );
924
925 VOID
926 NTAPI
927 CmpDelayDerefKeyControlBlock(
928 IN PCM_KEY_CONTROL_BLOCK Kcb
929 );
930
931 VOID
932 NTAPI
933 CmpAddToDelayedClose(
934 IN PCM_KEY_CONTROL_BLOCK Kcb,
935 IN BOOLEAN LockHeldExclusively
936 );
937
938 VOID
939 NTAPI
940 CmpArmDelayedCloseTimer(
941 VOID
942 );
943
944 VOID
945 NTAPI
946 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb);
947
948 VOID
949 NTAPI
950 CmpInitializeDelayedCloseTable(
951 VOID
952 );
953
954 //
955 // KCB Functions
956 //
957 PCM_KEY_CONTROL_BLOCK
958 NTAPI
959 CmpCreateKeyControlBlock(
960 IN PHHIVE Hive,
961 IN HCELL_INDEX Index,
962 IN PCM_KEY_NODE Node,
963 IN PCM_KEY_CONTROL_BLOCK Parent,
964 IN ULONG Flags,
965 IN PUNICODE_STRING KeyName
966 );
967
968 PCM_KEY_CONTROL_BLOCK
969 NTAPI
970 CmpAllocateKeyControlBlock(
971 VOID
972 );
973
974 VOID
975 NTAPI
976 CmpFreeKeyControlBlock(
977 IN PCM_KEY_CONTROL_BLOCK Kcb
978 );
979
980 VOID
981 NTAPI
982 CmpRemoveKeyControlBlock(
983 IN PCM_KEY_CONTROL_BLOCK Kcb
984 );
985
986 VOID
987 NTAPI
988 CmpCleanUpKcbValueCache(
989 IN PCM_KEY_CONTROL_BLOCK Kcb
990 );
991
992 VOID
993 NTAPI
994 CmpCleanUpKcbCacheWithLock(
995 IN PCM_KEY_CONTROL_BLOCK Kcb,
996 IN BOOLEAN LockHeldExclusively
997 );
998
999 VOID
1000 NTAPI
1001 CmpCleanUpSubKeyInfo(
1002 IN PCM_KEY_CONTROL_BLOCK Kcb
1003 );
1004
1005 PUNICODE_STRING
1006 NTAPI
1007 CmpConstructName(
1008 IN PCM_KEY_CONTROL_BLOCK Kcb
1009 );
1010
1011 BOOLEAN
1012 NTAPI
1013 CmpReferenceKeyControlBlock(
1014 IN PCM_KEY_CONTROL_BLOCK Kcb
1015 );
1016
1017 VOID
1018 NTAPI
1019 CmpDereferenceKeyControlBlockWithLock(
1020 IN PCM_KEY_CONTROL_BLOCK Kcb,
1021 IN BOOLEAN LockHeldExclusively
1022 );
1023
1024 VOID
1025 NTAPI
1026 CmpDereferenceKeyControlBlock(
1027 IN PCM_KEY_CONTROL_BLOCK Kcb
1028 );
1029
1030 VOID
1031 NTAPI
1032 EnlistKeyBodyWithKCB(
1033 IN PCM_KEY_BODY KeyObject,
1034 IN ULONG Flags
1035 );
1036
1037 VOID
1038 NTAPI
1039 DelistKeyBodyFromKCB(
1040 IN PCM_KEY_BODY KeyBody,
1041 IN BOOLEAN LockHeld
1042 );
1043
1044 NTSTATUS
1045 NTAPI
1046 CmpFreeKeyByCell(
1047 IN PHHIVE Hive,
1048 IN HCELL_INDEX Cell,
1049 IN BOOLEAN Unlink
1050 );
1051
1052 VOID
1053 NTAPI
1054 CmpAcquireTwoKcbLocksExclusiveByKey(
1055 IN ULONG ConvKey1,
1056 IN ULONG ConvKey2
1057 );
1058
1059 VOID
1060 NTAPI
1061 CmpReleaseTwoKcbLockByKey(
1062 IN ULONG ConvKey1,
1063 IN ULONG ConvKey2
1064 );
1065
1066 VOID
1067 NTAPI
1068 CmpFlushNotifiesOnKeyBodyList(
1069 IN PCM_KEY_CONTROL_BLOCK Kcb,
1070 IN BOOLEAN LockHeld
1071 );
1072
1073 //
1074 // Name Functions
1075 //
1076 LONG
1077 NTAPI
1078 CmpCompareCompressedName(
1079 IN PCUNICODE_STRING SearchName,
1080 IN PWCHAR CompressedName,
1081 IN ULONG NameLength
1082 );
1083
1084 USHORT
1085 NTAPI
1086 CmpNameSize(
1087 IN PHHIVE Hive,
1088 IN PUNICODE_STRING Name
1089 );
1090
1091 USHORT
1092 NTAPI
1093 CmpCompressedNameSize(
1094 IN PWCHAR Name,
1095 IN ULONG Length
1096 );
1097
1098 VOID
1099 NTAPI
1100 CmpCopyCompressedName(
1101 IN PWCHAR Destination,
1102 IN ULONG DestinationLength,
1103 IN PWCHAR Source,
1104 IN ULONG SourceLength
1105 );
1106
1107 USHORT
1108 NTAPI
1109 CmpCopyName(
1110 IN PHHIVE Hive,
1111 IN PWCHAR Destination,
1112 IN PUNICODE_STRING Source
1113 );
1114
1115 BOOLEAN
1116 NTAPI
1117 CmpFindNameInList(
1118 IN PHHIVE Hive,
1119 IN PCHILD_LIST ChildList,
1120 IN PUNICODE_STRING Name,
1121 IN PULONG ChildIndex,
1122 IN PHCELL_INDEX CellIndex
1123 );
1124
1125 //
1126 // Parse Routines
1127 //
1128 BOOLEAN
1129 NTAPI
1130 CmpGetNextName(
1131 IN OUT PUNICODE_STRING RemainingName,
1132 OUT PUNICODE_STRING NextName,
1133 OUT PBOOLEAN LastName
1134 );
1135
1136 //
1137 // Command Routines (Flush, Open, Close, Init);
1138 //
1139 BOOLEAN
1140 NTAPI
1141 CmpDoFlushAll(
1142 IN BOOLEAN ForceFlush
1143 );
1144
1145 VOID
1146 NTAPI
1147 CmpShutdownWorkers(
1148 VOID
1149 );
1150
1151 VOID
1152 NTAPI
1153 CmpCmdInit(
1154 IN BOOLEAN SetupBoot
1155 );
1156
1157 NTSTATUS
1158 NTAPI
1159 CmpCmdHiveOpen(
1160 IN POBJECT_ATTRIBUTES FileAttributes,
1161 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext,
1162 IN OUT PBOOLEAN Allocate,
1163 OUT PCMHIVE *NewHive,
1164 IN ULONG CheckFlags
1165 );
1166
1167 VOID
1168 NTAPI
1169 CmpLazyFlush(
1170 VOID
1171 );
1172
1173 //
1174 // Open/Create Routines
1175 //
1176 NTSTATUS
1177 NTAPI
1178 CmpDoCreate(
1179 IN PHHIVE Hive,
1180 IN HCELL_INDEX Cell,
1181 IN PACCESS_STATE AccessState,
1182 IN PUNICODE_STRING Name,
1183 IN KPROCESSOR_MODE AccessMode,
1184 IN PCM_PARSE_CONTEXT Context,
1185 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1186 OUT PVOID *Object
1187 );
1188
1189 NTSTATUS
1190 NTAPI
1191 CmpCreateLinkNode(
1192 IN PHHIVE Hive,
1193 IN HCELL_INDEX Cell,
1194 IN PACCESS_STATE AccessState,
1195 IN UNICODE_STRING Name,
1196 IN KPROCESSOR_MODE AccessMode,
1197 IN ULONG CreateOptions,
1198 IN PCM_PARSE_CONTEXT Context,
1199 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1200 OUT PVOID *Object
1201 );
1202
1203 //
1204 // Cell Index Routines
1205 //
1206
1207 HCELL_INDEX
1208 NTAPI
1209 CmpFindSubKeyByName(
1210 IN PHHIVE Hive,
1211 IN PCM_KEY_NODE Parent,
1212 IN PCUNICODE_STRING SearchName
1213 );
1214
1215 HCELL_INDEX
1216 NTAPI
1217 CmpFindSubKeyByNumber(
1218 IN PHHIVE Hive,
1219 IN PCM_KEY_NODE Node,
1220 IN ULONG Number
1221 );
1222
1223 ULONG
1224 NTAPI
1225 CmpComputeHashKey(
1226 IN ULONG Hash,
1227 IN PCUNICODE_STRING Name,
1228 IN BOOLEAN AllowSeparators
1229 );
1230
1231 BOOLEAN
1232 NTAPI
1233 CmpAddSubKey(
1234 IN PHHIVE Hive,
1235 IN HCELL_INDEX Parent,
1236 IN HCELL_INDEX Child
1237 );
1238
1239 BOOLEAN
1240 NTAPI
1241 CmpRemoveSubKey(
1242 IN PHHIVE Hive,
1243 IN HCELL_INDEX ParentKey,
1244 IN HCELL_INDEX TargetKey
1245 );
1246
1247 BOOLEAN
1248 NTAPI
1249 CmpMarkIndexDirty(
1250 IN PHHIVE Hive,
1251 HCELL_INDEX ParentKey,
1252 HCELL_INDEX TargetKey
1253 );
1254
1255 //
1256 // Cell Value Routines
1257 //
1258 HCELL_INDEX
1259 NTAPI
1260 CmpFindValueByName(
1261 IN PHHIVE Hive,
1262 IN PCM_KEY_NODE KeyNode,
1263 IN PUNICODE_STRING Name
1264 );
1265
1266 PCELL_DATA
1267 NTAPI
1268 CmpValueToData(
1269 IN PHHIVE Hive,
1270 IN PCM_KEY_VALUE Value,
1271 OUT PULONG Length
1272 );
1273
1274 NTSTATUS
1275 NTAPI
1276 CmpSetValueDataNew(
1277 IN PHHIVE Hive,
1278 IN PVOID Data,
1279 IN ULONG DataSize,
1280 IN ULONG StorageType,
1281 IN HCELL_INDEX ValueCell,
1282 OUT PHCELL_INDEX DataCell
1283 );
1284
1285 NTSTATUS
1286 NTAPI
1287 CmpAddValueToList(
1288 IN PHHIVE Hive,
1289 IN HCELL_INDEX ValueCell,
1290 IN ULONG Index,
1291 IN ULONG Type,
1292 IN OUT PCHILD_LIST ChildList
1293 );
1294
1295 BOOLEAN
1296 NTAPI
1297 CmpFreeValue(
1298 IN PHHIVE Hive,
1299 IN HCELL_INDEX Cell
1300 );
1301
1302 BOOLEAN
1303 NTAPI
1304 CmpMarkValueDataDirty(
1305 IN PHHIVE Hive,
1306 IN PCM_KEY_VALUE Value
1307 );
1308
1309 BOOLEAN
1310 NTAPI
1311 CmpFreeValueData(
1312 IN PHHIVE Hive,
1313 IN HCELL_INDEX DataCell,
1314 IN ULONG DataLength
1315 );
1316
1317 NTSTATUS
1318 NTAPI
1319 CmpRemoveValueFromList(
1320 IN PHHIVE Hive,
1321 IN ULONG Index,
1322 IN OUT PCHILD_LIST ChildList
1323 );
1324
1325 BOOLEAN
1326 NTAPI
1327 CmpGetValueData(
1328 IN PHHIVE Hive,
1329 IN PCM_KEY_VALUE Value,
1330 IN PULONG Length,
1331 OUT PVOID *Buffer,
1332 OUT PBOOLEAN BufferAllocated,
1333 OUT PHCELL_INDEX CellToRelease
1334 );
1335
1336 NTSTATUS
1337 NTAPI
1338 CmpCopyKeyValueList(
1339 IN PHHIVE SourceHive,
1340 IN PCHILD_LIST SrcValueList,
1341 IN PHHIVE DestinationHive,
1342 IN OUT PCHILD_LIST DestValueList,
1343 IN HSTORAGE_TYPE StorageType
1344 );
1345
1346 //
1347 // Boot Routines
1348 //
1349 HCELL_INDEX
1350 NTAPI
1351 CmpFindControlSet(
1352 IN PHHIVE SystemHive,
1353 IN HCELL_INDEX RootCell,
1354 IN PUNICODE_STRING SelectKeyName,
1355 OUT PBOOLEAN AutoSelect
1356 );
1357
1358 VOID
1359 NTAPI
1360 CmGetSystemControlValues(
1361 IN PVOID SystemHiveData,
1362 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1363 );
1364
1365
1366 //
1367 // Hardware Configuration Routines
1368 //
1369 NTSTATUS
1370 NTAPI
1371 CmpInitializeRegistryNode(
1372 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
1373 IN HANDLE NodeHandle,
1374 OUT PHANDLE NewHandle,
1375 IN INTERFACE_TYPE InterfaceType,
1376 IN ULONG BusNumber,
1377 IN PUSHORT DeviceIndexTable
1378 );
1379
1380 NTSTATUS
1381 NTAPI
1382 CmpInitializeMachineDependentConfiguration(
1383 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1384 );
1385
1386 NTSTATUS
1387 NTAPI
1388 CmpInitializeHardwareConfiguration(
1389 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1390 );
1391
1392 //
1393 // Wrapper Routines
1394 //
1395 NTSTATUS
1396 NTAPI
1397 CmpCreateEvent(
1398 IN EVENT_TYPE EventType,
1399 OUT PHANDLE EventHandle,
1400 OUT PKEVENT *Event
1401 );
1402
1403 PVOID
1404 NTAPI
1405 CmpAllocate(
1406 IN SIZE_T Size,
1407 IN BOOLEAN Paged,
1408 IN ULONG Tag
1409 );
1410
1411 VOID
1412 NTAPI
1413 CmpFree(
1414 IN PVOID Ptr,
1415 IN ULONG Quota
1416 );
1417
1418 BOOLEAN
1419 NTAPI
1420 CmpFileRead(
1421 IN PHHIVE RegistryHive,
1422 IN ULONG FileType,
1423 IN OUT PULONG FileOffset,
1424 OUT PVOID Buffer,
1425 IN SIZE_T BufferLength
1426 );
1427
1428 BOOLEAN
1429 NTAPI
1430 CmpFileWrite(
1431 IN PHHIVE RegistryHive,
1432 IN ULONG FileType,
1433 IN OUT PULONG FileOffset,
1434 IN PVOID Buffer,
1435 IN SIZE_T BufferLength
1436 );
1437
1438 BOOLEAN
1439 NTAPI
1440 CmpFileSetSize(
1441 IN PHHIVE RegistryHive,
1442 IN ULONG FileType,
1443 IN ULONG FileSize,
1444 IN ULONG OldFileSize
1445 );
1446
1447 BOOLEAN
1448 NTAPI
1449 CmpFileFlush(
1450 IN PHHIVE RegistryHive,
1451 IN ULONG FileType,
1452 IN OUT PLARGE_INTEGER FileOffset,
1453 IN ULONG Length
1454 );
1455
1456 //
1457 // Configuration Manager side of Registry System Calls
1458 //
1459 NTSTATUS
1460 NTAPI
1461 CmEnumerateValueKey(
1462 IN PCM_KEY_CONTROL_BLOCK Kcb,
1463 IN ULONG Index,
1464 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1465 IN PVOID KeyValueInformation,
1466 IN ULONG Length,
1467 IN PULONG ResultLength);
1468
1469 NTSTATUS
1470 NTAPI
1471 CmSetValueKey(
1472 IN PCM_KEY_CONTROL_BLOCK Kcb,
1473 IN PUNICODE_STRING ValueName,
1474 IN ULONG Type,
1475 IN PVOID Data,
1476 IN ULONG DataSize);
1477
1478 NTSTATUS
1479 NTAPI
1480 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1481 IN KEY_INFORMATION_CLASS KeyInformationClass,
1482 IN PVOID KeyInformation,
1483 IN ULONG Length,
1484 IN PULONG ResultLength
1485 );
1486
1487 NTSTATUS
1488 NTAPI
1489 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1490 IN ULONG Index,
1491 IN KEY_INFORMATION_CLASS KeyInformationClass,
1492 IN PVOID KeyInformation,
1493 IN ULONG Length,
1494 IN PULONG ResultLength
1495 );
1496
1497 NTSTATUS
1498 NTAPI
1499 CmDeleteKey(
1500 IN PCM_KEY_BODY KeyBody
1501 );
1502
1503 NTSTATUS
1504 NTAPI
1505 CmFlushKey(
1506 IN PCM_KEY_CONTROL_BLOCK Kcb,
1507 IN BOOLEAN EclusiveLock
1508 );
1509
1510 NTSTATUS
1511 NTAPI
1512 CmDeleteValueKey(
1513 IN PCM_KEY_CONTROL_BLOCK Kcb,
1514 IN UNICODE_STRING ValueName
1515 );
1516
1517 NTSTATUS
1518 NTAPI
1519 CmQueryValueKey(
1520 IN PCM_KEY_CONTROL_BLOCK Kcb,
1521 IN UNICODE_STRING ValueName,
1522 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1523 IN PVOID KeyValueInformation,
1524 IN ULONG Length,
1525 IN PULONG ResultLength
1526 );
1527
1528 NTSTATUS
1529 NTAPI
1530 CmLoadKey(
1531 IN POBJECT_ATTRIBUTES TargetKey,
1532 IN POBJECT_ATTRIBUTES SourceFile,
1533 IN ULONG Flags,
1534 IN PCM_KEY_BODY KeyBody
1535 );
1536
1537 NTSTATUS
1538 NTAPI
1539 CmUnloadKey(
1540 IN PCM_KEY_CONTROL_BLOCK Kcb,
1541 IN ULONG Flags
1542 );
1543
1544 ULONG
1545 NTAPI
1546 CmCountOpenSubKeys(
1547 IN PCM_KEY_CONTROL_BLOCK RootKcb,
1548 IN BOOLEAN RemoveEmptyCacheEntries
1549 );
1550
1551 HCELL_INDEX
1552 NTAPI
1553 CmpCopyCell(
1554 IN PHHIVE SourceHive,
1555 IN HCELL_INDEX SourceCell,
1556 IN PHHIVE DestinationHive,
1557 IN HSTORAGE_TYPE StorageType
1558 );
1559
1560 NTSTATUS
1561 NTAPI
1562 CmpDeepCopyKey(
1563 IN PHHIVE SourceHive,
1564 IN HCELL_INDEX SrcKeyCell,
1565 IN PHHIVE DestinationHive,
1566 IN HSTORAGE_TYPE StorageType,
1567 OUT PHCELL_INDEX DestKeyCell OPTIONAL
1568 );
1569
1570 NTSTATUS
1571 NTAPI
1572 CmSaveKey(
1573 IN PCM_KEY_CONTROL_BLOCK Kcb,
1574 IN HANDLE FileHandle,
1575 IN ULONG Flags
1576 );
1577
1578 //
1579 // Startup and Shutdown
1580 //
1581 BOOLEAN
1582 NTAPI
1583 CmInitSystem1(
1584 VOID
1585 );
1586
1587 VOID
1588 NTAPI
1589 CmShutdownSystem(
1590 VOID
1591 );
1592
1593 VOID
1594 NTAPI
1595 CmSetLazyFlushState(
1596 IN BOOLEAN Enable
1597 );
1598
1599 VOID
1600 NTAPI
1601 CmpSetVersionData(
1602 VOID
1603 );
1604
1605 //
1606 // Driver List Routines
1607 //
1608 PUNICODE_STRING*
1609 NTAPI
1610 CmGetSystemDriverList(
1611 VOID
1612 );
1613
1614 BOOLEAN
1615 NTAPI
1616 CmpFindDrivers(
1617 IN PHHIVE Hive,
1618 IN HCELL_INDEX ControlSet,
1619 IN SERVICE_LOAD_TYPE LoadType,
1620 IN PWSTR BootFileSystem OPTIONAL,
1621 IN PLIST_ENTRY DriverListHead
1622 );
1623
1624
1625 BOOLEAN
1626 NTAPI
1627 CmpSortDriverList(
1628 IN PHHIVE Hive,
1629 IN HCELL_INDEX ControlSet,
1630 IN PLIST_ENTRY DriverListHead
1631 );
1632
1633 BOOLEAN
1634 NTAPI
1635 CmpResolveDriverDependencies(
1636 IN PLIST_ENTRY DriverListHead
1637 );
1638
1639 BOOLEAN
1640 NTAPI
1641 CmpIsSafe(
1642 IN PHHIVE Hive,
1643 IN HCELL_INDEX SafeBootCell,
1644 IN HCELL_INDEX DriverCell);
1645
1646 //
1647 // Global variables accessible from all of Cm
1648 //
1649 extern ULONG CmpTraceLevel;
1650 extern BOOLEAN CmpSpecialBootCondition;
1651 extern BOOLEAN CmpFlushOnLockRelease;
1652 extern BOOLEAN CmpShareSystemHives;
1653 extern BOOLEAN CmpMiniNTBoot;
1654 extern EX_PUSH_LOCK CmpHiveListHeadLock, CmpLoadHiveLock;
1655 extern LIST_ENTRY CmpHiveListHead;
1656 extern POBJECT_TYPE CmpKeyObjectType;
1657 extern ERESOURCE CmpRegistryLock;
1658 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable;
1659 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable;
1660 extern KGUARDED_MUTEX CmpDelayedCloseTableLock;
1661 extern CMHIVE CmControlHive;
1662 extern WCHAR CmDefaultLanguageId[];
1663 extern ULONG CmDefaultLanguageIdLength;
1664 extern ULONG CmDefaultLanguageIdType;
1665 extern WCHAR CmInstallUILanguageId[];
1666 extern ULONG CmInstallUILanguageIdLength;
1667 extern ULONG CmInstallUILanguageIdType;
1668 extern ULONG CmNtGlobalFlag;
1669 extern LANGID PsInstallUILanguageId;
1670 extern LANGID PsDefaultUILanguageId;
1671 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector[];
1672 extern ULONG CmpConfigurationAreaSize;
1673 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData;
1674 extern UNICODE_STRING CmTypeName[];
1675 extern UNICODE_STRING CmClassName[];
1676 extern CMP_MF_TYPE CmpMultifunctionTypes[];
1677 extern USHORT CmpUnknownBusCount;
1678 extern ULONG CmpTypeCount[MaximumType + 1];
1679 extern HIVE_LIST_ENTRY CmpMachineHiveList[];
1680 extern UNICODE_STRING CmSymbolicLinkValueName;
1681 extern UNICODE_STRING CmpSystemStartOptions;
1682 extern UNICODE_STRING CmpLoadOptions;
1683 extern BOOLEAN CmSelfHeal;
1684 extern BOOLEAN CmpSelfHeal;
1685 extern ULONG CmpBootType;
1686 extern HANDLE CmpRegistryRootHandle;
1687 extern BOOLEAN ExpInTextModeSetup;
1688 extern BOOLEAN InitIsWinPEMode;
1689 extern ULONG CmpHashTableSize;
1690 extern ULONG CmpDelayedCloseSize, CmpDelayedCloseIndex;
1691 extern BOOLEAN CmpNoWrite;
1692 extern BOOLEAN CmpForceForceFlush;
1693 extern BOOLEAN CmpWasSetupBoot;
1694 extern BOOLEAN CmpProfileLoaded;
1695 extern PCMHIVE CmiVolatileHive;
1696 extern LIST_ENTRY CmiKeyObjectListHead;
1697 extern BOOLEAN CmpHoldLazyFlush;
1698
1699 //
1700 // Inlined functions
1701 //
1702 #include "cm_x.h"