CmpCleanUpKCBCacheTable

VOID __fastcall CmpCleanUpKCBCacheTable(INT64 a1){
  unsigned int v1; 
  __int64 v2; 
  __int64 v3; 
  _CM_KEY_HASH **v4; 
  _CM_KEY_HASH *i; 
  _CM_KEY_CONTROL_BLOCK *p_KeyHive; 
  _CM_KEY_HASH **p_NextHash; 
  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 = (_CM_KEY_HASH **)(v2 + 16);
    do
    {
      for( i = *v4; i; i = *p_NextHash )
      {
        p_KeyHive = (_CM_KEY_CONTROL_BLOCK *)&i[-1].KeyHive;
        if( i[-1].KeyHive )
        {
          p_NextHash = &p_KeyHive->KeyHash.NextHash;
        }
        else
        {
          CmpRemoveFromDelayedClose((__int64)&i[-1].KeyHive);
          CmpCleanUpKcbCacheWithLock(p_KeyHive, (INT64)RegLockHeldEx);
          if( (p_KeyHive->_bf_8 & 0x80000) != 0 )
            CmpFreeKeyControlBlock((UINT64)p_KeyHive);
          CmpDrainDelayDerefContext((UINT64 **)RegLockHeldEx);
          p_NextHash = (_CM_KEY_HASH **)(v2 + 16 + 24 * v3);
        }
      }
      v3 = (unsigned int)(v3 + 1);
      v4 += 3;
    }
    while( (unsigned int)v3 < v1 );
  }
  KiUnstackDetachProcess(&ApcState, 0i64);
}

Referenced by:

CmpCleanUpHigherLayerKcbCachesPostCallback
CmpEnumerateAllOpenSubKeys
CmpRefreshHive