MiScrubLargeMappedPage

INT64 __fastcall MiScrubLargeMappedPage(UINT64 *a1, INT64 rdx0, INT64 a3){
  unsigned int v5; 
  unsigned __int64 v6; 
  _MMPTE *PdeBase; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  INT64 v10; 
  _MMPTE *PteBase; 
  __int64 v12; 
  char *v13; 
  INT64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned int v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  _MMPTE *v21; 
  __int64 v22; 
  _MMPFN *PfnDb; 
  unsigned __int64 v24; 
  UINT64 v25; 
  UINT64 v26; 
  INT64 v27; 
  INT64 v28; 
  INT64 v29; 
  int v30; 
  INT64 a5; 
  INT64 a6; 
  CHAR a7[8]; 
  UINT64 v35; 
  int v36; 
  int v37; 
  UINT64 a2; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  unsigned __int64 v41; 
  INT64 v42; 
  INT64 v43; 
  UINT64 *v44; 
  int result; 
  __int16 result_4; 
  int v47; 
  __int64 v48; 
  __int64 v49; 
  v42 = (INT64)a1;
  v44 = a1;
  memset((INT64)&result, 0i64);
  v5 = 1;
  HIDWORD(a5) = 1;
  result = 1;
  result_4 = 0;
  v48 = 0i64;
  v47 = 20;
  v49 = 0i64;
  *(_QWORD *)a7 = 0i64;
  v6 = ((*(unsigned int *)(a3 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a3 + 33) << 32)) << 12) | 0xFFF;
  PdeBase = MmGetPdeBase();
  v8 = (unsigned __int64)PdeBase
     + ((((unsigned __int64)*(unsigned int *)(a3 + 24) >> 6) | ((unsigned __int64)*(unsigned __int8 *)(a3 + 32) << 26)) & 0x3FFFFFF8);
  v39 = v8;
  v9 = (unsigned __int64)PdeBase + ((v6 >> 18) & 0x3FFFFFF8);
  v41 = v9;
  v10 = rdx0 + 1664;
  v43 = v10;
  LOWORD(a5) = (unsigned __int8)MiLockWorkingSetShared(v10);
LABEL_2:
  PteBase = MmGetPteBase();
  while( v8 <= v9 )
  {
    a6 = v8;
    v40 = (_QWORD)PteBase << 25;
    v12 = (((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16 << 25) - ((_QWORD)PteBase << 25)) >> 16;
    a2 = (UINT64)MiLockLowestValidPageTable(v10, (INT64 *)v8, (INT64 **)&a6);
    v13 = (char *)v9;
    if( a6 != v8 )
      v13 = (char *)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64);
    do
    {
      v14 = MI_READ_PTE_LOCK_FREE(a6);
      v15 = v14;
      v35 = v14;
      if( v14 )
        break;
      *(_QWORD *)a7 = 0i64;
      v16 = a6 + 8;
      a6 = v16;
      if( (v16 & 0xFFF) == 0 )
        break;
    }
    while( v16 <= (unsigned __int64)v13 );
    if( !v14 )
    {
      MiUnlockPageTableInternal(v10, a2);
      v8 = (unsigned __int64)MmGetPdeBase() + ((MiGetLeafVa(a6) >> 18) & 0x3FFFFFF8);
      v39 = v8;
      v5 = HIDWORD(a5);
      goto LABEL_2;
    }
    if( (v14 & 1) != 0 && (v14 & 0x80u) != 0i64 )
    {
      MiPteInShadowRange((UINT64)&v35);
      v17 = (v15 >> 12) & 0xFFFFFFFFFi64;
      v18 = 1;
      v19 = 512i64;
      v20 = (__int64)(((__int64)((a6 << 25) - v40) >> 16 << 25) - v40) >> 16;
      v21 = MmGetPteBase();
      while( v20 >= (unsigned __int64)v21 && v20 <= (unsigned __int64)MmGetPteLimit() )
      {
        v20 = (__int64)((v20 << 25) - v40) >> 16;
        v19 <<= 9;
        ++v18;
      }
      MiRewritePteWithLockBit(v10, (volatile INT64 *)a6, ZeroPte);
      v35 &= 0xCFFFFFFFFFFFFFFFui64;
      MiInsertTbFlushEntry((INT64)&result, v12, 1i64, v18);
      MiFlushTbList((__int64)&result);
      v22 = *(_QWORD *)a7 & -(__int64)(*(_QWORD *)a7 < v19);
      *(_QWORD *)a7 = v22;
      v37 = 0;
      PfnDb = MmGetPfnDb();
      v24 = (unsigned __int64)PfnDb + 48 * v17 + 48 * v19;
      v40 = v24;
      v25 = (UINT64)PfnDb + 48 * v22 + 48 * v17;
      v26 = a2;
      while( v25 < v24 )
      {
        *(_QWORD *)a7 = ++v22;
        if( *(_WORD *)(v25 + 32) == 2 )
        {
          v27 = v42;
          if( (int)MiScrubPage((UINT64 *)v42, v25, 0i64, 1) < 0 )
            MiMakePageBad(v25, 1);
          if( MiWorkingSetIsContended(v10)
            || (MiPageTableLockIsContended(v10, v26, v28, v29, a5, a6, a7[0]), v30)
            || KeShouldYieldProcessor() )
          {
            v37 = 1;
            break;
          }
          if( MiScrubInterrupted(v27) )
          {
            BYTE1(a5) = 1;
            break;
          }
          v24 = v40;
          v22 = *(_QWORD *)a7;
        }
        v25 += 48i64;
      }
      v35 |= 0x20ui64;
      v36 = 0;
      *(_QWORD *)a6 = v35;
      if( v36 )
        MiWritePteShadow();
      MiUnlockPageTableInternal(v10, a2);
      if( v25 == v40 )
      {
        v8 += 8 * (v19 >> 9);
        v39 = v8;
        *(_QWORD *)a7 = 0i64;
      }
      if( BYTE1(a5) == 1 )
      {
        v5 = 0;
        break;
      }
      v9 = v41;
      v5 = HIDWORD(a5);
      PteBase = MmGetPteBase();
      if( v37 )
      {
        MiUnlockWorkingSetShared(v10, a5);
        MiLockWorkingSetShared(v10);
        goto LABEL_2;
      }
    }
    else
    {
      MiUnlockPageTableInternal(v10, a2);
      MiUnlockWorkingSetShared(v10, a5);
      v5 = HIDWORD(a5);
      PteBase = MmGetPteBase();
      MiLockWorkingSetShared(v10);
    }
  }
  MiUnlockWorkingSetShared(v10, a5);
  return v5;
}

Referenced by:

MiScrubProcessLargePages