CmpFreeKeyControlBlock
PSLIST_ENTRY __fastcall CmpFreeKeyControlBlock(UINT64 P2){
void *v2;
unsigned __int64 v3;
PSLIST_ENTRY result;
_InterlockedDecrement64(&CmPerfCounters);
if( *(_QWORD *)(P2 + 120) != P2 + 120 )
KeBugCheckEx(0x51u, (PVOID)0x11, (PVOID)P2, 0i64, 0i64);
if( (*(_DWORD *)(P2 + 8) & 0x10000) != 0 )
KeBugCheckEx(0x51u, (PVOID)0x11, (PVOID)P2, (PVOID)1, 0i64);
v2 = *(void **)(P2 + 200);
if( (unsigned __int64)v2 >= 2 )
ExFreePoolWithTag(v2, 0x624E4D43u);
v3 = *(_QWORD *)(P2 + 296);
if( (v3 & 1) != 0 )
v3 &= ~1ui64;
if( v3 )
CmpFreeTransientPoolWithTag((VOID *)v3, 0x624E4D43ui64);
*(_DWORD *)(P2 + 8) |= 0x10000u;
*(_QWORD *)(P2 + 32) = 0i64;
++*(&WheapErrorSourceTable + 113);
if( *(&WheapErrorSourceTable + 212) >= *(&WheapErrorSourceTable + 220) )
{
++*(&WheapErrorSourceTable + 114);
result = (PSLIST_ENTRY)(*(&WheapErrorSourceTable + 60))(P2, (char *)&WheapErrorSourceTable + 424);
}
else
{
result = RtlpInterlockedPushEntrySList((PSLIST_HEADER)((char *)&WheapErrorSourceTable + 424), (PSLIST_ENTRY)P2);
}
_InterlockedDecrement64(qword_140D2DFA0);
return result;
}Referenced by:
CmEnumerateValueKey
CmpCleanUpKCBCacheTable
CmpCloneToUnbackedKcb
CmpCreateKeyControlBlock
CmpDereferenceKeyControlBlock
CmpDereferenceKeyControlBlockWithLock
CmpPerformSingleKcbCacheLookup
CmpSearchKeyControlBlockTreeEx
CmpUnlockKcb
CmpUnlockKcbStack
CmpUnlockTwoKcbs
CmpWalkOneLevel
DelistKeyBodyFromKCB