MiDecrementAndInsertStandbyPages
VOID __fastcall MiDecrementAndInsertStandbyPages(_MMPFN **LockedPfns, UINT64 StandbyCount, UINT64 PageIrql){
unsigned __int64 v3;
_MMPFN **v4;
unsigned __int64 v5;
_MMPFN *PfnDb;
_MMPFN *v7;
char v8;
unsigned __int64 v9;
unsigned __int64 v10;
__int64 v11;
int v12;
__int64 v13;
int v14;
UINT64 ValidPte;
struct _KPRCB *CurrentPrcb;
UINT64 v17;
__int64 v18;
unsigned __int64 UltraMapping;
UINT64 *v20;
__int64 v21;
UINT64 v22;
unsigned int v23;
unsigned __int64 TransitionPte;
UINT64 *v25;
unsigned int LockCount;
unsigned __int8 v28;
v28 = PageIrql;
LockCount = StandbyCount;
v3 = 0i64;
v4 = LockedPfns;
v5 = 0i64;
if( (_DWORD)StandbyCount )
{
MiPteInShadowRange((UINT64)&TransitionPte);
PfnDb = MmGetPfnDb();
do
{
v7 = v4[v5];
TransitionPte = v3;
v8 = *((_BYTE *)v7 + 34);
*((_QWORD *)v7 + 3) &= 0xC000000000000000ui64;
*((_WORD *)v7 + 16) = v3;
*((_BYTE *)v7 + 34) = v8 & 0xF8 | 2;
v25 = (UINT64 *)((char *)v7 + 16);
v9 = MI_READ_PTE_LOCK_FREE((INT64)v7 + 16);
v10 = *((_QWORD *)v7 + 1);
v11 = *((_QWORD *)v7 + 5) & 0xFFFFFFFFFi64;
v12 = 4;
v13 = (v9 >> 5) & 0x1F;
v14 = *((unsigned __int8 *)PfnDb + 48 * v11 + 34) >> 6;
if( !v14 || v14 == 3 )
{
v12 = 12;
}
else if( v14 == 2 )
{
v12 = 28;
}
ValidPte = MiMakeValidPte(0i64, v11, v12 | 0xA0000000);
CurrentPrcb = KeGetCurrentPrcb();
v17 = ValidPte;
v18 = *((_QWORD *)CurrentPrcb + 4095);
if( !v18
|| (UltraMapping = MiGetUltraMapping((unsigned __int64 *)(v18 + 12448), 3u, 1i64, 0),
v20 = (UINT64 *)((char *)MmGetPteBase() + ((UltraMapping >> 9) & 0x7FFFFFFFF8i64)),
*(_QWORD *)(v18 + 12344) = v20,
!UltraMapping) )
{
UltraMapping = (*((_QWORD *)CurrentPrcb + 4160) & 0xFFFFFFFFFFFFF000ui64)
+ ((*((_QWORD *)CurrentPrcb + 4160) & 0xFFFi64) << 12);
v20 = (UINT64 *)((char *)MmGetPteBase() + ((UltraMapping >> 9) & 0x7FFFFFFFF8i64));
}
*v20 = v17;
v21 = (v10 >> 3) & 0x1FF;
TransitionPte = MI_READ_PTE_LOCK_FREE(UltraMapping + 8i64 * (unsigned int)v21);
TransitionPte = MiMakeTransitionPte((TransitionPte >> 12) & 0xFFFFFFFFFi64, (unsigned int)v13, v22);
*(_QWORD *)(UltraMapping + 8i64 * (unsigned int)v21) = TransitionPte;
MiUnmapPageInHyperSpaceWorker((PVOID)(UltraMapping + 8i64 * (unsigned int)v21), 0x11u, 0x80000000ui64);
MiSetNonResidentPteHeat(v25, 0i64);
++v5;
v4 = LockedPfns;
PfnDb = MmGetPfnDb();
v3 = v23;
}
while( v5 < LockCount );
}
MiInsertAndUnlockStandbyPages(0i64, v4, (UINT8 *)LockCount, v28);
}Referenced by:
MmUnmapViewInSystemCache