Sync with trunk r63283
[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_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 PSECURITY_DESCRIPTOR
790 NTAPI
791 CmpHiveRootSecurityDescriptor(
792 VOID
793 );
794
795 NTSTATUS
796 NTAPI
797 CmpLinkHiveToMaster(
798 IN PUNICODE_STRING LinkName,
799 IN HANDLE RootDirectory,
800 IN PCMHIVE CmHive,
801 IN BOOLEAN Allocate,
802 IN PSECURITY_DESCRIPTOR SecurityDescriptor
803 );
804
805 NTSTATUS
806 NTAPI
807 CmpOpenHiveFiles(
808 IN PCUNICODE_STRING BaseName,
809 IN PCWSTR Extension OPTIONAL,
810 OUT PHANDLE Primary,
811 OUT PHANDLE Log,
812 OUT PULONG PrimaryDisposition,
813 OUT PULONG LogDisposition,
814 IN BOOLEAN CreateAllowed,
815 IN BOOLEAN MarkAsSystemHive,
816 IN BOOLEAN NoBuffering,
817 OUT PULONG ClusterSize OPTIONAL
818 );
819
820 NTSTATUS
821 NTAPI
822 CmpInitHiveFromFile(
823 IN PCUNICODE_STRING HiveName,
824 IN ULONG HiveFlags,
825 OUT PCMHIVE *Hive,
826 IN OUT PBOOLEAN New,
827 IN ULONG CheckFlags
828 );
829
830 VOID
831 NTAPI
832 CmpInitializeHiveList(
833 IN USHORT Flag
834 );
835
836 //
837 // Registry Utility Functions
838 //
839 BOOLEAN
840 NTAPI
841 CmpTestRegistryLockExclusive(
842 VOID
843 );
844
845 BOOLEAN
846 NTAPI
847 CmpTestRegistryLock(
848 VOID
849 );
850
851 VOID
852 NTAPI
853 CmpLockRegistryExclusive(
854 VOID
855 );
856
857 VOID
858 NTAPI
859 CmpLockRegistry(
860 VOID
861 );
862
863 VOID
864 NTAPI
865 CmpUnlockRegistry(
866 VOID
867 );
868
869 VOID
870 NTAPI
871 CmpLockHiveFlusherExclusive(
872 IN PCMHIVE Hive
873 );
874
875 VOID
876 NTAPI
877 CmpLockHiveFlusherShared(
878 IN PCMHIVE Hive
879 );
880
881 BOOLEAN
882 NTAPI
883 CmpTestHiveFlusherLockExclusive(
884 IN PCMHIVE Hive
885 );
886
887 BOOLEAN
888 NTAPI
889 CmpTestHiveFlusherLockShared(
890 IN PCMHIVE Hive
891 );
892
893 VOID
894 NTAPI
895 CmpUnlockHiveFlusher(
896 IN PCMHIVE Hive
897 );
898
899 //
900 // Delay Functions
901 //
902 PVOID
903 NTAPI
904 CmpAllocateDelayItem(
905 VOID
906 );
907
908 VOID
909 NTAPI
910 CmpFreeDelayItem(
911 PVOID Entry
912 );
913
914 VOID
915 NTAPI
916 CmpDelayDerefKeyControlBlock(
917 IN PCM_KEY_CONTROL_BLOCK Kcb
918 );
919
920 VOID
921 NTAPI
922 CmpAddToDelayedClose(
923 IN PCM_KEY_CONTROL_BLOCK Kcb,
924 IN BOOLEAN LockHeldExclusively
925 );
926
927 VOID
928 NTAPI
929 CmpArmDelayedCloseTimer(
930 VOID
931 );
932
933 VOID
934 NTAPI
935 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb);
936
937 VOID
938 NTAPI
939 CmpInitializeDelayedCloseTable(
940 VOID
941 );
942
943 //
944 // KCB Functions
945 //
946 PCM_KEY_CONTROL_BLOCK
947 NTAPI
948 CmpCreateKeyControlBlock(
949 IN PHHIVE Hive,
950 IN HCELL_INDEX Index,
951 IN PCM_KEY_NODE Node,
952 IN PCM_KEY_CONTROL_BLOCK Parent,
953 IN ULONG Flags,
954 IN PUNICODE_STRING KeyName
955 );
956
957 PCM_KEY_CONTROL_BLOCK
958 NTAPI
959 CmpAllocateKeyControlBlock(
960 VOID
961 );
962
963 VOID
964 NTAPI
965 CmpFreeKeyControlBlock(
966 IN PCM_KEY_CONTROL_BLOCK Kcb
967 );
968
969 VOID
970 NTAPI
971 CmpRemoveKeyControlBlock(
972 IN PCM_KEY_CONTROL_BLOCK Kcb
973 );
974
975 VOID
976 NTAPI
977 CmpCleanUpKcbValueCache(
978 IN PCM_KEY_CONTROL_BLOCK Kcb
979 );
980
981 VOID
982 NTAPI
983 CmpCleanUpKcbCacheWithLock(
984 IN PCM_KEY_CONTROL_BLOCK Kcb,
985 IN BOOLEAN LockHeldExclusively
986 );
987
988 VOID
989 NTAPI
990 CmpCleanUpSubKeyInfo(
991 IN PCM_KEY_CONTROL_BLOCK Kcb
992 );
993
994 PUNICODE_STRING
995 NTAPI
996 CmpConstructName(
997 IN PCM_KEY_CONTROL_BLOCK Kcb
998 );
999
1000 BOOLEAN
1001 NTAPI
1002 CmpReferenceKeyControlBlock(
1003 IN PCM_KEY_CONTROL_BLOCK Kcb
1004 );
1005
1006 VOID
1007 NTAPI
1008 CmpDereferenceKeyControlBlockWithLock(
1009 IN PCM_KEY_CONTROL_BLOCK Kcb,
1010 IN BOOLEAN LockHeldExclusively
1011 );
1012
1013 VOID
1014 NTAPI
1015 CmpDereferenceKeyControlBlock(
1016 IN PCM_KEY_CONTROL_BLOCK Kcb
1017 );
1018
1019 VOID
1020 NTAPI
1021 EnlistKeyBodyWithKCB(
1022 IN PCM_KEY_BODY KeyObject,
1023 IN ULONG Flags
1024 );
1025
1026 VOID
1027 NTAPI
1028 DelistKeyBodyFromKCB(
1029 IN PCM_KEY_BODY KeyBody,
1030 IN BOOLEAN LockHeld
1031 );
1032
1033 NTSTATUS
1034 NTAPI
1035 CmpFreeKeyByCell(
1036 IN PHHIVE Hive,
1037 IN HCELL_INDEX Cell,
1038 IN BOOLEAN Unlink
1039 );
1040
1041 VOID
1042 NTAPI
1043 CmpAcquireTwoKcbLocksExclusiveByKey(
1044 IN ULONG ConvKey1,
1045 IN ULONG ConvKey2
1046 );
1047
1048 VOID
1049 NTAPI
1050 CmpReleaseTwoKcbLockByKey(
1051 IN ULONG ConvKey1,
1052 IN ULONG ConvKey2
1053 );
1054
1055 VOID
1056 NTAPI
1057 CmpFlushNotifiesOnKeyBodyList(
1058 IN PCM_KEY_CONTROL_BLOCK Kcb,
1059 IN BOOLEAN LockHeld
1060 );
1061
1062 //
1063 // Name Functions
1064 //
1065 LONG
1066 NTAPI
1067 CmpCompareCompressedName(
1068 IN PCUNICODE_STRING SearchName,
1069 IN PWCHAR CompressedName,
1070 IN ULONG NameLength
1071 );
1072
1073 USHORT
1074 NTAPI
1075 CmpNameSize(
1076 IN PHHIVE Hive,
1077 IN PUNICODE_STRING Name
1078 );
1079
1080 USHORT
1081 NTAPI
1082 CmpCompressedNameSize(
1083 IN PWCHAR Name,
1084 IN ULONG Length
1085 );
1086
1087 VOID
1088 NTAPI
1089 CmpCopyCompressedName(
1090 IN PWCHAR Destination,
1091 IN ULONG DestinationLength,
1092 IN PWCHAR Source,
1093 IN ULONG SourceLength
1094 );
1095
1096 USHORT
1097 NTAPI
1098 CmpCopyName(
1099 IN PHHIVE Hive,
1100 IN PWCHAR Destination,
1101 IN PUNICODE_STRING Source
1102 );
1103
1104 BOOLEAN
1105 NTAPI
1106 CmpFindNameInList(
1107 IN PHHIVE Hive,
1108 IN PCHILD_LIST ChildList,
1109 IN PUNICODE_STRING Name,
1110 IN PULONG ChildIndex,
1111 IN PHCELL_INDEX CellIndex
1112 );
1113
1114 //
1115 // Parse Routines
1116 //
1117 BOOLEAN
1118 NTAPI
1119 CmpGetNextName(
1120 IN OUT PUNICODE_STRING RemainingName,
1121 OUT PUNICODE_STRING NextName,
1122 OUT PBOOLEAN LastName
1123 );
1124
1125 //
1126 // Command Routines (Flush, Open, Close, Init);
1127 //
1128 BOOLEAN
1129 NTAPI
1130 CmpDoFlushAll(
1131 IN BOOLEAN ForceFlush
1132 );
1133
1134 VOID
1135 NTAPI
1136 CmpShutdownWorkers(
1137 VOID
1138 );
1139
1140 VOID
1141 NTAPI
1142 CmpCmdInit(
1143 IN BOOLEAN SetupBoot
1144 );
1145
1146 NTSTATUS
1147 NTAPI
1148 CmpCmdHiveOpen(
1149 IN POBJECT_ATTRIBUTES FileAttributes,
1150 IN PSECURITY_CLIENT_CONTEXT ImpersonationContext,
1151 IN OUT PBOOLEAN Allocate,
1152 OUT PCMHIVE *NewHive,
1153 IN ULONG CheckFlags
1154 );
1155
1156 VOID
1157 NTAPI
1158 CmpLazyFlush(
1159 VOID
1160 );
1161
1162 //
1163 // Open/Create Routines
1164 //
1165 NTSTATUS
1166 NTAPI
1167 CmpDoCreate(
1168 IN PHHIVE Hive,
1169 IN HCELL_INDEX Cell,
1170 IN PACCESS_STATE AccessState,
1171 IN PUNICODE_STRING Name,
1172 IN KPROCESSOR_MODE AccessMode,
1173 IN PCM_PARSE_CONTEXT Context,
1174 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1175 OUT PVOID *Object
1176 );
1177
1178 NTSTATUS
1179 NTAPI
1180 CmpCreateLinkNode(
1181 IN PHHIVE Hive,
1182 IN HCELL_INDEX Cell,
1183 IN PACCESS_STATE AccessState,
1184 IN UNICODE_STRING Name,
1185 IN KPROCESSOR_MODE AccessMode,
1186 IN ULONG CreateOptions,
1187 IN PCM_PARSE_CONTEXT Context,
1188 IN PCM_KEY_CONTROL_BLOCK ParentKcb,
1189 OUT PVOID *Object
1190 );
1191
1192 //
1193 // Cell Index Routines
1194 //
1195
1196 HCELL_INDEX
1197 NTAPI
1198 CmpFindSubKeyByName(
1199 IN PHHIVE Hive,
1200 IN PCM_KEY_NODE Parent,
1201 IN PCUNICODE_STRING SearchName
1202 );
1203
1204 HCELL_INDEX
1205 NTAPI
1206 CmpFindSubKeyByNumber(
1207 IN PHHIVE Hive,
1208 IN PCM_KEY_NODE Node,
1209 IN ULONG Number
1210 );
1211
1212 ULONG
1213 NTAPI
1214 CmpComputeHashKey(
1215 IN ULONG Hash,
1216 IN PCUNICODE_STRING Name,
1217 IN BOOLEAN AllowSeparators
1218 );
1219
1220 BOOLEAN
1221 NTAPI
1222 CmpAddSubKey(
1223 IN PHHIVE Hive,
1224 IN HCELL_INDEX Parent,
1225 IN HCELL_INDEX Child
1226 );
1227
1228 BOOLEAN
1229 NTAPI
1230 CmpRemoveSubKey(
1231 IN PHHIVE Hive,
1232 IN HCELL_INDEX ParentKey,
1233 IN HCELL_INDEX TargetKey
1234 );
1235
1236 BOOLEAN
1237 NTAPI
1238 CmpMarkIndexDirty(
1239 IN PHHIVE Hive,
1240 HCELL_INDEX ParentKey,
1241 HCELL_INDEX TargetKey
1242 );
1243
1244 //
1245 // Cell Value Routines
1246 //
1247 HCELL_INDEX
1248 NTAPI
1249 CmpFindValueByName(
1250 IN PHHIVE Hive,
1251 IN PCM_KEY_NODE KeyNode,
1252 IN PUNICODE_STRING Name
1253 );
1254
1255 PCELL_DATA
1256 NTAPI
1257 CmpValueToData(
1258 IN PHHIVE Hive,
1259 IN PCM_KEY_VALUE Value,
1260 OUT PULONG Length
1261 );
1262
1263 NTSTATUS
1264 NTAPI
1265 CmpSetValueDataNew(
1266 IN PHHIVE Hive,
1267 IN PVOID Data,
1268 IN ULONG DataSize,
1269 IN ULONG StorageType,
1270 IN HCELL_INDEX ValueCell,
1271 OUT PHCELL_INDEX DataCell
1272 );
1273
1274 NTSTATUS
1275 NTAPI
1276 CmpAddValueToList(
1277 IN PHHIVE Hive,
1278 IN HCELL_INDEX ValueCell,
1279 IN ULONG Index,
1280 IN ULONG Type,
1281 IN OUT PCHILD_LIST ChildList
1282 );
1283
1284 BOOLEAN
1285 NTAPI
1286 CmpFreeValue(
1287 IN PHHIVE Hive,
1288 IN HCELL_INDEX Cell
1289 );
1290
1291 BOOLEAN
1292 NTAPI
1293 CmpMarkValueDataDirty(
1294 IN PHHIVE Hive,
1295 IN PCM_KEY_VALUE Value
1296 );
1297
1298 BOOLEAN
1299 NTAPI
1300 CmpFreeValueData(
1301 IN PHHIVE Hive,
1302 IN HCELL_INDEX DataCell,
1303 IN ULONG DataLength
1304 );
1305
1306 NTSTATUS
1307 NTAPI
1308 CmpRemoveValueFromList(
1309 IN PHHIVE Hive,
1310 IN ULONG Index,
1311 IN OUT PCHILD_LIST ChildList
1312 );
1313
1314 BOOLEAN
1315 NTAPI
1316 CmpGetValueData(
1317 IN PHHIVE Hive,
1318 IN PCM_KEY_VALUE Value,
1319 IN PULONG Length,
1320 OUT PVOID *Buffer,
1321 OUT PBOOLEAN BufferAllocated,
1322 OUT PHCELL_INDEX CellToRelease
1323 );
1324
1325 //
1326 // Boot Routines
1327 //
1328 HCELL_INDEX
1329 NTAPI
1330 CmpFindControlSet(
1331 IN PHHIVE SystemHive,
1332 IN HCELL_INDEX RootCell,
1333 IN PUNICODE_STRING SelectKeyName,
1334 OUT PBOOLEAN AutoSelect
1335 );
1336
1337 VOID
1338 NTAPI
1339 CmGetSystemControlValues(
1340 IN PVOID SystemHiveData,
1341 IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
1342 );
1343
1344
1345 //
1346 // Hardware Configuration Routines
1347 //
1348 NTSTATUS
1349 NTAPI
1350 CmpInitializeRegistryNode(
1351 IN PCONFIGURATION_COMPONENT_DATA CurrentEntry,
1352 IN HANDLE NodeHandle,
1353 OUT PHANDLE NewHandle,
1354 IN INTERFACE_TYPE InterfaceType,
1355 IN ULONG BusNumber,
1356 IN PUSHORT DeviceIndexTable
1357 );
1358
1359 NTSTATUS
1360 NTAPI
1361 CmpInitializeMachineDependentConfiguration(
1362 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1363 );
1364
1365 NTSTATUS
1366 NTAPI
1367 CmpInitializeHardwareConfiguration(
1368 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1369 );
1370
1371 //
1372 // Wrapper Routines
1373 //
1374 NTSTATUS
1375 NTAPI
1376 CmpCreateEvent(
1377 IN EVENT_TYPE EventType,
1378 OUT PHANDLE EventHandle,
1379 OUT PKEVENT *Event
1380 );
1381
1382 PVOID
1383 NTAPI
1384 CmpAllocate(
1385 IN SIZE_T Size,
1386 IN BOOLEAN Paged,
1387 IN ULONG Tag
1388 );
1389
1390 VOID
1391 NTAPI
1392 CmpFree(
1393 IN PVOID Ptr,
1394 IN ULONG Quota
1395 );
1396
1397 BOOLEAN
1398 NTAPI
1399 CmpFileRead(
1400 IN PHHIVE RegistryHive,
1401 IN ULONG FileType,
1402 IN OUT PULONG FileOffset,
1403 OUT PVOID Buffer,
1404 IN SIZE_T BufferLength
1405 );
1406
1407 BOOLEAN
1408 NTAPI
1409 CmpFileWrite(
1410 IN PHHIVE RegistryHive,
1411 IN ULONG FileType,
1412 IN OUT PULONG FileOffset,
1413 IN PVOID Buffer,
1414 IN SIZE_T BufferLength
1415 );
1416
1417 BOOLEAN
1418 NTAPI
1419 CmpFileSetSize(
1420 IN PHHIVE RegistryHive,
1421 IN ULONG FileType,
1422 IN ULONG FileSize,
1423 IN ULONG OldFileSize
1424 );
1425
1426 BOOLEAN
1427 NTAPI
1428 CmpFileFlush(
1429 IN PHHIVE RegistryHive,
1430 IN ULONG FileType,
1431 IN OUT PLARGE_INTEGER FileOffset,
1432 IN ULONG Length
1433 );
1434
1435 //
1436 // Configuration Manager side of Registry System Calls
1437 //
1438 NTSTATUS
1439 NTAPI
1440 CmEnumerateValueKey(
1441 IN PCM_KEY_CONTROL_BLOCK Kcb,
1442 IN ULONG Index,
1443 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1444 IN PVOID KeyValueInformation,
1445 IN ULONG Length,
1446 IN PULONG ResultLength);
1447
1448 NTSTATUS
1449 NTAPI
1450 CmSetValueKey(
1451 IN PCM_KEY_CONTROL_BLOCK Kcb,
1452 IN PUNICODE_STRING ValueName,
1453 IN ULONG Type,
1454 IN PVOID Data,
1455 IN ULONG DataSize);
1456
1457 NTSTATUS
1458 NTAPI
1459 CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1460 IN KEY_INFORMATION_CLASS KeyInformationClass,
1461 IN PVOID KeyInformation,
1462 IN ULONG Length,
1463 IN PULONG ResultLength
1464 );
1465
1466 NTSTATUS
1467 NTAPI
1468 CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
1469 IN ULONG Index,
1470 IN KEY_INFORMATION_CLASS KeyInformationClass,
1471 IN PVOID KeyInformation,
1472 IN ULONG Length,
1473 IN PULONG ResultLength
1474 );
1475
1476 NTSTATUS
1477 NTAPI
1478 CmDeleteKey(
1479 IN PCM_KEY_BODY KeyBody
1480 );
1481
1482 NTSTATUS
1483 NTAPI
1484 CmFlushKey(
1485 IN PCM_KEY_CONTROL_BLOCK Kcb,
1486 IN BOOLEAN EclusiveLock
1487 );
1488
1489 NTSTATUS
1490 NTAPI
1491 CmDeleteValueKey(
1492 IN PCM_KEY_CONTROL_BLOCK Kcb,
1493 IN UNICODE_STRING ValueName
1494 );
1495
1496 NTSTATUS
1497 NTAPI
1498 CmQueryValueKey(
1499 IN PCM_KEY_CONTROL_BLOCK Kcb,
1500 IN UNICODE_STRING ValueName,
1501 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1502 IN PVOID KeyValueInformation,
1503 IN ULONG Length,
1504 IN PULONG ResultLength
1505 );
1506
1507 NTSTATUS
1508 NTAPI
1509 CmLoadKey(
1510 IN POBJECT_ATTRIBUTES TargetKey,
1511 IN POBJECT_ATTRIBUTES SourceFile,
1512 IN ULONG Flags,
1513 IN PCM_KEY_BODY KeyBody
1514 );
1515
1516 NTSTATUS
1517 NTAPI
1518 CmUnloadKey(
1519 IN PCM_KEY_CONTROL_BLOCK Kcb,
1520 IN ULONG Flags
1521 );
1522
1523 ULONG
1524 NTAPI
1525 CmCountOpenSubKeys(
1526 IN PCM_KEY_CONTROL_BLOCK RootKcb,
1527 IN BOOLEAN RemoveEmptyCacheEntries
1528 );
1529
1530 //
1531 // Startup and Shutdown
1532 //
1533 BOOLEAN
1534 NTAPI
1535 CmInitSystem1(
1536 VOID
1537 );
1538
1539 VOID
1540 NTAPI
1541 CmShutdownSystem(
1542 VOID
1543 );
1544
1545 VOID
1546 NTAPI
1547 CmSetLazyFlushState(
1548 IN BOOLEAN Enable
1549 );
1550
1551 VOID
1552 NTAPI
1553 CmpSetVersionData(
1554 VOID
1555 );
1556
1557 //
1558 // Driver List Routines
1559 //
1560 PUNICODE_STRING*
1561 NTAPI
1562 CmGetSystemDriverList(
1563 VOID
1564 );
1565
1566 BOOLEAN
1567 NTAPI
1568 CmpFindDrivers(
1569 IN PHHIVE Hive,
1570 IN HCELL_INDEX ControlSet,
1571 IN SERVICE_LOAD_TYPE LoadType,
1572 IN PWSTR BootFileSystem OPTIONAL,
1573 IN PLIST_ENTRY DriverListHead
1574 );
1575
1576
1577 BOOLEAN
1578 NTAPI
1579 CmpSortDriverList(
1580 IN PHHIVE Hive,
1581 IN HCELL_INDEX ControlSet,
1582 IN PLIST_ENTRY DriverListHead
1583 );
1584
1585 BOOLEAN
1586 NTAPI
1587 CmpResolveDriverDependencies(
1588 IN PLIST_ENTRY DriverListHead
1589 );
1590
1591 BOOLEAN
1592 NTAPI
1593 CmpIsSafe(
1594 IN PHHIVE Hive,
1595 IN HCELL_INDEX SafeBootCell,
1596 IN HCELL_INDEX DriverCell);
1597
1598 //
1599 // Global variables accessible from all of Cm
1600 //
1601 extern ULONG CmpTraceLevel;
1602 extern BOOLEAN CmpSpecialBootCondition;
1603 extern BOOLEAN CmpFlushOnLockRelease;
1604 extern BOOLEAN CmpShareSystemHives;
1605 extern BOOLEAN CmpMiniNTBoot;
1606 extern EX_PUSH_LOCK CmpHiveListHeadLock, CmpLoadHiveLock;
1607 extern LIST_ENTRY CmpHiveListHead;
1608 extern POBJECT_TYPE CmpKeyObjectType;
1609 extern ERESOURCE CmpRegistryLock;
1610 extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable;
1611 extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable;
1612 extern KGUARDED_MUTEX CmpDelayedCloseTableLock;
1613 extern CMHIVE CmControlHive;
1614 extern WCHAR CmDefaultLanguageId[];
1615 extern ULONG CmDefaultLanguageIdLength;
1616 extern ULONG CmDefaultLanguageIdType;
1617 extern WCHAR CmInstallUILanguageId[];
1618 extern ULONG CmInstallUILanguageIdLength;
1619 extern ULONG CmInstallUILanguageIdType;
1620 extern ULONG CmNtGlobalFlag;
1621 extern LANGID PsInstallUILanguageId;
1622 extern LANGID PsDefaultUILanguageId;
1623 extern CM_SYSTEM_CONTROL_VECTOR CmControlVector[];
1624 extern ULONG CmpConfigurationAreaSize;
1625 extern PCM_FULL_RESOURCE_DESCRIPTOR CmpConfigurationData;
1626 extern UNICODE_STRING CmTypeName[];
1627 extern UNICODE_STRING CmClassName[];
1628 extern CMP_MF_TYPE CmpMultifunctionTypes[];
1629 extern USHORT CmpUnknownBusCount;
1630 extern ULONG CmpTypeCount[MaximumType + 1];
1631 extern HIVE_LIST_ENTRY CmpMachineHiveList[];
1632 extern UNICODE_STRING CmSymbolicLinkValueName;
1633 extern UNICODE_STRING CmpSystemStartOptions;
1634 extern UNICODE_STRING CmpLoadOptions;
1635 extern BOOLEAN CmSelfHeal;
1636 extern BOOLEAN CmpSelfHeal;
1637 extern ULONG CmpBootType;
1638 extern HANDLE CmpRegistryRootHandle;
1639 extern BOOLEAN ExpInTextModeSetup;
1640 extern BOOLEAN InitIsWinPEMode;
1641 extern ULONG CmpHashTableSize;
1642 extern ULONG CmpDelayedCloseSize, CmpDelayedCloseIndex;
1643 extern BOOLEAN CmpNoWrite;
1644 extern BOOLEAN CmpForceForceFlush;
1645 extern BOOLEAN CmpWasSetupBoot;
1646 extern BOOLEAN CmpProfileLoaded;
1647 extern PCMHIVE CmiVolatileHive;
1648 extern LIST_ENTRY CmiKeyObjectListHead;
1649 extern BOOLEAN CmpHoldLazyFlush;
1650
1651 //
1652 // Inlined functions
1653 //
1654 #include "cm_x.h"