MiDecrementAndInsertStandbyPages
VOID __stdcall MiDecrementAndInsertStandbyPages(ULONG_PTR *LockedPfns, UINT64 StandbyCount, UINT8 PageIrql){
__int64 v3;
ULONG_PTR *v4;
unsigned __int64 v5;
_MMPFN *PfnDb;
__int64 v7;
char v8;
unsigned __int64 v9;
unsigned __int64 v10;
__int64 v11;
int v12;
__int64 v13;
int v14;
__int64 v15;
struct _KPRCB *CurrentPrcb;
__int64 v17;
_MI_ZERO_THREAD_CONTEXT *MmInternal;
unsigned __int64 v19;
unsigned __int64 v20;
char *v21;
int v22;
__int64 v23;
unsigned __int64 v24;
__int64 v25;
char v26;
__int64 v27;
int v28;
unsigned int v29;
unsigned __int64 v30;
UINT64 *v31;
unsigned int LockCount;
LockCount = StandbyCount;
v3 = 0i64;
v4 = LockedPfns;
v5 = 0i64;
if( (_DWORD)StandbyCount )
{
MiPteInShadowRange((UINT64)&v30);
PfnDb = MmGetPfnDb();
do
{
v7 = *(_QWORD *)&v4[2 * v5];
v30 = v3;
v8 = *(_BYTE *)(v7 + 34);
*(_QWORD *)(v7 + 24) &= 0xC000000000000000ui64;
*(_WORD *)(v7 + 32) = v3;
*(_BYTE *)(v7 + 34) = v8 & 0xF8 | 2;
v31 = (UINT64 *)(v7 + 16);
LODWORD(v9) = MI_READ_PTE_LOCK_FREE(v7 + 16);
v10 = *(_QWORD *)(v7 + 8);
v11 = *(_QWORD *)(v7 + 40) & 0xFFFFFFFFFi64;
v12 = 4;
v13 = (v9 >> 5) & 0x1F;
v14 = *((unsigned __int8 *)&PfnDb[v11].u3 + 2) >> 6;
if( !v14 || v14 == 3 )
{
v12 = 12;
}
else if( v14 == 2 )
{
v12 = 28;
}
LODWORD(v15) = MiMakeValidPte(0i64, v11, v12 | 0xA0000000);
CurrentPrcb = KeGetCurrentPrcb();
v17 = v15;
MmInternal = (_MI_ZERO_THREAD_CONTEXT *)CurrentPrcb->MmInternal;
if( !MmInternal
|| (MiGetUltraMapping(MmInternal + 3112, 3i64),
v20 = v19,
v21 = (char *)MmGetPteBase() + ((v19 >> 9) & 0x7FFFFFFFF8i64),
*((_QWORD *)MmInternal + 1543) = v21,
!v19) )
{
v20 = ((unsigned __int64)CurrentPrcb->HyperPte & 0xFFFFFFFFFFFFF000ui64)
+ (((__int64)CurrentPrcb->HyperPte & 0xFFF) << 12);
v21 = (char *)MmGetPteBase() + ((v20 >> 9) & 0x7FFFFFFFF8i64);
}
LOBYTE(v22) = MiPteInShadowRange((UINT64)v21);
if( v22 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
v17 |= 0x8000000000000000ui64;
*(_QWORD *)v21 = v17;
v23 = (v10 >> 3) & 0x1FF;
LODWORD(v24) = MI_READ_PTE_LOCK_FREE(v20 + 8i64 * (unsigned int)v23);
v30 = v24;
LODWORD(v25) = MiMakeTransitionPte((v24 >> 12) & 0xFFFFFFFFFi64, v13);
v30 = v25;
v26 = v25;
v27 = v25;
LOBYTE(v28) = MiPteInShadowRange(v20 + 8i64 * (unsigned int)v23);
if( v28 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v26 & 1) != 0 )
v27 |= 0x8000000000000000ui64;
*(_QWORD *)(v20 + 8i64 * (unsigned int)v23) = v27;
MiUnmapPageInHyperSpaceWorker((VOID *)(v20 + 8i64 * (unsigned int)v23), 0x11u, 0x80000000ui64);
MiSetNonResidentPteHeat(v31, 0i64);
++v5;
v4 = LockedPfns;
PfnDb = MmGetPfnDb();
v3 = v29;
}
while( v5 < LockCount );
}
MiInsertAndUnlockStandbyPages(0i64, (PVOID *)v4, (UINT8 *)LockCount, PageIrql);
}Referenced by:
MmUnmapViewInSystemCache