MiDeleteSystemPagableVm
INT64 __fastcall MiDeleteSystemPagableVm(__int64 a1, __int64 a2, unsigned __int64 a3, __int64 a4, char a5, _QWORD *a6){
__int64 v6;
int v7;
int v10;
int v11;
_MMPTE *v12;
char v13;
int v14;
_MI_PARTITION *v15;
UINT8 v16;
INT64 v17;
__int64 v18;
unsigned __int64 v19;
char *v20;
_QWORD *v21;
char v22;
INT64 v23;
UNICODE_STRING *v24;
UINT8 v25;
WCHAR *v26;
int v27;
__int64 v28;
_MI_PARTITION *v29;
_MMPFN *v30;
UINT8 *v31;
BOOL IsContended;
INT64 v33;
INT64 v34;
int v35;
INT64 Flag;
INT64 v38;
CHAR a7;
INT64 v40;
UINT64 a2a;
int v42;
int v43;
int v44;
int v45;
INT64 v46;
UINT64 SpinCount;
INT64 v48;
unsigned __int64 v49;
INT64 v50[2];
__int128 v51;
INT64 *v52;
__int64 v53;
__int64 v54;
int v55;
__int16 v56;
__int16 v57;
__int64 v58;
__int64 v59;
__int64 v60;
__int128 v61;
__int128 v62;
__int128 v63;
__int128 v64;
__int128 v65;
__int128 v66;
__int128 v67;
__int128 v68;
__int128 v69;
__int64 v70;
v48 = a1;
v6 = a1;
v54 = a2;
v7 = 0;
v52 = 0i64;
v57 = 0;
v70 = 0i64;
v44 = 0;
*(_OWORD *)v50 = 0i64;
v51 = 0i64;
v61 = 0i64;
v62 = 0i64;
v63 = 0i64;
v64 = 0i64;
v65 = 0i64;
v66 = 0i64;
v67 = 0i64;
v68 = 0i64;
v69 = 0i64;
if( a2 )
{
if( (*(_DWORD *)(a2 + 56) & 0x800) != 0 )
v7 = 1;
v44 = v7;
}
v10 = 10;
a2a = 0i64;
v11 = 0;
HIDWORD(SpinCount) = a5 & 1;
v12 = 0i64;
v42 = 0;
if( (a5 & 1) == 0 )
v10 = 14;
DWORD2(v51) = v10;
v45 = a5 & 4;
if( (a5 & 4) != 0 )
DWORD2(v51) = v10 | 0x10;
v13 = *(_BYTE *)(v6 + 184) & 7;
v14 = 0;
v53 = (_QWORD)MmGetPteBase() << 25;
v43 = 0;
if( (unsigned __int8)(v13 - 3) > 1u )
{
if( (a5 & 2) != 0 )
{
if( (_DWORD)dword_140C4E568 )
v11 = 1;
v42 = v11;
}
v14 = 2;
v43 = 2;
}
v15 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v6 + 174));
v46 = (INT64)v15;
v58 = 20i64;
v55 = v14;
v56 = 0;
v59 = 0i64;
v60 = 0i64;
v49 = a3 + 8 * a4;
v16 = MiLockWorkingSetShared(v6);
a7 = v16;
while( a3 < v49 )
{
if( v12 )
{
if( (a3 & 0xFFF) != 0 )
goto LABEL_21;
MiFlushTbList((__int64)&v55);
a6[1] += MiTerminateWsleCluster((INT64)v50);
MiUnlockPageTableInternal(v6, (UINT64)v12);
}
v12 = MiLockLowestValidPageTable(v6, (INT64 *)a3, &v52);
a2a = (UINT64)v12;
if( v12 != (_MMPTE *)((char *)MmGetPteBase() + ((a3 >> 9) & 0x7FFFFFFFF8i64)) )
{
MiUnlockPageTableInternal(v6, (UINT64)v12);
v12 = 0i64;
a2a = 0i64;
a3 = (a3 & 0xFFFFFFFFFFFFF000ui64) + 4096;
continue;
}
LABEL_21:
v17 = MI_READ_PTE_LOCK_FREE(a3);
v40 = v17;
v18 = v17;
if( !v17 )
goto LABEL_74;
if( (v17 & 1) == 0 )
{
if( (v17 & 0x400) == 0 )
{
if( (v17 & 0x800) != 0 )
{
v30 = MiLockTransitionLeafPage((_MMPTE *)a3, 0i64);
if( !v30 )
goto LABEL_81;
if( v45 && (unsigned int)MiIsPfnSystemCharged((INT64)v30) )
{
MiDriverPageIsDangling((INT64)v30);
*((_BYTE *)v30 + 35) &= ~0x20u;
}
LOBYTE(v31) = 17;
if( (unsigned int)MiDeleteTransitionPte((_MMPTE *)a3, v30, v31, 1ui64) == 3 )
++a6[1];
++a6[3];
}
else if( (v17 & 0x3E0) != 0 )
{
MiReleasePageFileSpace(v15, v17, 1i64);
*(_QWORD *)a3 = ZeroPte;
++a6[3];
}
goto LABEL_74;
}
if( (v17 & 2) == 0 )
{
if( MI_PROTO_FORMAT_COMBINED(v17) )
{
++a6[3];
if( qword_140C4DC80 )
{
if( (v18 & 0x10) != 0 )
v18 &= ~0x10ui64;
else
v18 &= ~qword_140C4DC80;
}
v29 = **(_MI_PARTITION ***)((((v18 >> 16) - 48) & 0xFFFFFFFFFFFFF000ui64) + 0x10);
if( (unsigned int)MiDecrementCombinedPte(v6, (_MMPTE *)(v18 >> 16)) == 3 && v29 == v15 )
++a6[1];
goto LABEL_62;
}
if( v44 != 1 )
{
if( qword_140C4DC80 )
{
if( (v18 & 0x10) != 0 )
v18 &= ~0x10ui64;
else
v18 &= ~qword_140C4DC80;
}
if( !MiImageProtoChargedCommit(v54, v18 >> 16) )
goto LABEL_62;
}
}
++a6[3];
LABEL_62:
*(_QWORD *)a3 = ZeroPte;
goto LABEL_74;
}
v19 = (__int64)((a3 << 25) - v53) >> 16;
v20 = (char *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v40) >> 12) & 0xFFFFFFFFFi64);
v21 = (_QWORD *)((char *)MmGetPteBase() + ((v19 >> 9) & 0x7FFFFFFFF8i64));
v22 = HIBYTE(*v21) & 0xF;
if( v22 == 9 )
{
MiWriteWsle((INT64)v21, v19, (16 * ((*v21 >> 60) & 7)) | 0xA);
v6 = v48;
MiDeleteValidSystemPage(v48, (MMPTE *)a3, v45 | 0x10u, (INT64)a6);
if( HIDWORD(SpinCount) )
goto LABEL_29;
v40 = 0i64;
MiInitializeTbFlushStamps((UINT64 *)&v40);
*(_QWORD *)a3 = v40;
v23 = v40;
if( qword_140C4DC80 && (v40 & 0x10) == 0 )
v23 = v40 & ~qword_140C4DC80;
if( (v23 & 0xFFFFFFFF00000000ui64) == 0 )
LABEL_29:
MiInsertTbFlushEntry((INT64)&v55, v19, 1i64, 0i64);
LABEL_43:
++*a6;
v15 = (_MI_PARTITION *)v46;
if( v43 == 2 )
MiReturnSystemCharges(v46, 1ui64, 1i64);
goto LABEL_74;
}
v6 = v48;
if( v42 )
MI_WSLE_LOG_ACCESS(v48, a3);
if( !(unsigned int)MiAppendWsleCluster((INT64)v50, v6, (UINT64 *)a3) )
{
a6[1] += MiTerminateWsleCluster((INT64)v50);
MiAppendWsleCluster((INT64)v50, v6, (UINT64 *)a3);
}
LOBYTE(v27) = MI_PFN_IS_PROTO((UNICODE_STRING *)v20, v24, v25, v26);
if( !v27 )
goto LABEL_41;
v28 = *((_QWORD *)v20 + 2);
if( (v28 & 0x400) == 0 || (v18 & 0x200) != 0 )
goto LABEL_41;
if( qword_140C4DC80 && (v28 & 0x10) == 0 )
v28 &= ~qword_140C4DC80;
if( (*(_DWORD *)(*(_QWORD *)(v28 >> 16) + 56i64) & 0x820) == 2080 )
LABEL_41:
++a6[3];
if( v22 == 8 )
goto LABEL_43;
v15 = (_MI_PARTITION *)v46;
LABEL_74:
a3 += 8i64;
if( a3 == v49 || (a3 & 0x78) != 0 )
{
v12 = (_MMPTE *)a2a;
LABEL_81:
v16 = a7;
continue;
}
IsContended = MiWorkingSetIsContended(v6);
v12 = (_MMPTE *)a2a;
if( !IsContended )
{
MiPageTableLockIsContended(v6, a2a, v33, v34, Flag, v38, a7);
if( !v35 && !KeShouldYieldProcessor() )
goto LABEL_81;
}
MiFlushTbList((__int64)&v55);
a6[1] += MiTerminateWsleCluster((INT64)v50);
MiUnlockPageTableInternal(v6, (UINT64)v12);
v16 = a7;
MiUnlockWorkingSetShared(v6, a7);
v12 = 0i64;
a2a = 0i64;
MiLockWorkingSetShared(v6);
}
MiFlushTbList((__int64)&v55);
if( v12 )
{
a6[1] += MiTerminateWsleCluster((INT64)v50);
MiUnlockPageTableInternal(v6, (UINT64)v12);
}
return MiUnlockWorkingSetShared(v6, v16);
}Referenced by:
MiDeleteBootRange
MiFreeInitializationCode
MiMapSystemImageWithLargePage
MiUnloadSystemImage
MmFreePoolMemory
MmReturnChargesToLockPagedPool