MiScrubLargeMappedPage

NTSTATUS __stdcall MiScrubLargeMappedPage(
        _MMVAD *Vad,
        _MISCRUB_PACKET *ScrubPacket,
        _EPROCESS *Process,
        _KEVENT *StopEvent){
  NTSTATUS v6; 
  unsigned __int64 v7; 
  _MMPTE *PdeBase; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  _MMSUPPORT_INSTANCE *v11; 
  UINT64 v12; 
  char v13; 
  _MMPTE *PteBase; 
  __int64 v15; 
  char *v16; 
  UINT64 v17; 
  UINT64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  _MMPTE *v25; 
  __int64 v26; 
  _MMPFN *PfnDb; 
  unsigned __int64 v28; 
  _MMPFN *v29; 
  UINT64 v30; 
  VOID *v31; 
  UINT8 v32; 
  int v33; 
  int v34; 
  UINT64 v35; 
  unsigned __int64 v36; 
  int v37; 
  UINT64 v39; 
  char WsIrql; 
  char WsIrql_1; 
  INT64 v42; 
  unsigned __int64 v43; 
  UINT64 v44; 
  int v45; 
  int v46; 
  UINT64 v47; 
  unsigned __int64 v48; 
  _MMPFN *v49; 
  unsigned __int64 v50; 
  VOID *OpaqueParameter; 
  _MMSUPPORT_INSTANCE *v52; 
  _MMVAD *v53; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 

  OpaqueParameter = Vad;
  v53 = Vad;
  memset(TbFlushList, 0i64, 0xB8u);
  v6 = 1;
  TbFlushList[0] = 1;
  LOWORD(TbFlushList[1]) = 0;
  *(_QWORD *)&TbFlushList[4] = 0i64;
  TbFlushList[2] = 20;
  *(_QWORD *)&TbFlushList[6] = 0i64;
  WsIrql_1 = 0;
  v43 = 0i64;
  v7 = ((HIDWORD(Process->Pcb.ProfileListHead.Flink) | ((unsigned __int64)BYTE1(Process->Pcb.ProfileListHead.Blink) << 32)) << 12) | 0xFFF;
  PdeBase = MmGetPdeBase();
  v9 = (unsigned __int64)PdeBase
     + ((((unsigned __int64)LODWORD(Process->Pcb.ProfileListHead.Flink) >> 6) | ((unsigned __int64)LOBYTE(Process->Pcb.ProfileListHead.Blink) << 26)) & 0x3FFFFFF8);
  v48 = v9;
  v10 = (unsigned __int64)PdeBase + ((v7 >> 18) & 0x3FFFFFF8);
  v50 = v10;
  v11 = (_MMSUPPORT_INSTANCE *)(ScrubPacket + 416);
  v52 = v11;
  MiLockWorkingSetShared();
  WsIrql = v13;
LABEL_2:
  PteBase = MmGetPteBase();
  while( v9 <= v10 )
  {
    v42 = v9;
    v49 = (_MMPFN *)((_QWORD)PteBase << 25);
    v15 = (((__int64)((v9 << 25) - ((_QWORD)PteBase << 25)) >> 16 << 25) - ((_QWORD)PteBase << 25)) >> 16;
    v47 = (UINT64)MiLockLowestValidPageTable((INT64)v11, (INT64 *)v9, (INT64 **)&v42);
    v16 = (char *)v10;
    if( v42 != v9 )
      v16 = (char *)PteBase + ((v10 >> 9) & 0x7FFFFFFFF8i64);
    do
    {
      LODWORD(v17) = MI_READ_PTE_LOCK_FREE(v42);
      v18 = v17;
      v44 = v17;
      if( v17 )
        break;
      v43 = 0i64;
      v19 = v42 + 8;
      v42 = v19;
      if( (v19 & 0xFFF) == 0 )
        break;
    }
    while( v19 <= (unsigned __int64)v16 );
    if( !v17 )
    {
      MiUnlockPageTableInternal((INT64)v11, v47);
      LODWORD(v20) = MiGetLeafVa(v42);
      v9 = (unsigned __int64)MmGetPdeBase() + ((v20 >> 18) & 0x3FFFFFF8);
      v48 = v9;
      v6 = 1;
      goto LABEL_2;
    }
    if( (v17 & 1) != 0 && (v17 & 0x80u) != 0i64 )
    {
      MiPteInShadowRange((UINT64)&v44);
      v21 = (v18 >> 12) & 0xFFFFFFFFFi64;
      v22 = 1;
      v23 = 512i64;
      v24 = ((((v42 << 25) - (__int64)v49) >> 16 << 25) - (__int64)v49) >> 16;
      v25 = MmGetPteBase();
      while( v24 >= (unsigned __int64)v25 && v24 <= (unsigned __int64)MmGetPteLimit() )
      {
        v24 = (__int64)((v24 << 25) - (_QWORD)v49) >> 16;
        v23 <<= 9;
        ++v22;
      }
      MiRewritePteWithLockBit((INT64)v11, (INT64 *)v42, ZeroPte.u.Hard._bf_0);
      v44 &= 0xCFFFFFFFFFFFFFFFui64;
      MiInsertTbFlushEntry(TbFlushList, (VOID *)v15, 1ui64, v22);
      MiFlushTbList(TbFlushList);
      v26 = v43 & -(__int64)(v43 < v23);
      v43 = v26;
      v46 = 0;
      PfnDb = MmGetPfnDb();
      v28 = (unsigned __int64)&PfnDb[v21 + v23];
      v49 = (_MMPFN *)v28;
      v29 = &PfnDb[v26 + v21];
      v30 = v47;
      while( (unsigned __int64)v29 < v28 )
      {
        v43 = ++v26;
        if( v29->u3.ReferenceCount == 2 )
        {
          v31 = OpaqueParameter;
          if( MiScrubPage(OpaqueParameter, v29, 0i64, (VOID *)1) < 0 )
            MiMakePageBad(v29, 1ui64, v32);
          LOBYTE(v33) = MiWorkingSetIsContended((INT64)v11);
          if( v33
            || (unsigned int)MiPageTableLockIsContended((__int64)v11, v30)
            || (unsigned int)KeShouldYieldProcessor() )
          {
            v46 = 1;
            break;
          }
          LOBYTE(v34) = MiScrubInterrupted((INT64)v31);
          if( v34 )
          {
            WsIrql_1 = 1;
            break;
          }
          v28 = (unsigned __int64)v49;
          v26 = v43;
        }
        ++v29;
      }
      v35 = v44 | 0x20;
      v44 = v35;
      v45 = 0;
      v36 = v35;
      LOBYTE(v37) = MiPteInShadowRange(v42);
      if( v37 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v35 & 1) != 0 )
        v36 = v35 | 0x8000000000000000ui64;
      *(_QWORD *)v42 = v36;
      if( v45 )
        MiWritePteShadow();
      MiUnlockPageTableInternal((INT64)v11, v47);
      if( v29 == v49 )
      {
        v9 += 8 * (v23 >> 9);
        v48 = v9;
        v43 = 0i64;
      }
      if( WsIrql_1 == 1 )
      {
        v6 = 0;
        break;
      }
      v10 = v50;
      v6 = 1;
      PteBase = MmGetPteBase();
      if( v46 )
      {
        LOBYTE(v12) = WsIrql;
        MiUnlockWorkingSetShared(v11, v12);
        MiLockWorkingSetShared();
        goto LABEL_2;
      }
    }
    else
    {
      MiUnlockPageTableInternal((INT64)v11, v47);
      LOBYTE(v39) = WsIrql;
      MiUnlockWorkingSetShared(v11, v39);
      v6 = 1;
      PteBase = MmGetPteBase();
      MiLockWorkingSetShared();
    }
  }
  LOBYTE(v12) = WsIrql;
  MiUnlockWorkingSetShared(v11, v12);
  return v6;
}

Referenced by:

MiScrubProcessLargePages