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