CmpCleanUpKCBCacheTable

VOID __fastcall CmpCleanUpKCBCacheTable(INT64 a1){
  unsigned int v1; 
  __int64 v2; 
  __int64 v3; 
  __int64 *v4; 
  __int64 i; 
  __int64 v6; 
  __int64 *v7; 
  INT64 RegLockHeldEx[2]; 
  KAPC_STATE ApcState; 
  v1 = *(_DWORD *)(a1 + 1648);
  v2 = *(_QWORD *)(a1 + 1640);
  memset(&ApcState, 0, sizeof(ApcState));
  *(_OWORD *)RegLockHeldEx = 0i64;
  CmpAttachToRegistryProcess(&ApcState);
  CmpInitializeDelayDerefContext(RegLockHeldEx);
  v3 = 0i64;
  if( v1 )
  {
    v4 = (__int64 *)(v2 + 16);
    do
    {
      for( i = *v4; i; i = *v7 )
      {
        v6 = i - 16;
        if( *(_QWORD *)(i - 16) )
        {
          v7 = (__int64 *)(v6 + 24);
        }
        else
        {
          CmpRemoveFromDelayedClose(i - 16);
          CmpCleanUpKcbCacheWithLock((_CM_KEY_CONTROL_BLOCK *)v6, (INT64)RegLockHeldEx);
          if( (*(_DWORD *)(v6 + 8) & 0x80000) != 0 )
            CmpFreeKeyControlBlock((_CM_KEY_CONTROL_BLOCK *)v6);
          CmpDrainDelayDerefContext((UINT64 **)RegLockHeldEx);
          v7 = (__int64 *)(v2 + 16 + 24 * v3);
        }
      }
      v3 = (unsigned int)(v3 + 1);
      v4 += 3;
    }
    while( (unsigned int)v3 < v1 );
  }
  KiUnstackDetachProcess(&ApcState, 0i64);
}

Referenced by:

CmpCleanUpHigherLayerKcbCachesPostCallback
CmpEnumerateAllOpenSubKeys
CmpRefreshHive