MiCheckControlArea
VOID __stdcall MiCheckControlArea(_CONTROL_AREA *ControlArea, UINT8 OldIrql){
unsigned __int64 v3;
__int64 v4;
__int64 *v5;
__int16 v6;
UINT64 v7;
unsigned int v8;
_BOOL8 v9;
volatile INT64 *v10;
struct _KPRCB *CurrentPrcb;
int v12;
KIRQL v13;
bool v14;
UINT64 inserted;
__int64 *v16;
__int64 *v17;
INT64 v18;
__int128 v19;
v3 = OldIrql;
v4 = *((_QWORD *)ControlArea + 8);
v5 = 0i64;
v6 = *((_WORD *)ControlArea + 30);
v7 = 0i64;
v8 = 0;
v19 = 0i64;
v9 = v4 != 0;
v18 = -1i64;
v10 = *(volatile INT64 **)(qword_140C4E388 + 8i64 * (v6 & 0x3FF));
if( *((_QWORD *)ControlArea + 5) || *((_QWORD *)ControlArea + 3) )
{
if( !*((_QWORD *)ControlArea + 10) )
goto LABEL_3;
goto LABEL_31;
}
if( (v4 & 0xFFFFFFFFFFFFFFF0ui64) == 0 )
{
*((_DWORD *)ControlArea + 14) |= 1u;
v8 = 2;
goto LABEL_3;
}
v12 = *((_DWORD *)ControlArea + 14);
if( !*((_QWORD *)ControlArea + 4) )
{
v8 = 2;
*((_DWORD *)ControlArea + 14) = v12 | 1;
MiClearFilePointer(ControlArea);
goto LABEL_3;
}
if( (v12 & 0x40000) != 0 )
{
v8 = 1;
}
else
{
if( (v12 & 0x20020) != 131104 )
{
inserted = MiInsertUnusedSegment(ControlArea);
v12 = *((_DWORD *)ControlArea + 14);
v7 = inserted;
}
if( (v12 & 0x20) != 0 )
{
MiImageUnused((INT64)ControlArea, 1i64, (INT64)&v18);
v12 = *((_DWORD *)ControlArea + 14);
}
}
if( (v12 & 0x20020) == 131104 )
{
*((_QWORD *)ControlArea + 5) = 1i64;
*((_DWORD *)ControlArea + 14) = v12 | 4;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)ControlArea + 9);
__writecr8(v3);
MiPurgeImageSection((__int64)ControlArea);
v13 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)ControlArea + 18);
*((_DWORD *)ControlArea + 14) &= ~4u;
LOBYTE(v3) = v13;
v14 = (*((_QWORD *)ControlArea + 5))-- == 1i64;
if( v14 && !*((_QWORD *)ControlArea + 3) )
{
if( *((_QWORD *)ControlArea + 4) )
{
if( !v8 )
{
v7 = MiInsertUnusedSegment(ControlArea);
v8 = 4;
}
}
else
{
*((_DWORD *)ControlArea + 14) |= 1u;
v8 = 2;
MiClearFilePointer(ControlArea);
}
goto LABEL_3;
}
LABEL_31:
v8 = 4;
}
LABEL_3:
if( v8 >= 4 )
{
MiBuildWakeList(ControlArea, 3ui64);
v5 = v17;
v8 &= ~4u;
}
if( v8 )
{
if( (v8 & 1) != 0 )
{
*((_QWORD *)ControlArea + 5) = 1i64;
MiCleanSection(ControlArea, v3, 0);
}
else
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)ControlArea + 9);
__writecr8((unsigned __int8)v3);
MiSegmentDelete((__int64)ControlArea);
}
}
else
{
*((_DWORD *)ControlArea + 18) = 0;
CurrentPrcb = KeGetCurrentPrcb();
__writecr8((unsigned __int8)v3);
if( v5 )
{
do
{
v16 = (__int64 *)*v5;
KeSignalGate((_KGATE *)(v5 + 2), 1i64);
v5 = v16;
}
while( v16 );
}
MiFreeExcessSegments((UINT64)CurrentPrcb);
}
if( v7 )
MiReturnCrossPartitionSectionCharges(v10, v9, v7);
MiReturnImageBase((INT64)&v18);
}Referenced by:
MiAddViewsForSection
MiDeleteVad
MiDereferenceControlArea
MiDereferenceControlAreaBySection
MiFlushRelease
MiReleaseFaultCharges
MiRemoveMappedPtes
MiRemoveSystemCacheReferences
MmPurgeSection
MmUnmapViewInSystemCache