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