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