MiPurgeImageSection
VOID __stdcall MiPurgeImageSection(_CONTROL_AREA *ControlArea){
__int64 v1;
__int64 v2;
_MMINPAGE_SUPPORT *v3;
_CONTROL_AREA *v4;
_MI_PARTITION *v5;
__int64 v6;
__int64 v7;
ULONG_PTR v8;
__int64 v9;
unsigned int v10;
unsigned __int64 v11;
_MMPFN *v12;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13;
UINT64 v14;
_MMPTE v15;
_DWORD *v16;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v17;
INT64 v18;
UINT64 v19;
unsigned __int64 v20;
int v21;
_MMPFN *v22;
unsigned __int64 v23;
int v24;
UINT64 SpinCount;
UINT64 v26;
_MI_PARTITION *Partition;
__int64 v28;
__int64 v29;
__int64 v30;
unsigned __int64 v31;
UINT8 PageIrql;
unsigned int v34;
unsigned int v35;
v1 = (__int64)&ControlArea[1];
v2 = ControlArea->u1.Flags._bf_0 & 0x3FF;
v3 = 0i64;
PageIrql = 17;
v4 = ControlArea;
v26 = 0i64;
v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v2);
Partition = v5;
while( 1 )
{
v28 = v1;
if( !v1 )
break;
if( (*(_WORD *)(v1 + 34) & 2) == 0 )
goto LABEL_4;
v7 = MiSwizzleInvalidPte(16i64 * (*(_WORD *)(v1 + 32) & 0x3E));
v29 = v7;
v9 = v7;
v35 = 0;
v34 = 0;
if( *(_DWORD *)(v1 + 36) )
{
v9 = MiSwizzleInvalidPte(16 * (v6 | (v1 << 12) | 0x40));
v35 = (*(_DWORD *)(v1 + 40) << 9) | (v10 >> 4);
}
v11 = *(_QWORD *)(v1 + 8);
v31 = v11 + 8i64 * *(unsigned int *)(v1 + 44);
if( v11 < v31 )
{
while( 1 )
{
if( (v11 & 0xFFF) == 0 || PageIrql == 17 )
{
if( PageIrql != 17 )
MiUnlockProtoPoolPage(v8, PageIrql);
while( 1 )
{
v26 = (UINT64)MiLockProtoPoolPage((_MMPTE *)v11, &PageIrql);
if( v26 )
break;
MmAccessFault(2ui64, (PVOID)v11, 0, 0i64);
}
v7 = v29;
}
v12 = MiLockLeafPage((_MMPTE *)v11, 0i64);
LODWORD(v13.Long) = MI_READ_PTE_LOCK_FREE(v11);
v15.u.Long = v13.Long;
if( !v13.Long )
{
LABEL_20:
v1 = v28;
v8 = v26;
goto LABEL_21;
}
if( !v12 )
break;
if( (*(_BYTE *)(&v12->u3 + 1) & 0x10) != 0 || (*(_DWORD *)(&v12->3 + 1) & 0x400i64) == 0 )
{
v16 = &v12->3 + 1;
if( (*(_DWORD *)(&v12->3 + 1) & 0x400i64) != 0 )
MiDereferenceControlAreaPfnList(v4, 0i64, v14, 2ui64);
v17.Long = 0i64;
v30 = v12->u4._bf_0 & 0xFFFFFFFFFi64;
if( v12->u3.ReferenceCount )
{
v12->u2._bf_0 |= 0x4000000000000000ui64;
if( (*(_BYTE *)(&v12->u3 + 1) & 0x28) == 32 )
{
v3 = (_MMINPAGE_SUPPORT *)(v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0
- 32);
if( v3->ListHead[0].Flink == v3->ListHead )
v3 = 0i64;
}
if( (*v16 & 0x400i64) == 0 )
MiChargeCommit(Partition, 1ui64, 4ui64);
}
else
{
MiUnlinkPageFromList(v12, 0i64);
if( (*v16 & 0x400i64) == 0 )
v17.Long = MiCapturePageFileInfoInline(&v12->OriginalPte, 0i64, 1ui64).u.Long;
if( *(&stru_140C4DB30 + 42) )
{
if( (v15.u.Long & 0x10) != 0 )
v15.u.Long &= ~0x10ui64;
else
v15.u.Long &= ~*(&stru_140C4DB30 + 42);
}
MiInsertPageInFreeOrZeroedList((v15.u.Long >> 12) & 0xFFFFFFFFFi64, 2ui64, v18, v19, SpinCount, v26);
}
v20 = v9;
LOBYTE(v21) = MiPteInShadowRange(v11);
if( v21 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v9 & 1) != 0 )
v20 = v9 | 0x8000000000000000ui64;
*(_QWORD *)v11 = v20;
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v3 )
MiInvalidateCollidedIos(v3);
v22 = &MmGetPfnDb()[v30];
v3 = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v22->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v22->u2._bf_0 < 0 );
}
MiDecrementShareCount(v22);
_InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v5 = Partition;
if( v17.Long )
MiReleasePageFileInfo(Partition, (_MMPTE)v17.Long, 1ui64);
LABEL_60:
v4 = ControlArea;
goto LABEL_17;
}
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_17:
v11 += 8i64;
v8 = v26;
v34 += 4096;
if( v34 >= v35 )
v9 = v7;
if( v11 >= v31 )
goto LABEL_20;
}
if( (v13.Long & 0x400) != 0 || v13.Long == MiSwizzleInvalidPte(768i64) )
goto LABEL_17;
MiReleasePageFileSpace(v5, v15, 1ui64);
v23 = v9;
LOBYTE(v24) = MiPteInShadowRange(v11);
if( v24 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v9 & 1) != 0 )
v23 = v9 | 0x8000000000000000ui64;
*(_QWORD *)v11 = v23;
goto LABEL_60;
}
LABEL_21:
if( PageIrql != 17 )
{
MiUnlockProtoPoolPage(v8, PageIrql);
PageIrql = 17;
}
LABEL_4:
v1 = *(_QWORD *)(v1 + 16);
}
}Referenced by:
MiCheckControlArea