CmpVERemoveHiveFromSIDMappingTable

VOID __fastcall CmpVERemoveHiveFromSIDMappingTable(INT64 a1){
  unsigned int v2; 
  _QWORD *v3; 
  __int64 v4; 

  if( (*(_DWORD *)(a1 + 4152) & 2) != 0 )
  {
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 736));
    v2 = 0;
    if( CmpSIDToHiveMappingCount )
    {
      v3 = (char *)CmpSIDToHiveMapping + 24;
      do
      {
        if( *v3 == a1 )
          break;
        ++v2;
        v3 += 4;
      }
      while( v2 < CmpSIDToHiveMappingCount );
    }
    v4 = 32i64 * v2;
    ExFreePoolWithTag(*(PVOID *)((char *)CmpSIDToHiveMapping + v4 + 8), 0);
    memmove(
      (char *)CmpSIDToHiveMapping + v4,
      (char *)CmpSIDToHiveMapping + 32 * v2 + 32,
      32 * (--CmpSIDToHiveMappingCount - v2));
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 736));
  }
}

Referenced by:

CmShutdownSystem
CmpCompleteUnloadKey
CmpDestroyHive