MiScrubAwePage

INT64 __fastcall MiScrubAwePage(UINT64 *a1, INT64 a2, _DWORD *a3){
  char *v4; 
  unsigned __int64 v5; 
  __int64 v7; 
  _MMPTE *PteBase; 
  INT64 v9; 
  __int64 v10; 
  UINT8 v11; 
  INT64 v12; 
  unsigned int v13; 
  UINT64 v14; 
  UINT8 v15; 
  v4 = (char *)MmGetPfnDb() + 48 * a2;
  v5 = *((_QWORD *)v4 + 1);
  if( !v5 )
    return MiScrubPage(a1, (INT64)v4, 0i64, 1);
  v7 = *((_QWORD *)KeGetCurrentThread() + 23);
  if( (*a3 & 1) == 0 )
    return 0i64;
  if( (*((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 1 )
    return MiScrubPage(a1, (INT64)v4, 0i64, 1);
  PteBase = MmGetPteBase();
  v9 = v7 + 1664;
  v10 = (__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16;
  v11 = MiLockWorkingSetShared(v9);
  v15 = v11;
  if( *((_WORD *)v4 + 16) == 2 )
  {
    v14 = (UINT64)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal(v9, v14, 0i64);
    v12 = MI_READ_PTE_LOCK_FREE(v5);
    if( (v12 & 1) != 0 )
    {
      *(_QWORD *)v5 = ZeroPte;
      KeFlushSingleTb(v10, 1i64, 0i64);
    }
    v13 = MiScrubPage(a1, (INT64)v4, 0i64, 1);
    if( (v12 & 1) != 0 )
      *(_QWORD *)v5 = v12 | 0x20;
    MiUnlockPageTableInternal(v9, v14);
    v11 = v15;
  }
  else
  {
    v13 = 0;
  }
  MiUnlockWorkingSetShared(v9, v11);
  return v13;
}

Referenced by:

MiScrubProcessPhysicalPages