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