MiPurgeImageSection
void __fastcall MiPurgeImageSection(__int64 a1){
__int64 v1;
__int64 v2;
__int64 v3;
_CONTROL_AREA *v4;
_MI_PARTITION *v5;
UINT64 v6;
INT64 v7;
_MMPFN *v8;
INT64 v9;
unsigned int v10;
unsigned __int64 v11;
_MMPFN *v12;
INT64 v13;
UINT64 v14;
UINT64 v15;
_DWORD *v16;
UINT64 v17;
char *v18;
INT64 v19;
UINT64 SpinCount;
_MMPFN *v21;
_MI_PARTITION *Partition;
INT64 v23;
INT64 v24;
INT64 v25;
unsigned __int64 v26;
INT64 v27;
UINT8 PageIrql;
unsigned int v30;
unsigned int v31;
v1 = a1 + 128;
v2 = *(_WORD *)(a1 + 60) & 0x3FF;
v3 = 0i64;
PageIrql = 17;
v4 = (_CONTROL_AREA *)a1;
v21 = 0i64;
v5 = *(_MI_PARTITION **)(qword_140C4E388 + 8 * v2);
Partition = v5;
while( 1 )
{
v23 = v1;
if( !v1 )
break;
if( (*(_WORD *)(v1 + 34) & 2) == 0 )
goto LABEL_4;
v7 = MiSwizzleInvalidPte(16i64 * (*(_WORD *)(v1 + 32) & 0x3E));
v24 = v7;
v9 = v7;
v31 = 0;
v30 = 0;
if( *(_DWORD *)(v1 + 36) )
{
v9 = MiSwizzleInvalidPte(16 * (v6 | (v1 << 12) | 0x40));
v31 = (*(_DWORD *)(v1 + 40) << 9) | (v10 >> 4);
}
v11 = *(_QWORD *)(v1 + 8);
v26 = v11 + 8i64 * *(unsigned int *)(v1 + 44);
if( v11 < v26 )
{
while( 1 )
{
if( (v11 & 0xFFF) == 0 || PageIrql == 17 )
{
LOBYTE(v6) = PageIrql;
if( PageIrql != 17 )
MiUnlockProtoPoolPage(v8, v6);
while( 1 )
{
v21 = MiLockProtoPoolPage((_MMPTE *)v11, &PageIrql);
if( v21 )
break;
MmAccessFault(2ui64, (PVOID)v11, 0, 0i64);
}
v7 = v24;
}
v12 = MiLockLeafPage((_MMPTE *)v11, 0i64);
v13 = MI_READ_PTE_LOCK_FREE(v11);
v15 = v13;
if( !v13 )
{
LABEL_20:
v1 = v23;
v8 = v21;
goto LABEL_21;
}
if( !v12 )
break;
if( (*((_BYTE *)v12 + 34) & 0x10) != 0 || (*((_DWORD *)v12 + 4) & 0x400i64) == 0 )
{
v16 = (_DWORD *)((char *)v12 + 16);
if( (*((_DWORD *)v12 + 4) & 0x400i64) != 0 )
MiDereferenceControlAreaPfnList(v4, 0i64, v14, 2ui64);
v17 = 0i64;
v25 = *((_QWORD *)v12 + 5) & 0xFFFFFFFFFi64;
if( *((_WORD *)v12 + 16) )
{
*((_QWORD *)v12 + 3) |= 0x4000000000000000ui64;
if( (*((_BYTE *)v12 + 34) & 0x28) == 32 )
{
v3 = *(_QWORD *)v12 - 32i64;
if( *(_QWORD *)(v3 + 16) == v3 + 16 )
v3 = 0i64;
}
if( (*v16 & 0x400i64) == 0 )
MiChargeCommit(Partition, 1ui64, 4ui64);
}
else
{
MiUnlinkPageFromList(v12, 0i64);
if( (*v16 & 0x400i64) == 0 )
v17 = MiCapturePageFileInfoInline((UINT64 *)v12 + 2, 0i64, 1i64);
if( qword_140C4DC80 )
{
if( (v15 & 0x10) != 0 )
v15 &= ~0x10ui64;
else
v15 &= ~qword_140C4DC80;
}
MiInsertPageInFreeOrZeroedList((v15 >> 12) & 0xFFFFFFFFFi64, 2ui64);
}
*(_QWORD *)v11 = v9;
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( v3 )
MiInvalidateCollidedIos(v3);
v18 = (char *)MmGetPfnDb() + 48 * v25;
v3 = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v18 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v18 + 3) < 0 );
}
MiDecrementShareCount((UINT64)v18);
_InterlockedAnd64((volatile signed __int64 *)v18 + 3, 0x7FFFFFFFFFFFFFFFui64);
v5 = Partition;
if( v17 )
MiReleasePageFileInfo(
(INT64)Partition,
v17,
1,
v19,
SpinCount,
(INT64)v21,
(INT64)Partition,
v23,
v24,
v25,
v26,
v27);
LABEL_52:
v4 = (_CONTROL_AREA *)a1;
goto LABEL_17;
}
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_17:
v11 += 8i64;
v8 = v21;
v30 += 4096;
if( v30 >= v31 )
v9 = v7;
if( v11 >= v26 )
goto LABEL_20;
}
if( (v13 & 0x400) != 0 || v13 == MiSwizzleInvalidPte(768i64) )
goto LABEL_17;
MiReleasePageFileSpace(v5, v15, 1i64);
*(_QWORD *)v11 = v9;
goto LABEL_52;
}
LABEL_21:
LOBYTE(v6) = PageIrql;
if( PageIrql != 17 )
{
MiUnlockProtoPoolPage(v8, v6);
PageIrql = 17;
}
LABEL_4:
v1 = *(_QWORD *)(v1 + 16);
}
}Referenced by:
MiCheckControlArea