CmpFreeKeyControlBlock
VOID __stdcall CmpFreeKeyControlBlock(_CM_KEY_CONTROL_BLOCK *kcb){
char *RealKeyName;
unsigned __int64 FullKCBName;
_InterlockedDecrement64((volatile signed __int64 *)CmPerfCounters);
if( ($B9512D9805578D643BEBB89DC99AC162 *)kcb->KeyBodyListHead.Flink != &kcb->120 )
KeBugCheckEx(0x51u, 0x11ui64, (ULONG_PTR)kcb, 0i64, 0i64);
if( (*((_DWORD *)kcb + 2) & 0x10000) != 0 )
KeBugCheckEx(0x51u, 0x11ui64, (ULONG_PTR)kcb, 1ui64, 0i64);
RealKeyName = kcb->RealKeyName;
if( (unsigned __int64)RealKeyName >= 2 )
ExFreePoolWithTag(RealKeyName, 0x624E4D43u);
FullKCBName = (unsigned __int64)kcb->FullKCBName;
if( (FullKCBName & 1) != 0 )
FullKCBName &= ~1ui64;
if( FullKCBName )
CmpFreeTransientPoolWithTag((PVOID)FullKCBName, 0x624E4D43ui64);
*((_DWORD *)kcb + 2) |= 0x10000u;
kcb->KeyHash.KeyHive = 0i64;
++dword_140CDB01C;
if( CmpKcbLookaside >= (unsigned __int16)word_140CDB010 )
{
++dword_140CDB020;
((void(__fastcall *)(_CM_KEY_CONTROL_BLOCK *, void *))qword_140CDB038)(kcb, &CmpKcbLookaside);
}
else
{
RtlpInterlockedPushEntrySList((PSLIST_HEADER)&CmpKcbLookaside, (PSLIST_ENTRY)kcb);
}
_InterlockedDecrement64(&qword_140D2DFA0);
}Referenced by:
CmEnumerateValueKey
CmpCleanUpKCBCacheTable
CmpCloneToUnbackedKcb
CmpCreateKeyControlBlock
CmpDereferenceKeyControlBlock
CmpDereferenceKeyControlBlockWithLock
CmpPerformSingleKcbCacheLookup
CmpSearchKeyControlBlockTreeEx
CmpUnlockKcb
CmpUnlockKcbStack
CmpUnlockTwoKcbs
CmpWalkOneLevel
DelistKeyBodyFromKCB