Reactos
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Configuration Manager Library - CMLIB header
5 * COPYRIGHT: Copyright 2001 - 2005 Eric Kohl
6 * Copyright 2022 George Bișoc <george.bisoc@reactos.org>
7 */
8
9#ifndef _CMLIB_H_
10#define _CMLIB_H_
11
12//
13// Debug support switch
14//
15#define _CMLIB_DEBUG_ 1
16
17#ifdef CMLIB_HOST
18 #include <typedefs.h>
19 #include <stdio.h>
20 #include <string.h>
21
22 // NTDDI_xxx versions we allude to in the library (see psdk/sdkddkver.h)
23 #define NTDDI_WS03SP4 0x05020400
24 #define NTDDI_WIN6 0x06000000
25 #define NTDDI_LONGHORN NTDDI_WIN6
26 #define NTDDI_VISTA NTDDI_WIN6
27 #define NTDDI_WIN7 0x06010000
28
29 #define NTDDI_VERSION NTDDI_WS03SP4 // This is the ReactOS NT kernel version
30
31 /* C_ASSERT Definition */
32 #define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
33
34 #ifdef _WIN32
35 #define strncasecmp _strnicmp
36 #define strcasecmp _stricmp
37 #endif // _WIN32
38
39 #if (!defined(_MSC_VER) || (_MSC_VER < 1500))
40 #define _In_
41 #define _Out_
42 #define _Inout_
43 #define _In_opt_
44 #define _In_range_(x, y)
45 #endif
46
47 #define __drv_aliasesMem
48
49 #ifndef min
50 #define min(a, b) (((a) < (b)) ? (a) : (b))
51 #endif
52
53 // #ifndef max
54 // #define max(a, b) (((a) > (b)) ? (a) : (b))
55 // #endif
56
57 // Definitions copied from <ntstatus.h>
58 // We only want to include host headers, so we define them manually
59 #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
60 #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
61 #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
62 #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
63 #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D)
64 #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
65 #define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014D)
66 #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
67 #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
68
69 #define REG_OPTION_VOLATILE 1
70 #define OBJ_CASE_INSENSITIVE 0x00000040L
71 #define USHORT_MAX USHRT_MAX
72
73 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
74 #define UNICODE_NULL ((WCHAR)0)
75
76 VOID NTAPI
77 RtlInitUnicodeString(
78 IN OUT PUNICODE_STRING DestinationString,
79 IN PCWSTR SourceString);
80
81 LONG NTAPI
82 RtlCompareUnicodeString(
83 IN PCUNICODE_STRING String1,
84 IN PCUNICODE_STRING String2,
85 IN BOOLEAN CaseInSensitive);
86
87 // FIXME: DECLSPEC_NORETURN
88 VOID
89 NTAPI
90 KeBugCheckEx(
91 IN ULONG BugCheckCode,
92 IN ULONG_PTR BugCheckParameter1,
93 IN ULONG_PTR BugCheckParameter2,
94 IN ULONG_PTR BugCheckParameter3,
95 IN ULONG_PTR BugCheckParameter4);
96
97 VOID NTAPI
98 KeQuerySystemTime(
99 OUT PLARGE_INTEGER CurrentTime);
100
101 WCHAR NTAPI
102 RtlUpcaseUnicodeChar(
103 IN WCHAR Source);
104
105 VOID NTAPI
106 RtlInitializeBitMap(
107 IN PRTL_BITMAP BitMapHeader,
108 IN PULONG BitMapBuffer,
109 IN ULONG SizeOfBitMap);
110
111 ULONG NTAPI
112 RtlFindSetBits(
113 IN PRTL_BITMAP BitMapHeader,
114 IN ULONG NumberToFind,
115 IN ULONG HintIndex);
116
117 VOID NTAPI
118 RtlSetBits(
119 IN PRTL_BITMAP BitMapHeader,
120 IN ULONG StartingIndex,
121 IN ULONG NumberToSet);
122
123 VOID NTAPI
124 RtlSetAllBits(
125 IN PRTL_BITMAP BitMapHeader);
126
127 VOID NTAPI
128 RtlClearAllBits(
129 IN PRTL_BITMAP BitMapHeader);
130
131 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
132 #define UNREFERENCED_PARAMETER(P) ((void)(P))
133
134 #define PKTHREAD PVOID
135 #define PKGUARDED_MUTEX PVOID
136 #define PERESOURCE PVOID
137 #define PFILE_OBJECT PVOID
138 #define PKEVENT PVOID
139 #define PWORK_QUEUE_ITEM PVOID
140 #define EX_PUSH_LOCK PULONG_PTR
141
142 // Definitions copied from <ntifs.h>
143 // We only want to include host headers, so we define them manually
144
145 typedef USHORT SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
146
147 typedef struct _SECURITY_DESCRIPTOR_RELATIVE
148 {
149 UCHAR Revision;
150 UCHAR Sbz1;
151 SECURITY_DESCRIPTOR_CONTROL Control;
152 ULONG Owner;
153 ULONG Group;
154 ULONG Sacl;
155 ULONG Dacl;
156 } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
157
158 #define CMLTRACE(x, ...)
159 #undef PAGED_CODE
160 #define PAGED_CODE()
161 #define REGISTRY_ERROR ((ULONG)0x00000051L)
162
163#else
164
165 //
166 // Debug/Tracing support
167 //
168 #if _CMLIB_DEBUG_
169 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
170 #define CMLTRACE DbgPrintEx
171 #else
172 #define CMLTRACE(x, ...) \
173 if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__)
174 #endif
175 #else
176 #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__)
177 #endif
178
179 #include <ntdef.h>
180 #include <ntifs.h>
181 #include <bugcodes.h>
182
183 /* Prevent inclusion of Windows headers through <wine/unicode.h> */
184 #define _WINDEF_
185 #define _WINBASE_
186 #define _WINNLS_
187#endif
188
189
190//
191// These define the Debug Masks Supported
192//
193#define CMLIB_HCELL_DEBUG 0x01
194
195#ifndef ROUND_UP
196#define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
197#define ROUND_DOWN(a,b) (((a)/(b))*(b))
198#endif
199
200//
201// PAGE_SIZE definition
202//
203#ifndef PAGE_SIZE
204#if defined(TARGET_i386) || defined(TARGET_amd64) || \
205 defined(TARGET_arm) || defined(TARGET_arm64)
206#define PAGE_SIZE 0x1000
207#else
208#error Local PAGE_SIZE definition required when built as host
209#endif
210#endif
211
212#define TAG_CM ' MC'
213#define TAG_KCB 'bkMC'
214#define TAG_CMHIVE 'vHMC'
215#define TAG_CMSD 'DSMC'
216#define TAG_REGISTRY_STACK 'sRMC'
217
218#define CMAPI NTAPI
219
220//
221// Check Registry status type definition
222//
223typedef ULONG CM_CHECK_REGISTRY_STATUS;
224
225//
226// Check Registry flags
227//
228#define CM_CHECK_REGISTRY_DONT_PURGE_VOLATILES 0x0
229#define CM_CHECK_REGISTRY_PURGE_VOLATILES 0x2
230#define CM_CHECK_REGISTRY_BOOTLOADER_PURGE_VOLATILES 0x4
231#define CM_CHECK_REGISTRY_VALIDATE_HIVE 0x8
232#define CM_CHECK_REGISTRY_FIX_HIVE 0x10
233
234//
235// Check Registry status codes
236//
237#define CM_CHECK_REGISTRY_GOOD 0
238#define CM_CHECK_REGISTRY_INVALID_PARAMETER 1
239#define CM_CHECK_REGISTRY_SD_INVALID 2
240#define CM_CHECK_REGISTRY_HIVE_CORRUPT_SIGNATURE 3
241#define CM_CHECK_REGISTRY_BIN_SIZE_OR_OFFSET_CORRUPT 4
242#define CM_CHECK_REGISTRY_BIN_SIGNATURE_HEADER_CORRUPT 5
243#define CM_CHECK_REGISTRY_BAD_FREE_CELL 6
244#define CM_CHECK_REGISTRY_BAD_ALLOC_CELL 7
245#define CM_CHECK_REGISTRY_ALLOCATE_MEM_STACK_FAIL 8
246#define CM_CHECK_REGISTRY_ROOT_CELL_NOT_FOUND 9
247#define CM_CHECK_REGISTRY_BAD_LEXICOGRAPHICAL_ORDER 10
248#define CM_CHECK_REGISTRY_NODE_NOT_FOUND 11
249#define CM_CHECK_REGISTRY_SUBKEY_NOT_FOUND 12
250#define CM_CHECK_REGISTRY_TREE_TOO_MANY_LEVELS 13
251#define CM_CHECK_REGISTRY_KEY_CELL_NOT_ALLOCATED 14
252#define CM_CHECK_REGISTRY_CELL_DATA_NOT_FOUND 15
253#define CM_CHECK_REGISTRY_CELL_SIZE_NOT_SANE 16
254#define CM_CHECK_REGISTRY_KEY_NAME_LENGTH_ZERO 17
255#define CM_CHECK_REGISTRY_KEY_TOO_BIG_THAN_CELL 18
256#define CM_CHECK_REGISTRY_BAD_KEY_NODE_PARENT 19
257#define CM_CHECK_REGISTRY_BAD_KEY_NODE_SIGNATURE 20
258#define CM_CHECK_REGISTRY_KEY_CLASS_UNALLOCATED 21
259#define CM_CHECK_REGISTRY_VALUE_LIST_UNALLOCATED 22
260#define CM_CHECK_REGISTRY_VALUE_LIST_DATA_NOT_FOUND 23
261#define CM_CHECK_REGISTRY_VALUE_LIST_SIZE_NOT_SANE 24
262#define CM_CHECK_REGISTRY_VALUE_CELL_NIL 25
263#define CM_CHECK_REGISTRY_VALUE_CELL_UNALLOCATED 26
264#define CM_CHECK_REGISTRY_VALUE_CELL_DATA_NOT_FOUND 27
265#define CM_CHECK_REGISTRY_VALUE_CELL_SIZE_NOT_SANE 28
266#define CM_CHECK_REGISTRY_CORRUPT_VALUE_DATA 29
267#define CM_CHECK_REGISTRY_DATA_CELL_NOT_ALLOCATED 30
268#define CM_CHECK_REGISTRY_BAD_KEY_VALUE_SIGNATURE 31
269#define CM_CHECK_REGISTRY_STABLE_KEYS_ON_VOLATILE 32
270#define CM_CHECK_REGISTRY_SUBKEYS_LIST_UNALLOCATED 33
271#define CM_CHECK_REGISTRY_CORRUPT_SUBKEYS_INDEX 34
272#define CM_CHECK_REGISTRY_BAD_SUBKEY_COUNT 35
273#define CM_CHECK_REGISTRY_KEY_INDEX_CELL_UNALLOCATED 36
274#define CM_CHECK_REGISTRY_CORRUPT_LEAF_ON_ROOT 37
275#define CM_CHECK_REGISTRY_CORRUPT_LEAF_SIGNATURE 38
276#define CM_CHECK_REGISTRY_CORRUPT_KEY_INDEX_SIGNATURE 39
277
278//
279// Check Registry success macro
280//
281#define CM_CHECK_REGISTRY_SUCCESS(StatusCode) ((ULONG)(StatusCode) == CM_CHECK_REGISTRY_GOOD)
282
283#include <wine/unicode.h>
284#include <wchar.h>
285#include "hivedata.h"
286#include "cmdata.h"
287
288/* Forward declarations */
289typedef struct _CM_KEY_SECURITY_CACHE_ENTRY *PCM_KEY_SECURITY_CACHE_ENTRY;
290typedef struct _CM_KEY_CONTROL_BLOCK *PCM_KEY_CONTROL_BLOCK;
291typedef struct _CM_CELL_REMAP_BLOCK *PCM_CELL_REMAP_BLOCK;
292
293// See ntoskrnl/include/internal/cm.h
294#define CMP_SECURITY_HASH_LISTS 64
295
296//
297// Use Count Log and Entry
298//
299typedef struct _CM_USE_COUNT_LOG_ENTRY
300{
301 HCELL_INDEX Cell;
302 PVOID Stack[7];
303} CM_USE_COUNT_LOG_ENTRY, *PCM_USE_COUNT_LOG_ENTRY;
304
305typedef struct _CM_USE_COUNT_LOG
306{
307 USHORT Next;
308 USHORT Size;
309 CM_USE_COUNT_LOG_ENTRY Log[32];
310} CM_USE_COUNT_LOG, *PCM_USE_COUNT_LOG;
311
312//
313// Configuration Manager Hive Structure
314//
315typedef struct _CMHIVE
316{
317 HHIVE Hive;
318 HANDLE FileHandles[HFILE_TYPE_MAX];
319 LIST_ENTRY NotifyList;
320 LIST_ENTRY HiveList;
321 EX_PUSH_LOCK HiveLock;
322 PKTHREAD HiveLockOwner;
323 PKGUARDED_MUTEX ViewLock;
324 PKTHREAD ViewLockOwner;
325 EX_PUSH_LOCK WriterLock;
326 PKTHREAD WriterLockOwner;
327 PERESOURCE FlusherLock;
328 EX_PUSH_LOCK SecurityLock;
329 PKTHREAD HiveSecurityLockOwner;
330 LIST_ENTRY LRUViewListHead;
331 LIST_ENTRY PinViewListHead;
332 PFILE_OBJECT FileObject;
333 UNICODE_STRING FileFullPath;
334 UNICODE_STRING FileUserName;
335 USHORT MappedViews;
336 USHORT PinnedViews;
337 ULONG UseCount;
338 ULONG SecurityCount;
339 ULONG SecurityCacheSize;
340 LONG SecurityHitHint;
341 PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache;
342 LIST_ENTRY SecurityHash[CMP_SECURITY_HASH_LISTS];
343 PKEVENT UnloadEvent;
344 PCM_KEY_CONTROL_BLOCK RootKcb;
345 BOOLEAN Frozen;
346 PWORK_QUEUE_ITEM UnloadWorkItem;
347 BOOLEAN GrowOnlyMode;
348 ULONG GrowOffset;
349 LIST_ENTRY KcbConvertListHead;
350 LIST_ENTRY KnodeConvertListHead;
351 PCM_CELL_REMAP_BLOCK CellRemapArray;
352 CM_USE_COUNT_LOG UseCountLog;
353 CM_USE_COUNT_LOG LockHiveLog;
354 ULONG Flags;
355 LIST_ENTRY TrustClassEntry;
356 ULONG FlushCount;
357 BOOLEAN HiveIsLoading;
358 PKTHREAD CreatorOwner;
359} CMHIVE, *PCMHIVE;
360
361typedef struct _HV_HIVE_CELL_PAIR
362{
363 PHHIVE Hive;
364 HCELL_INDEX Cell;
365} HV_HIVE_CELL_PAIR, *PHV_HIVE_CELL_PAIR;
366
367#define STATIC_CELL_PAIR_COUNT 4
368typedef struct _HV_TRACK_CELL_REF
369{
370 USHORT Count;
371 USHORT Max;
372 PHV_HIVE_CELL_PAIR CellArray;
373 HV_HIVE_CELL_PAIR StaticArray[STATIC_CELL_PAIR_COUNT];
374 USHORT StaticCount;
375} HV_TRACK_CELL_REF, *PHV_TRACK_CELL_REF;
376
377extern ULONG CmlibTraceLevel;
378
379//
380// Hack since big keys are not yet supported
381//
382#ifdef _BLDR_
383#define ASSERT_VALUE_BIG(h, s) \
384 do { if (CmpIsKeyValueBig(h,s)) DbgPrint("Big keys aren't supported!\n"); } while (0)
385#else
386#define ASSERT_VALUE_BIG(h, s) \
387 ASSERTMSG("Big keys not supported!\n", !CmpIsKeyValueBig(h, s));
388#endif
389
390//
391// Returns whether or not this is a small valued key
392//
393static inline
394BOOLEAN
395CmpIsKeyValueSmall(OUT PULONG RealLength,
396 IN ULONG Length)
397{
398 /* Check if the length has the special size value */
399 if (Length >= CM_KEY_VALUE_SPECIAL_SIZE)
400 {
401 /* It does, so this is a small key: return the real length */
402 *RealLength = Length - CM_KEY_VALUE_SPECIAL_SIZE;
403 return TRUE;
404 }
405
406 /* This is not a small key, return the length we read */
407 *RealLength = Length;
408 return FALSE;
409}
410
411//
412// Returns whether or not this is a big valued key
413//
414static inline
415BOOLEAN
416CmpIsKeyValueBig(IN PHHIVE Hive,
417 IN ULONG Length)
418{
419 /* Check if the hive is XP Beta 1 or newer */
420 if (Hive->Version >= HSYS_WHISTLER_BETA1)
421 {
422 /* Check if the key length is valid for a big value key */
423 if ((Length < CM_KEY_VALUE_SPECIAL_SIZE) && (Length > CM_KEY_VALUE_BIG))
424 {
425 /* Yes, this value is big */
426 return TRUE;
427 }
428 }
429
430 /* Not a big value key */
431 return FALSE;
432}
433
434/*
435 * Public Hive functions.
436 */
437NTSTATUS CMAPI
438HvInitialize(
439 PHHIVE RegistryHive,
440 ULONG OperationType,
441 ULONG HiveFlags,
442 ULONG FileType,
443 PVOID HiveData OPTIONAL,
444 PALLOCATE_ROUTINE Allocate,
445 PFREE_ROUTINE Free,
446 PFILE_SET_SIZE_ROUTINE FileSetSize,
447 PFILE_WRITE_ROUTINE FileWrite,
448 PFILE_READ_ROUTINE FileRead,
449 PFILE_FLUSH_ROUTINE FileFlush,
450 ULONG Cluster OPTIONAL,
451 PCUNICODE_STRING FileName OPTIONAL);
452
453VOID CMAPI
454HvFree(
455 PHHIVE RegistryHive);
456
457#define HvGetCell(Hive, Cell) \
458 (Hive)->GetCellRoutine(Hive, Cell)
459
460#define HvReleaseCell(Hive, Cell) \
461do { \
462 if ((Hive)->ReleaseCellRoutine) \
463 (Hive)->ReleaseCellRoutine(Hive, Cell); \
464} while(0)
465
466LONG CMAPI
467HvGetCellSize(
468 PHHIVE RegistryHive,
469 PVOID Cell);
470
471HCELL_INDEX CMAPI
472HvAllocateCell(
473 PHHIVE RegistryHive,
474 ULONG Size,
475 HSTORAGE_TYPE Storage,
476 IN HCELL_INDEX Vicinity);
477
478BOOLEAN CMAPI
479HvIsCellAllocated(
480 IN PHHIVE RegistryHive,
481 IN HCELL_INDEX CellIndex
482);
483
484HCELL_INDEX CMAPI
485HvReallocateCell(
486 PHHIVE RegistryHive,
487 HCELL_INDEX CellOffset,
488 ULONG Size);
489
490VOID CMAPI
491HvFreeCell(
492 PHHIVE RegistryHive,
493 HCELL_INDEX CellOffset);
494
495BOOLEAN CMAPI
496HvMarkCellDirty(
497 PHHIVE RegistryHive,
498 HCELL_INDEX CellOffset,
499 BOOLEAN HoldingLock);
500
501BOOLEAN CMAPI
502HvIsCellDirty(
503 IN PHHIVE Hive,
504 IN HCELL_INDEX Cell
505);
506
507BOOLEAN
508CMAPI
509HvHiveWillShrink(
510 IN PHHIVE RegistryHive
511);
512
513BOOLEAN CMAPI
514HvSyncHive(
515 PHHIVE RegistryHive);
516
517BOOLEAN CMAPI
518HvWriteHive(
519 PHHIVE RegistryHive);
520
521BOOLEAN
522CMAPI
523HvWriteAlternateHive(
524 _In_ PHHIVE RegistryHive);
525
526BOOLEAN
527CMAPI
528HvSyncHiveFromRecover(
529 _In_ PHHIVE RegistryHive);
530
531BOOLEAN
532CMAPI
533HvTrackCellRef(
534 IN OUT PHV_TRACK_CELL_REF CellRef,
535 IN PHHIVE Hive,
536 IN HCELL_INDEX Cell
537);
538
539VOID
540CMAPI
541HvReleaseFreeCellRefArray(
542 IN OUT PHV_TRACK_CELL_REF CellRef
543);
544
545/*
546 * Private functions.
547 */
548
549PCELL_DATA CMAPI
550HvpGetCellData(
551 _In_ PHHIVE Hive,
552 _In_ HCELL_INDEX CellIndex);
553
554PHBIN CMAPI
555HvpAddBin(
556 PHHIVE RegistryHive,
557 ULONG Size,
558 HSTORAGE_TYPE Storage);
559
560NTSTATUS CMAPI
561HvpCreateHiveFreeCellList(
562 PHHIVE Hive);
563
564ULONG CMAPI
565HvpHiveHeaderChecksum(
566 PHBASE_BLOCK HiveHeader);
567
568BOOLEAN CMAPI
569HvpVerifyHiveHeader(
570 _In_ PHBASE_BLOCK BaseBlock,
571 _In_ ULONG FileType);
572
573//
574// Registry Self-Heal Routines
575//
576BOOLEAN
577CMAPI
578CmIsSelfHealEnabled(
579 _In_ BOOLEAN FixHive);
580
581BOOLEAN
582CMAPI
583CmpRepairParentKey(
584 _Inout_ PHHIVE Hive,
585 _In_ HCELL_INDEX TargetKey,
586 _In_ HCELL_INDEX ParentKey,
587 _In_ BOOLEAN FixHive);
588
589BOOLEAN
590CMAPI
591CmpRepairParentNode(
592 _Inout_ PHHIVE Hive,
593 _In_ HCELL_INDEX DirtyCell,
594 _In_ HCELL_INDEX ParentCell,
595 _Inout_ PCELL_DATA CellData,
596 _In_ BOOLEAN FixHive);
597
598BOOLEAN
599CMAPI
600CmpRepairKeyNodeSignature(
601 _Inout_ PHHIVE Hive,
602 _In_ HCELL_INDEX DirtyCell,
603 _Inout_ PCELL_DATA CellData,
604 _In_ BOOLEAN FixHive);
605
606BOOLEAN
607CMAPI
608CmpRepairClassOfNodeKey(
609 _Inout_ PHHIVE Hive,
610 _In_ HCELL_INDEX DirtyCell,
611 _Inout_ PCELL_DATA CellData,
612 _In_ BOOLEAN FixHive);
613
614BOOLEAN
615CMAPI
616CmpRepairValueList(
617 _Inout_ PHHIVE Hive,
618 _In_ HCELL_INDEX CurrentCell,
619 _In_ BOOLEAN FixHive);
620
621BOOLEAN
622CMAPI
623CmpRepairValueListCount(
624 _Inout_ PHHIVE Hive,
625 _In_ HCELL_INDEX CurrentCell,
626 _In_ ULONG ListCountIndex,
627 _Inout_ PCELL_DATA ValueListData,
628 _In_ BOOLEAN FixHive);
629
630BOOLEAN
631CMAPI
632CmpRepairSubKeyCounts(
633 _Inout_ PHHIVE Hive,
634 _In_ HCELL_INDEX CurrentCell,
635 _In_ ULONG Count,
636 _Inout_ PCELL_DATA CellData,
637 _In_ BOOLEAN FixHive);
638
639BOOLEAN
640CMAPI
641CmpRepairSubKeyList(
642 _Inout_ PHHIVE Hive,
643 _In_ HCELL_INDEX CurrentCell,
644 _Inout_ PCELL_DATA CellData,
645 _In_ BOOLEAN FixHive);
646
647/* Old-style Public "Cmlib" functions */
648
649BOOLEAN CMAPI
650CmCreateRootNode(
651 PHHIVE Hive,
652 PCWSTR Name);
653
654/* NT-style Public Cm functions */
655
656//
657// Check Registry Routines
658//
659CM_CHECK_REGISTRY_STATUS
660NTAPI
661HvValidateBin(
662 _In_ PHHIVE Hive,
663 _In_ PHBIN Bin);
664
665CM_CHECK_REGISTRY_STATUS
666NTAPI
667HvValidateHive(
668 _In_ PHHIVE Hive);
669
670CM_CHECK_REGISTRY_STATUS
671NTAPI
672CmCheckRegistry(
673 _In_ PCMHIVE RegistryHive,
674 _In_ ULONG Flags);
675
676//
677// Cell Index Routines
678//
679HCELL_INDEX
680NTAPI
681CmpFindSubKeyByName(
682 IN PHHIVE Hive,
683 IN PCM_KEY_NODE Parent,
684 IN PCUNICODE_STRING SearchName
685);
686
687HCELL_INDEX
688NTAPI
689CmpFindSubKeyByNumber(
690 IN PHHIVE Hive,
691 IN PCM_KEY_NODE Node,
692 IN ULONG Number
693);
694
695ULONG
696NTAPI
697CmpComputeHashKey(
698 IN ULONG Hash,
699 IN PCUNICODE_STRING Name,
700 IN BOOLEAN AllowSeparators
701);
702
703BOOLEAN
704NTAPI
705CmpAddSubKey(
706 IN PHHIVE Hive,
707 IN HCELL_INDEX Parent,
708 IN HCELL_INDEX Child
709);
710
711BOOLEAN
712NTAPI
713CmpRemoveSubKey(
714 IN PHHIVE Hive,
715 IN HCELL_INDEX ParentKey,
716 IN HCELL_INDEX TargetKey
717);
718
719BOOLEAN
720NTAPI
721CmpMarkIndexDirty(
722 IN PHHIVE Hive,
723 HCELL_INDEX ParentKey,
724 HCELL_INDEX TargetKey
725);
726
727
728//
729// Name Functions
730//
731LONG
732NTAPI
733CmpCompareCompressedName(
734 IN PCUNICODE_STRING SearchName,
735 IN PWCHAR CompressedName,
736 IN ULONG NameLength
737);
738
739USHORT
740NTAPI
741CmpNameSize(
742 IN PHHIVE Hive,
743 IN PCUNICODE_STRING Name
744);
745
746USHORT
747NTAPI
748CmpCompressedNameSize(
749 IN PWCHAR Name,
750 IN ULONG Length
751);
752
753USHORT
754NTAPI
755CmpCopyName(
756 IN PHHIVE Hive,
757 OUT PWCHAR Destination,
758 IN PCUNICODE_STRING Source
759);
760
761VOID
762NTAPI
763CmpCopyCompressedName(
764 OUT PWCHAR Destination,
765 IN ULONG DestinationLength,
766 IN PWCHAR Source,
767 IN ULONG SourceLength
768);
769
770BOOLEAN
771NTAPI
772CmpFindNameInList(
773 IN PHHIVE Hive,
774 IN PCHILD_LIST ChildList,
775 IN PCUNICODE_STRING Name,
776 OUT PULONG ChildIndex OPTIONAL,
777 OUT PHCELL_INDEX CellIndex
778);
779
780
781//
782// Cell Value Routines
783//
784HCELL_INDEX
785NTAPI
786CmpFindValueByName(
787 IN PHHIVE Hive,
788 IN PCM_KEY_NODE KeyNode,
789 IN PCUNICODE_STRING Name
790);
791
792PCELL_DATA
793NTAPI
794CmpValueToData(
795 IN PHHIVE Hive,
796 IN PCM_KEY_VALUE Value,
797 OUT PULONG Length
798);
799
800NTSTATUS
801NTAPI
802CmpSetValueDataNew(
803 IN PHHIVE Hive,
804 IN PVOID Data,
805 IN ULONG DataSize,
806 IN HSTORAGE_TYPE StorageType,
807 IN HCELL_INDEX ValueCell,
808 OUT PHCELL_INDEX DataCell
809);
810
811NTSTATUS
812NTAPI
813CmpAddValueToList(
814 IN PHHIVE Hive,
815 IN HCELL_INDEX ValueCell,
816 IN ULONG Index,
817 IN HSTORAGE_TYPE StorageType,
818 IN OUT PCHILD_LIST ChildList
819);
820
821BOOLEAN
822NTAPI
823CmpFreeValue(
824 IN PHHIVE Hive,
825 IN HCELL_INDEX Cell
826);
827
828BOOLEAN
829NTAPI
830CmpMarkValueDataDirty(
831 IN PHHIVE Hive,
832 IN PCM_KEY_VALUE Value
833);
834
835BOOLEAN
836NTAPI
837CmpFreeValueData(
838 IN PHHIVE Hive,
839 IN HCELL_INDEX DataCell,
840 IN ULONG DataLength
841);
842
843NTSTATUS
844NTAPI
845CmpRemoveValueFromList(
846 IN PHHIVE Hive,
847 IN ULONG Index,
848 IN OUT PCHILD_LIST ChildList
849);
850
851BOOLEAN
852NTAPI
853CmpGetValueData(
854 IN PHHIVE Hive,
855 IN PCM_KEY_VALUE Value,
856 OUT PULONG Length,
857 OUT PVOID *Buffer,
858 OUT PBOOLEAN BufferAllocated,
859 OUT PHCELL_INDEX CellToRelease
860);
861
862NTSTATUS
863NTAPI
864CmpCopyKeyValueList(
865 IN PHHIVE SourceHive,
866 IN PCHILD_LIST SrcValueList,
867 IN PHHIVE DestinationHive,
868 IN OUT PCHILD_LIST DestValueList,
869 IN HSTORAGE_TYPE StorageType
870);
871
872NTSTATUS
873NTAPI
874CmpFreeKeyByCell(
875 IN PHHIVE Hive,
876 IN HCELL_INDEX Cell,
877 IN BOOLEAN Unlink
878);
879
880VOID
881NTAPI
882CmpRemoveSecurityCellList(
883 IN PHHIVE Hive,
884 IN HCELL_INDEX SecurityCell
885);
886
887VOID
888NTAPI
889CmpFreeSecurityDescriptor(
890 IN PHHIVE Hive,
891 IN HCELL_INDEX Cell
892);
893
894/******************************************************************************/
895
896/* To be implemented by the user of this library */
897PVOID
898NTAPI
899CmpAllocate(
900 IN SIZE_T Size,
901 IN BOOLEAN Paged,
902 IN ULONG Tag
903);
904
905VOID
906NTAPI
907CmpFree(
908 IN PVOID Ptr,
909 IN ULONG Quota
910);
911
912#endif /* _CMLIB_H_ */