Reactos
at listview 912 lines 20 kB view raw
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_ */