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