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