120 if (IsFake)
KeyHash->KeyCell++;
160 p = NodeName->Buffer;
161 for (
i = 0;
i < NodeName->Length;
i +=
sizeof(
WCHAR))
176 for (
i = 0;
i < (NodeName->Length /
sizeof(
WCHAR));
i++)
179 if (NodeName->Buffer[
i] > (
UCHAR)-1)
182 Length = NodeName->Length;
183 IsCompressed =
FALSE;
217 p = NodeName->Buffer;
269 for (
i = 0;
i < NodeName->Length /
sizeof(
WCHAR);
i++)
278 for (
i = 0;
i < NodeName->Length /
sizeof(
WCHAR);
i++)
326 ASSERT(Ncb->RefCount >= 1);
327 if (!(--Ncb->RefCount))
336 if (Current == &Ncb->NameHash)
363 if (Kcb->RefCount == 0)
372 Kcb->DelayedCloseIndex = 1;
384 if (Kcb->DelayedCloseIndex == 1)
387 Kcb->DelayedCloseIndex = 0;
393 (Kcb->DelayedCloseIndex == 0));
408 if (!Kcb->DelayedCloseIndex)
444 for (
i = 0;
i < Kcb->ValueCache.Count;
i++)
461 if ((Kcb->ValueCache.RealKcb->RefCount == 1) &&
462 !(Kcb->ValueCache.RealKcb->Delete))
484 ASSERT(Kcb->RefCount == 0);
509 LockHeldExclusively ?
573 LONG OldRefCount, NewRefCount;
579 OldRefCount = *(
PLONG)&Kcb->RefCount;
580 NewRefCount = OldRefCount - 1;
583 if ((NewRefCount & 0xFFFF) > 0)
588 OldRefCount) == OldRefCount)
596 ConvKey = Kcb->ConvKey;
647 Kcb->KeyBodyArray[0] =
648 Kcb->KeyBodyArray[1] =
649 Kcb->KeyBodyArray[2] =
650 Kcb->KeyBodyArray[3] =
NULL;
713 if (!Kcb)
return NULL;
803 if (((
Parent->TotalLevels + 1) < 512) &&
905 PWCHAR TargetBuffer, CurrentNameW;
926 NameLength +=
sizeof(
WCHAR);
942 KeyName->MaximumLength = NameLength;
962 if (!DeletedKey && !MyKcb->
Delete)
998 CurrentNameW = KeyNode->
Name;
1004 TargetBuffer[
i+1] = *CurrentNameW;
1024 TargetBuffer[
i+1] = (
WCHAR)*CurrentName;
1055 for (
i = 0;
i < 4;
i++)
1088 &KeyBody->KeyBodyList);
1110 for (
i = 0;
i < 4;
i++)
1116 KeyBody) == KeyBody)
1151 ListHead = &Kcb->KeyBodyListHead;
1155 NextEntry = ListHead->
Flink;
1156 while (NextEntry != ListHead)
1188 NextEntry = NextEntry->
Flink;
BOOLEAN NTAPI CmpReferenceKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
WCHAR Name[ANYSIZE_ARRAY]
#define CMTRACE(x, fmt,...)
ULONG CmpDelayedCloseSize
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define CMP_ASSERT_KCB_LOCK(k)
#define CMP_ENLIST_KCB_LOCKED_EXCLUSIVE
struct _CM_KEY_CONTROL_BLOCK * ParentKcb
struct _CM_KEY_HASH_TABLE_ENTRY CM_KEY_HASH_TABLE_ENTRY
CACHED_CHILD_LIST ValueCache
PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable
PVOID NTAPI CmpAllocate(_In_ SIZE_T Size, _In_ BOOLEAN Paged, _In_ ULONG Tag)
#define HvReleaseCell(h, c)
#define CMP_IS_CELL_CACHED(c)
#define CM_REFERENCE_DEBUG
VOID NTAPI CmpDereferenceKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define InterlockedCompareExchange
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_KCB_NO_DELAY_CLOSE
VOID NTAPI CmpDelayDerefKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define InsertTailList(ListHead, Entry)
VOID NTAPI CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb)
struct _CM_NOTIFY_BLOCK * NotifyBlock
NTSYSAPI WCHAR NTAPI RtlUpcaseUnicodeChar(WCHAR Source)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
LARGE_INTEGER KcbLastWriteTime
VOID NTAPI CmpReleaseTwoKcbLockByKey(IN ULONG ConvKey1, IN ULONG ConvKey2)
VOID NTAPI CmpCleanUpKcbCacheWithLock(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN LockHeldExclusively)
VOID NTAPI EnlistKeyBodyWithKCB(IN PCM_KEY_BODY KeyBody, IN ULONG Flags)
BOOLEAN FASTCALL ObReferenceObjectSafe(IN PVOID Object)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
VOID NTAPI CmpCleanUpSubKeyInfo(IN PCM_KEY_CONTROL_BLOCK Kcb)
VOID NTAPI CmpInitializeCache(VOID)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
USHORT KcbMaxValueNameLen
#define ASSERT_VALID_HASH(h)
VOID NTAPI ObDereferenceObjectDeferDelete(IN PVOID Object)
#define OBJ_NAME_PATH_SEPARATOR
PCM_KEY_CONTROL_BLOCK NTAPI CmpInsertKeyHash(IN PCM_KEY_HASH KeyHash, IN BOOLEAN IsFake)
PVOID CMAPI HvGetCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset)
#define InterlockedCompareExchangePointer
#define CM_KCB_SUBKEY_ONE
PCM_KEY_CONTROL_BLOCK NTAPI CmpCreateKeyControlBlock(IN PHHIVE Hive, IN HCELL_INDEX Index, IN PCM_KEY_NODE Node, IN PCM_KEY_CONTROL_BLOCK Parent, IN ULONG Flags, IN PUNICODE_STRING KeyName)
VOID NTAPI CmpAddToDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN LockHeldExclusively)
#define CMP_ENLIST_KCB_LOCKED_SHARED
struct _CM_KEY_NODE * PCM_KEY_NODE
#define ExInitializePushLock
#define HIVE_IS_UNLOADING
FORCEINLINE VOID CmpReleaseKcbLock(PCM_KEY_CONTROL_BLOCK Kcb)
#define CmpAcquireNcbLockExclusiveByKey(k)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
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)
#define CM_KCB_INVALID_SIGNATURE
FORCEINLINE VOID CmpReleaseKcbLockByKey(ULONG ConvKey)
VOID NTAPI CmpRemoveKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
struct _LIST_ENTRY * Flink
_Must_inspect_result_ _In_ ULONG Flags
#define CMP_GET_CACHED_DATA(c)
#define CM_KCB_INVALID_CACHED_INFO
#define GET_HASH_ENTRY(Table, ConvKey)
VOID NTAPI CmpFree(_In_ PVOID Ptr, _In_ ULONG Quota)
_In_ WDFCOLLECTION _In_ ULONG Index
ULONG SubKeyCounts[HTYPE_COUNT]
#define CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK()
#define CMP_CREATE_FAKE_KCB
PUNICODE_STRING NTAPI CmpConstructName(IN PCM_KEY_CONTROL_BLOCK Kcb)
VOID NTAPI CmpFlushNotify(IN PCM_KEY_BODY KeyBody, IN BOOLEAN LockHeld)
#define CM_KCB_SUBKEY_HINT
#define CmpReleaseNcbLockByKey(k)
PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
VOID NTAPI CmpInitializeDelayedCloseTable(VOID)
VOID NTAPI CmpDereferenceNameControlBlockWithLock(IN PCM_NAME_CONTROL_BLOCK Ncb)
PCM_KEY_CONTROL_BLOCK NTAPI CmpAllocateKeyControlBlock(VOID)
#define InterlockedDecrement
struct _CM_NAME_HASH_TABLE_ENTRY CM_NAME_HASH_TABLE_ENTRY
#define CMP_LOCK_HASHES_FOR_KCB
#define GET_HASH_INDEX(ConvKey)
#define CM_KCB_KEY_NON_EXIST
WCHAR Name[ANYSIZE_ARRAY]
VOID NTAPI CmpRemoveKeyHash(IN PCM_KEY_HASH KeyHash)
VOID NTAPI CmpFlushNotifiesOnKeyBodyList(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN LockHeld)
#define InterlockedIncrement
FORCEINLINE BOOLEAN CmpTryToConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
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
FORCEINLINE VOID CmpConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
LONG NTAPI CmpCompareCompressedName(IN PCUNICODE_STRING SearchName, IN PWCHAR CompressedName, IN ULONG NameLength)
#define InitializeListHead(ListHead)
#define CMP_GET_CACHED_CELL(c)
VOID NTAPI CmpFreeKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define FIELD_OFFSET(t, f)
VOID NTAPI InitializeKCBKeyBodyList(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define CmpIsKcbLockedExclusive(k)
VOID NTAPI CmpDereferenceKeyControlBlockWithLock(IN PCM_KEY_CONTROL_BLOCK Kcb, IN BOOLEAN LockHeldExclusively)
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
VOID NTAPI DelistKeyBodyFromKCB(IN PCM_KEY_BODY KeyBody, IN BOOLEAN LockHeld)
#define RtlZeroMemory(Destination, Length)
VOID NTAPI CmpCleanUpKcbValueCache(IN PCM_KEY_CONTROL_BLOCK Kcb)
#define KeGetCurrentThread
FORCEINLINE VOID CmpAcquireKcbLockExclusive(PCM_KEY_CONTROL_BLOCK Kcb)
struct _CM_NAME_HASH * NextHash
USHORT NTAPI CmpCompressedNameSize(IN PWCHAR Name, IN ULONG Length)
VOID NTAPI CmpAcquireTwoKcbLocksExclusiveByKey(IN ULONG ConvKey1, IN ULONG ConvKey2)
base of all file and directory entries
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
#define ASSERT_KCB_VALID(k)
struct _CM_KEY_HASH * NextHash
#define CM_KCB_SYM_LINK_FOUND
PCM_NAME_CONTROL_BLOCK NTAPI CmpGetNameControlBlock(IN PUNICODE_STRING NodeName)