MiDeleteControlArea

VOID __stdcall MiDeleteControlArea(_CONTROL_AREA *ControlArea){
  union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v2; 
  UINT64 v3; 
  _MI_CROSS_PARTITION_CHARGES *v4; 
  volatile signed __int64 *p_ChargeFailures; 
  _MSUBSECTION *v6; 
  _MSUBSECTION *NextSubsection; 
  _MI_IMAGE_SECURITY_REFERENCE *SeImageStub; 
  unsigned __int64 v9; 
  __int64 v10; 

  v2.LongFlags = (unsigned int)ControlArea->u;
  v3 = 0i64;
  v4 = *(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (ControlArea->u1.Flags._bf_0 & 0x3FF));
  p_ChargeFailures = (volatile signed __int64 *)&v4[42].ChargeFailures;
  if( (v2.LongFlags & 0x20) != 0 )
  {
    SeImageStub = ControlArea->u2.SeImageStub;
    if( (SeImageStub->SecurityContext.Value & 0xFFFFFFFFFFFFFFF8ui64) > 8 )
      SeReleaseImageValidationContext((VOID *)(SeImageStub->SecurityContext.Value & 0xFFFFFFFFFFFFFFF8ui64));
    MiFreeRelocations(ControlArea, SeImageStub->DynamicRelocations);
  }
  else
  {
    if( SLOBYTE(v2.LongFlags) < 0 )
    {
      v6 = *(_MSUBSECTION **)&ControlArea[1].gap8[8];
      if( !v6 )
        goto LABEL_6;
      do
      {
        NextSubsection = (_MSUBSECTION *)v6->Core.NextSubsection;
        if( (v6->Core.u.SubsectionFlags._bf_2 & 1) != 0 && (v6->Core.u1.e1._bf_0 & 0x3FFFFFFF) != 0 )
        {
          MiUpdateSubsectionCrossPartitionRefs(v6, 1);
          v9 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
          LODWORD(v10) = MiDecrementSubsectionViewCount(v6);
          v3 += v10;
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
          __writecr8(v9);
          v6->Core.u.SubsectionFlags._bf_2 &= ~1u;
        }
        ExFreePoolWithTag(v6, 0);
        v6 = NextSubsection;
      }
      while( NextSubsection );
    }
    else
    {
      p_ChargeFailures = (volatile signed __int64 *)&v4[42].ChargePeak;
    }
    if( v3 )
      MiReturnCrossPartitionSectionCharges(v4, 1i64, v3);
  }
LABEL_6:
  MiDecrementControlAreaCount((__int64)v4, p_ChargeFailures);
  MiDeleteFileExtents((INT64)ControlArea);
  ExFreePoolWithTag(ControlArea, 0);
}

Referenced by:

MiDeleteCachedSubsection
MiDeleteControlAreaList
MiDereferenceControlAreaProbe
MiFlushControlArea