44 if (KeyBody->KeyControlBlock->Delete)
return Loaded;
59 SourceFile->ObjectName,
70 DPRINT1(
"ERROR: Hive is frozen\n");
108 if ((ForceFlush) && (Hive->
UseCount))
112 DPRINT1(
"FIXME: Hive is damaged and needs fixup\n");
137 NextEntry = NextEntry->
Flink;
162 if (
Parent->ValueList.Count)
201 DPRINT1(
"Invalid user data!\n");
308 if (!(WasSmall) && (
Length > 0))
316 Value->Data = TempData;
322 if (!(WasSmall) && (
Length > 0))
325 DataCell =
Value->Data;
365 Value->Data = NewCell;
398 NameLength =
Node->NameLength;
426 Info->KeyBasicInformation.LastWriteTime =
Node->LastWriteTime;
427 Info->KeyBasicInformation.TitleIndex = 0;
428 Info->KeyBasicInformation.NameLength = NameLength;
431 SizeLeft =
Length - MinimumSize;
484 Info->KeyNodeInformation.LastWriteTime =
Node->LastWriteTime;
485 Info->KeyNodeInformation.TitleIndex = 0;
486 Info->KeyNodeInformation.ClassLength =
Node->ClassLength;
487 Info->KeyNodeInformation.NameLength = NameLength;
490 SizeLeft =
Length - MinimumSize;
519 if (
Node->ClassLength > 0)
524 Info->KeyNodeInformation.ClassOffset =
Offset;
555 Info->KeyNodeInformation.ClassOffset = 0xFFFFFFFF;
582 Info->KeyFullInformation.LastWriteTime =
Node->LastWriteTime;
583 Info->KeyFullInformation.TitleIndex = 0;
584 Info->KeyFullInformation.ClassLength =
Node->ClassLength;
587 Info->KeyFullInformation.Values =
Node->ValueList.Count;
588 Info->KeyFullInformation.MaxNameLen =
Node->MaxNameLen;
589 Info->KeyFullInformation.MaxClassLen =
Node->MaxClassLen;
590 Info->KeyFullInformation.MaxValueNameLen =
Node->MaxValueNameLen;
591 Info->KeyFullInformation.MaxValueDataLen =
Node->MaxValueDataLen;
594 if (
Node->ClassLength > 0)
598 Info->KeyFullInformation.ClassOffset =
Offset;
626 Info->KeyFullInformation.ClassOffset = 0xFFFFFFFF;
724 FlusherLocked =
TRUE;
776 ChildCell = CurrentChild;
854 ASSERT(
Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen);
859 Kcb->KcbMaxValueNameLen =
ValueName->Length;
863 ASSERT(
Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen);
868 Kcb->KcbMaxValueDataLen =
Parent->MaxValueDataLen;
873 Kcb->KcbLastWriteTime =
Parent->LastWriteTime;
891 Kcb->ValueCache.Count =
Parent->ValueList.Count;
892 Kcb->ValueCache.ValueList =
Parent->ValueList.List;
972 if (ChildCell ==
HCELL_NIL)
goto Quickie;
1019 Kcb->KcbLastWriteTime =
Parent->LastWriteTime;
1022 ASSERT(
Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen);
1023 ASSERT(
Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen);
1027 if (!
Parent->ValueList.Count)
1030 Parent->MaxValueNameLen = 0;
1031 Parent->MaxValueDataLen = 0;
1032 Kcb->KcbMaxValueNameLen = 0;
1033 Kcb->KcbMaxValueDataLen = 0;
1044 Kcb->ValueCache.Count =
ChildList->Count;
1045 Kcb->ValueCache.ValueList =
ChildList->List;
1116 Hive = Kcb->KeyHive;
1151 KeyValueInformation,
1227 Hive = Kcb->KeyHive;
1232 if (Kcb->ValueCache.Count !=
Parent->ValueList.Count)
1234 DPRINT1(
"HACK: Overriding value cache count\n");
1235 Kcb->ValueCache.Count =
Parent->ValueList.Count;
1239 if (
Index >= Kcb->ValueCache.Count)
1322 KeyValueInformation,
1376 KeyHive = Kcb->KeyHash.KeyHive;
1377 KeyCell = Kcb->KeyHash.KeyCell;
1385 ASSERT(
Node->ValueList.Count == Kcb->ValueCache.Count);
1389 SubKeyCount =
Node->SubKeyCounts[0] +
Node->SubKeyCounts[1];
1392 ASSERT(SubKeyCount == 0);
1396 ASSERT(SubKeyCount == 1);
1400 ASSERT(SubKeyCount == Kcb->IndexHint->Count);
1404 ASSERT(SubKeyCount == Kcb->SubKeyCount);
1408 ASSERT(
Node->LastWriteTime.QuadPart == Kcb->KcbLastWriteTime.QuadPart);
1409 ASSERT(
Node->MaxNameLen == Kcb->KcbMaxNameLen);
1410 ASSERT(
Node->MaxValueNameLen == Kcb->KcbMaxValueNameLen);
1411 ASSERT(
Node->MaxValueDataLen == Kcb->KcbMaxValueDataLen);
1419 if (Kcb->NameBlock ==
NULL)
1425 if (Kcb->NameBlock->Compressed)
1429 Kcb->NameBlock->NameHash.NameLength);
1434 NameLength = Kcb->NameBlock->NameHash.NameLength;
1445 KeyCachedInfo->LastWriteTime = Kcb->KcbLastWriteTime;
1446 KeyCachedInfo->TitleIndex = 0;
1447 KeyCachedInfo->NameLength = NameLength;
1448 KeyCachedInfo->Values = Kcb->ValueCache.Count;
1449 KeyCachedInfo->MaxNameLen = Kcb->KcbMaxNameLen;
1450 KeyCachedInfo->MaxValueNameLen = Kcb->KcbMaxValueNameLen;
1451 KeyCachedInfo->MaxValueDataLen = Kcb->KcbMaxValueDataLen;
1457 DPRINT1(
"Kcb cache incoherency detected, kcb = %p\n", Kcb);
1467 KeyCachedInfo->SubKeys =
Node->SubKeyCounts[0] +
Node->SubKeyCounts[1];
1475 KeyCachedInfo->SubKeys = 0;
1480 KeyCachedInfo->SubKeys = 1;
1485 KeyCachedInfo->SubKeys = Kcb->IndexHint->Count;
1490 KeyCachedInfo->SubKeys = Kcb->SubKeyCount;
1500 _Out_ PKEY_USER_FLAGS_INFORMATION KeyFlagsInfo,
1512 KeyFlagsInfo->UserFlags = Kcb->KcbUserFlags;
1551 KeyNameInfo->NameLength = NeededLength;
1562 KeyNameInfo->NameLength = 0;
1589 NeededLength -= NameLength;
1605 ASSERT(NeededLength == 0);
1652 Hive = Kcb->KeyHive;
1763 Hive = Kcb->KeyHive;
1836 Kcb = KeyBody->KeyControlBlock;
1879 ParentCell =
Node->Parent;
1949 Hive = Kcb->KeyHive;
2021 DPRINT(
"Trusted classes not yet supported\n");
2032 &ClientSecurityContext);
2036 DPRINT1(
"Security context failed\n");
2054 &ClientSecurityContext,
2103 TargetKey->RootDirectory,
2106 TargetKey->SecurityDescriptor);
2130 DPRINT1(
"CmpLinkHiveToMaster failed, Status %lx\n",
Status);
2162 DPRINT(
"CmpUnlinkHiveFromMaster()\n");
2166 if (CellData ==
NULL)
2181 DPRINT1(
"CmpFreeKeyByCell() failed (Status 0x%08lx)\n",
Status);
2205 Hive = Kcb->KeyHive;
2206 Cell = Kcb->KeyCell;
2212 DPRINT1(
"Key is not a hive root key!\n");
2219 DPRINT1(
"Do not try to unload the master hive!\n");
2227 if (Kcb->RefCount > 1)
2240 DPRINT1(
"CmUnloadKey: Force unloading is HALF-IMPLEMENTED, expect dangling KCBs problems!\n");
2259 DPRINT(
"CmpUnlinkHiveFromMaster() failed!\n");
2336 ULONG ParentKeyCount;
2340 DPRINT(
"CmpEnumerateOpenSubKeys() called\n");
2343 if (RootKcb->RefCount == 1)
2345 DPRINT(
"Open sub keys: 0\n");
2362 if (CachedKcb->
TotalLevels > RootKcb->TotalLevels)
2365 ParentKeyCount = CachedKcb->
TotalLevels - RootKcb->TotalLevels;
2368 ParentKcb = CachedKcb;
2369 for (
j = 0;
j < ParentKeyCount;
j++)
2375 if (ParentKcb == RootKcb)
2381 DPRINT(
"Found a sub key pointing to '%.*s', RefCount = %u\n",
2386 if (DereferenceOpenedEntries &&
2417 else if ((CachedKcb->
RefCount == 0) && RemoveEmptyCacheEntries)
2438 DPRINT1(
"Open sub keys: %u\n", SubKeys);
2462 DPRINT(
"CmpDeepCopyKeyInternal(0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X)\n",
2471 SrcNode =
HvGetCell(SourceHive, SrcKeyCell);
2490 DestNode =
HvGetCell(DestinationHive, NewKeyCell);
2516 DestNode->
Class = NewClassCell;
2615 if (DestKeyCell) *DestKeyCell = NewKeyCell;
2723 if (LowKcb->Delete || HighKcb->Delete)
#define KeQuerySystemTime(t)
VALUE_SEARCH_RETURN_TYPE NTAPI CmpGetValueKeyFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PCELL_DATA CellData, IN ULONG Index, OUT PCM_CACHED_VALUE **CachedValue, OUT PCM_KEY_VALUE *Value, IN BOOLEAN IndexIsCached, OUT BOOLEAN *ValueIsCached, OUT PHCELL_INDEX CellToRelease)
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
VOID NTAPI CmpUnlockHiveFlusher(IN PCMHIVE Hive)
#define CM_KEY_VALUE_SIGNATURE
BOOLEAN CMAPI HvIsCellDirty(IN PHHIVE Hive, IN HCELL_INDEX Cell)
FORCEINLINE VOID ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
NTSTATUS NTAPI CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, IN POBJECT_ATTRIBUTES SourceFile, IN ULONG Flags, IN PCM_KEY_BODY KeyBody)
VALUE_SEARCH_RETURN_TYPE NTAPI CmpCompareNewValueDataAgainstKCBCache(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PUNICODE_STRING ValueName, IN ULONG Type, IN PVOID Data, IN ULONG DataSize)
BOOLEAN NTAPI CmpIsHiveAlreadyLoaded(IN HANDLE KeyHandle, IN POBJECT_ATTRIBUTES SourceFile, OUT PCMHIVE *CmHive)
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS NTAPI CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN ExclusiveLock)
_In_ ULONG _In_ ULONG _In_ ULONG Length
static NTSTATUS CmpQueryKeyDataFromCache(_In_ PCM_KEY_CONTROL_BLOCK Kcb, _Out_ PKEY_CACHED_INFORMATION KeyCachedInfo, _In_ ULONG Length, _Out_ PULONG ResultLength)
BOOLEAN NTAPI CmpAddSubKey(IN PHHIVE Hive, IN HCELL_INDEX Parent, IN HCELL_INDEX Child)
#define STATUS_NO_MORE_ENTRIES
struct _KEY_INFORMATION * PKEY_INFORMATION
#define PsGetCurrentThread()
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
#define CMP_ASSERT_KCB_LOCK(k)
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
_In_ ULONG _In_ KEY_INFORMATION_CLASS KeyInformationClass
enum _KEY_INFORMATION_CLASS KEY_INFORMATION_CLASS
struct _CM_KEY_CONTROL_BLOCK * ParentKcb
static BOOLEAN NTAPI CmpUnlinkHiveFromMaster(IN PCMHIVE CmHive, IN HCELL_INDEX Cell)
#define STATUS_INVALID_PARAMETER
HCELL_INDEX CMAPI HvReallocateCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset, ULONG Size)
LIST_ENTRY CmpHiveListHead
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSTATUS NTAPI CmEnumerateValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN ULONG Index, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
NTSTATUS NTAPI CmSaveKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN HANDLE FileHandle, IN ULONG Flags)
ULONG NTAPI CmpEnumerateOpenSubKeys(IN PCM_KEY_CONTROL_BLOCK RootKcb, IN BOOLEAN RemoveEmptyCacheEntries, IN BOOLEAN DereferenceOpenedEntries)
#define STATUS_REGISTRY_IO_FAILED
#define CM_KEY_NODE_SIGNATURE
VALUE_SEARCH_RETURN_TYPE NTAPI CmpQueryKeyValueData(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PCM_CACHED_VALUE *CachedValue, IN PCM_KEY_VALUE ValueKey, IN BOOLEAN ValueIsCached, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, OUT PULONG ResultLength, OUT PNTSTATUS Status)
#define HvReleaseCell(h, c)
HCELL_INDEX NTAPI CmpFindSubKeyByNumber(IN PHHIVE Hive, IN PCM_KEY_NODE Node, IN ULONG Number)
#define REG_NOTIFY_CHANGE_NAME
NTSTATUS NTAPI CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN UNICODE_STRING ValueName)
NTSTATUS NTAPI CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName, IN HANDLE RootDirectory, IN PCMHIVE RegistryHive, IN BOOLEAN Allocate, IN PSECURITY_DESCRIPTOR SecurityDescriptor)
#define CMP_IS_CELL_CACHED(c)
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
NTSTATUS NTAPI CmpDestroyHive(IN PCMHIVE CmHive)
IN PVOID IN PVOID IN USHORT IN USHORT Size
static NTSTATUS CmpDeepCopyKeyInternal(IN PHHIVE SourceHive, IN HCELL_INDEX SrcKeyCell, IN PHHIVE DestinationHive, IN HCELL_INDEX Parent, IN HSTORAGE_TYPE StorageType, OUT PHCELL_INDEX DestKeyCell OPTIONAL)
BOOLEAN NTAPI CmpFindNameInList(IN PHHIVE Hive, IN PCHILD_LIST ChildList, IN PUNICODE_STRING Name, OUT PULONG ChildIndex OPTIONAL, OUT PHCELL_INDEX CellIndex)
VOID CMAPI HvReleaseFreeCellRefArray(IN OUT PHV_TRACK_CELL_REF CellRef)
#define HvGetCellType(Cell)
HCELL_INDEX CMAPI HvAllocateCell(PHHIVE RegistryHive, ULONG Size, HSTORAGE_TYPE Storage, IN HCELL_INDEX Vicinity)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
PCM_NAME_CONTROL_BLOCK NameBlock
#define CM_KEY_VALUE_SPECIAL_SIZE
#define CM_KCB_READ_ONLY_KEY
VOID NTAPI CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define CmpAcquireKcbLockShared(k)
union _CELL_DATA::@4074 u
VOID NTAPI CmpReleaseTwoKcbLockByKey(IN ULONG ConvKey1, IN ULONG ConvKey2)
NTSTATUS NTAPI CmpDeepCopyKey(IN PHHIVE SourceHive, IN HCELL_INDEX SrcKeyCell, IN PHHIVE DestinationHive, IN HSTORAGE_TYPE StorageType, OUT PHCELL_INDEX DestKeyCell OPTIONAL)
VOID NTAPI CmpCleanUpKcbCacheWithLock(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN LockHeldExclusively)
_In_opt_ PALLOCATE_FUNCTION Allocate
NTSTATUS NTAPI CmpRemoveValueFromList(IN PHHIVE Hive, IN ULONG Index, IN OUT PCHILD_LIST ChildList)
NTSTATUS NTAPI CmpAddValueToList(IN PHHIVE Hive, IN HCELL_INDEX ValueCell, IN ULONG Index, IN HSTORAGE_TYPE StorageType, IN OUT PCHILD_LIST ChildList)
#define STATUS_BUFFER_TOO_SMALL
SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
UNICODE_STRING FileUserName
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
VOID NTAPI CmpCleanUpSubKeyInfo(IN PCM_KEY_CONTROL_BLOCK Kcb)
BOOLEAN NTAPI CmpFreeValue(IN PHHIVE Hive, IN HCELL_INDEX Cell)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI CmpCloseHiveFiles(IN PCMHIVE Hive)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
#define CMP_ASSERT_FLUSH_LOCK(h)
NTSTATUS NTAPI CmpSetValueKeyNew(IN PHHIVE Hive, IN PCM_KEY_NODE Parent, IN PUNICODE_STRING ValueName, IN ULONG Index, IN ULONG Type, IN PVOID Data, IN ULONG DataSize, IN ULONG StorageType, IN ULONG SmallData)
#define OBJ_NAME_PATH_SEPARATOR
#define SeDeleteClientSecurity(C)
VOID NTAPI CmpCopyCompressedName(OUT PWCHAR Destination, IN ULONG DestinationLength, IN PWCHAR Source, IN ULONG SourceLength)
PVOID CMAPI HvGetCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset)
NTSTATUS NTAPI CmpCmdHiveOpen(IN POBJECT_ATTRIBUTES FileAttributes, IN PSECURITY_CLIENT_CONTEXT ImpersonationContext, IN OUT PBOOLEAN Allocate, OUT PCMHIVE *NewHive, IN ULONG CheckFlags)
WCHAR Name[ANYSIZE_ARRAY]
#define CM_KCB_SUBKEY_ONE
VALUE_SEARCH_RETURN_TYPE NTAPI CmpGetValueListFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb, OUT PCELL_DATA *CellData, OUT BOOLEAN *IndexIsCached, OUT PHCELL_INDEX ValueListToRelease)
FORCEINLINE VOID ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
HANDLE FileHandles[HFILE_TYPE_MAX]
#define EXCEPTION_EXECUTE_HANDLER
BOOLEAN CMAPI HvWriteHive(PHHIVE RegistryHive)
static BOOLEAN CmpIsKeyValueSmall(OUT PULONG RealLength, IN ULONG Length)
HCELL_INDEX SubKeyLists[HTYPE_COUNT]
struct _CM_KEY_NODE * PCM_KEY_NODE
static NTSTATUS CmpQueryNameInformation(_In_ PCM_KEY_CONTROL_BLOCK Kcb, _Out_opt_ PKEY_NAME_INFORMATION KeyNameInfo, _In_ ULONG Length, _Out_ PULONG ResultLength)
#define REG_NOTIFY_CHANGE_LAST_SET
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
VOID NTAPI CmpLockRegistryExclusive(VOID)
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
NTKERNELAPI NTSTATUS NTAPI SeCreateClientSecurity(IN PETHREAD Thread, IN PSECURITY_QUALITY_OF_SERVICE QualityOfService, IN BOOLEAN RemoteClient, OUT PSECURITY_CLIENT_CONTEXT ClientContext)
VOID CMAPI HvFree(PHHIVE RegistryHive)
#define HIVE_IS_UNLOADING
#define STATUS_KEY_DELETED
FORCEINLINE VOID CmpReleaseKcbLock(PCM_KEY_CONTROL_BLOCK Kcb)
NTSTATUS NTAPI CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PUNICODE_STRING ValueName, IN ULONG Type, IN PVOID Data, IN ULONG DataLength)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
VOID NTAPI CmpRemoveKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
struct _LIST_ENTRY * Flink
NTSTATUS NTAPI CmpSetValueDataNew(IN PHHIVE Hive, IN PVOID Data, IN ULONG DataSize, IN HSTORAGE_TYPE StorageType, IN HCELL_INDEX ValueCell, OUT PHCELL_INDEX DataCell)
USHORT NTAPI CmpCopyName(IN PHHIVE Hive, OUT PWCHAR Destination, IN PUNICODE_STRING Source)
_Must_inspect_result_ _In_ ULONG Flags
#define CM_KCB_INVALID_CACHED_INFO
#define _SEH2_YIELD(STMT_)
#define NT_SUCCESS(StatCode)
VOID NTAPI CmpFree(_In_ PVOID Ptr, _In_ ULONG Quota)
_In_ WDFCOLLECTION _In_ ULONG Index
ULONG SubKeyCounts[HTYPE_COUNT]
VOID NTAPI CmpUnlockRegistry(VOID)
#define CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK()
VOID NTAPI CmpRemoveFromHiveFileList(IN PCMHIVE Hive)
#define ObDereferenceObject
BOOLEAN CmpSpecialBootCondition
_In_ GUID _In_ PVOID ValueData
NTSTATUS NTAPI CmQueryKey(_In_ PCM_KEY_CONTROL_BLOCK Kcb, _In_ KEY_INFORMATION_CLASS KeyInformationClass, _Out_opt_ PVOID KeyInformation, _In_ ULONG Length, _Out_ PULONG ResultLength)
#define CM_KCB_SUBKEY_HINT
BOOLEAN CMAPI HvMarkCellDirty(PHHIVE RegistryHive, HCELL_INDEX CellOffset, BOOLEAN HoldingLock)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
#define STATUS_ACCESS_DENIED
NTSTATUS NTAPI CmpCopyKeyValueList(IN PHHIVE SourceHive, IN PCHILD_LIST SrcValueList, IN PHHIVE DestinationHive, IN OUT PCHILD_LIST DestValueList, IN HSTORAGE_TYPE StorageType)
NTSTATUS NTAPI CmSaveMergedKeys(IN PCM_KEY_CONTROL_BLOCK HighKcb, IN PCM_KEY_CONTROL_BLOCK LowKcb, IN HANDLE FileHandle)
BOOLEAN CMAPI HvSyncHive(PHHIVE RegistryHive)
PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
VOID CMAPI HvFreeCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset)
BOOLEAN CMAPI HvTrackCellRef(IN OUT PHV_TRACK_CELL_REF CellRef, IN PHHIVE Hive, IN HCELL_INDEX Cell)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
#define CM_KEY_VALUE_SMALL
#define STATUS_CANNOT_DELETE
static NTSTATUS CmpQueryFlagsInformation(_In_ PCM_KEY_CONTROL_BLOCK Kcb, _Out_ PKEY_USER_FLAGS_INFORMATION KeyFlagsInfo, _In_ ULONG Length, _In_ PULONG ResultLength)
LONG CMAPI HvGetCellSize(PHHIVE RegistryHive, PVOID Cell)
#define SECURITY_DYNAMIC_TRACKING
#define STATUS_INVALID_INFO_CLASS
NTSTATUS NTAPI CmpSetValueKeyExisting(IN PHHIVE Hive, IN HCELL_INDEX OldChild, IN PCM_KEY_VALUE Value, IN ULONG Type, IN PVOID Data, IN ULONG DataSize, IN ULONG StorageType, IN ULONG TempData)
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
USHORT NTAPI CmpNameSize(IN PHHIVE Hive, IN PUNICODE_STRING Name)
HCELL_INDEX NTAPI CmpCopyCell(IN PHHIVE SourceHive, IN HCELL_INDEX SourceCell, IN PHHIVE DestinationHive, IN HSTORAGE_TYPE StorageType)
#define REG_NO_LAZY_FLUSH
static const WCHAR Cleanup[]
VOID NTAPI CmpSetGlobalQuotaAllowed(VOID)
EX_PUSH_LOCK CmpLoadHiveLock
VOID NTAPI CmpLockHiveFlusherShared(IN PCMHIVE Hive)
NTSTATUS NTAPI CmpInitializeHive(OUT PCMHIVE *CmHive, IN ULONG OperationType, IN ULONG HiveFlags, IN ULONG FileType, IN PVOID HiveData OPTIONAL, IN HANDLE Primary, IN HANDLE Log, IN HANDLE External, IN PCUNICODE_STRING FileName OPTIONAL, IN ULONG CheckFlags)
UNICODE_STRING CmSymbolicLinkValueName
NTSTATUS NTAPI CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN ULONG Flags)
NTSTATUS NTAPI CmpQueryKeyData(IN PHHIVE Hive, IN PCM_KEY_NODE Node, IN KEY_INFORMATION_CLASS KeyInformationClass, IN OUT PVOID KeyInformation, IN ULONG Length, IN OUT PULONG ResultLength)
WCHAR Name[ANYSIZE_ARRAY]
FORCEINLINE VOID ExReleasePushLock(PEX_PUSH_LOCK PushLock)
_In_ ULONG _In_ ULONG Offset
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFCHILDLIST * ChildList
NTSTATUS NTAPI CmQueryValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN UNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
FORCEINLINE VOID ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
VOID NTAPI CmpFlushNotifiesOnKeyBodyList(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN LockHeld)
EX_PUSH_LOCK CmpHiveListHeadLock
#define STATUS_OBJECT_NAME_NOT_FOUND
#define STATUS_BUFFER_OVERFLOW
FORCEINLINE BOOLEAN CmpTryToConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
BOOLEAN CmpForceForceFlush
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define HFILE_TYPE_PRIMARY
FORCEINLINE VOID CmpConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
struct _CM_KEY_VALUE * PCM_KEY_VALUE
#define FIELD_OFFSET(t, f)
struct _SECURITY_QUALITY_OF_SERVICE SECURITY_QUALITY_OF_SERVICE
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
NTSTATUS NTAPI CmpFreeKeyByCell(IN PHHIVE Hive, IN HCELL_INDEX Cell, IN BOOLEAN Unlink)
VOID NTAPI CmpLockHiveFlusherExclusive(IN PCMHIVE Hive)
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG BOOLEAN BOOLEAN ExclusiveLock
VALUE_SEARCH_RETURN_TYPE NTAPI CmpFindValueByNameFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PCUNICODE_STRING Name, OUT PCM_CACHED_VALUE **CachedValue, OUT ULONG *Index, OUT PCM_KEY_VALUE *Value, OUT BOOLEAN *ValueIsCached, OUT PHCELL_INDEX CellToRelease)
#define CmpIsKcbLockedExclusive(k)
BOOLEAN NTAPI CmpDoFlushAll(IN BOOLEAN ForceFlush)
BOOLEAN NTAPI CmpTestRegistryLockExclusive(VOID)
#define RtlZeroMemory(Destination, Length)
#define ALIGN_UP_BY(size, align)
#define RtlCopyMemory(Destination, Source, Length)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
NTSTATUS NTAPI CmDeleteKey(IN PCM_KEY_BODY KeyBody)
VOID NTAPI CmpReportNotify(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PHHIVE Hive, IN HCELL_INDEX Cell, IN ULONG Filter)
VOID NTAPI CmpCleanUpKcbValueCache(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define _SEH2_EXCEPT(...)
#define ExFreePoolWithTag(_P, _T)
#define _SEH2_GetExceptionCode()
BOOLEAN NTAPI CmpFreeValueData(IN PHHIVE Hive, IN HCELL_INDEX DataCell, IN ULONG DataLength)
enum _VALUE_SEARCH_RETURN_TYPE VALUE_SEARCH_RETURN_TYPE
NTSTATUS NTAPI CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN ULONG Index, IN KEY_INFORMATION_CLASS KeyInformationClass, IN PVOID KeyInformation, IN ULONG Length, IN PULONG ResultLength)
#define KeGetCurrentThread
_In_ ULONG _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
FORCEINLINE VOID CmpAcquireKcbLockExclusive(PCM_KEY_CONTROL_BLOCK Kcb)
#define ASSERT_VALUE_BIG(h, s)
VOID NTAPI CmpLockRegistry(VOID)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
VOID NTAPI CmpDestroySecurityCache(IN PCMHIVE Hive)
USHORT NTAPI CmpCompressedNameSize(IN PWCHAR Name, IN ULONG Length)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
VOID NTAPI CmpAcquireTwoKcbLocksExclusiveByKey(IN ULONG ConvKey1, IN ULONG ConvKey2)
base of all file and directory entries
NTSTATUS NTAPI CmpAddToHiveFileList(IN PCMHIVE Hive)
enum _KEY_VALUE_INFORMATION_CLASS KEY_VALUE_INFORMATION_CLASS
VOID NTAPI CmpDestroyHiveViewList(IN PCMHIVE Hive)
#define STATUS_NO_LOG_SPACE
#define CM_KCB_SYM_LINK_FOUND
BOOLEAN CMAPI HvHiveWillShrink(IN PHHIVE RegistryHive)
BOOLEAN NTAPI CmpMarkValueDataDirty(IN PHHIVE Hive, IN PCM_KEY_VALUE Value)
PULONG MinorVersion OPTIONAL