CmpRemoveFromSecurityCache

VOID __stdcall CmpRemoveFromSecurityCache(CMHIVE *CmHive, UINT64 SecurityCell){
  int v3; 
  __int64 v4; 
  _CM_KEY_SECURITY_CACHE *CachedSecurity; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  UINT64 v8; 

  LODWORD(v8) = 0;
  if( CmpFindSecurityCellCacheIndex(CmHive, SecurityCell, &v8) )
  {
    v3 = v8;
    v4 = (unsigned int)v8;
    CachedSecurity = CmHive->SecurityCache[v4].CachedSecurity;
    Flink = CachedSecurity->List.Flink;
    if( Flink->Blink != &CachedSecurity->List
      || (Blink = CachedSecurity->List.Blink, Blink->Flink != &CachedSecurity->List) )
    {
      __fastfail(3u);
    }
    Blink->Flink = Flink;
    Flink->Blink = Blink;
    CmHive->Hive.Free(CachedSecurity, CachedSecurity->DescriptorLength + 32);
    memmove(&CmHive->SecurityCache[v4], &CmHive->SecurityCache[v3 + 1], 16 * (CmHive->SecurityCount - v3 - 1));
    --CmHive->SecurityCount;
  }
}

Referenced by:

CmpRemoveSecurityCellList