MiScrubProcessLargePages

VOID __fastcall MiScrubProcessLargePages(UINT64 *a1){
  _ETHREAD *CurrentThread; 
  __int64 v2; 
  int v3; 
  _QWORD *v4; 
  _QWORD *v5; 
  _QWORD *v6; 
  _QWORD *i; 
  unsigned int v8; 
  _QWORD **v9; 
  INT64 v10; 
  _QWORD *v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  __int64 v14; 
  int v15; 
  _DWORD **v16; 
  unsigned int j; 
  _DWORD *v18; 
  _QWORD *v20; 
  _QWORD *v21; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = *((_QWORD *)CurrentThread + 23);
  --*((_WORD *)CurrentThread + 242);
  --*((_WORD *)CurrentThread + 243);
  ExAcquirePushLockSharedEx(v2 + 1224, 0i64);
  *((_BYTE *)CurrentThread + 1304) |= 2u;
  if( (*(_DWORD *)(v2 + 1124) & 0x20) != 0 )
  {
    UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, v2);
  }
  else
  {
    v3 = *(_DWORD *)(v2 + 2140);
    v4 = 0i64;
    v20 = 0i64;
    v5 = 0i64;
    v6 = *(_QWORD **)(v2 + 2008);
    i = 0i64;
    v8 = 13;
    while( v6 )
    {
      i = v6;
      v6 = (_QWORD *)*v6;
    }
    while( v3 && i )
    {
      v9 = (_QWORD **)i[1];
      v10 = (INT64)i;
      v11 = i;
      if( v9 )
      {
        v12 = *v9;
        for( i = (_QWORD *)i[1]; v12; v12 = (_QWORD *)*v12 )
          i = v12;
      }
      else
      {
        while( 1 )
        {
          i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
          if( !i || (_QWORD *)*i == v11 )
            break;
          v11 = i;
        }
      }
      if( MiIsVadLargePrivate(v10) && (*(_DWORD *)(v10 + 48) & 0x500000) != 5242880 )
      {
        --*((_WORD *)CurrentThread + 243);
        ExAcquirePushLockSharedEx(v10 + 40, 0i64);
        *((_BYTE *)CurrentThread + 1305) |= 0x40u;
        if( (*(_DWORD *)(v10 + 48) & 4) != 0 )
        {
          MiUnlockVadShared((INT64)CurrentThread, v10);
        }
        else
        {
          if( v8 >= 0xD )
          {
            LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
            v4 = v13;
            if( !v13 )
            {
              MiUnlockVadShared((INT64)CurrentThread, v10);
              break;
            }
            v8 = 0;
            if( v5 )
              *v20 = v13;
            else
              v5 = v13;
            v20 = v13;
          }
          v14 = v8++;
          v4[v14 + 1] = v10;
          if( !_InterlockedIncrement((volatile signed __int32 *)(v10 + 36)) )
            __fastfail(0xEu);
          MiUnlockVadShared((INT64)CurrentThread, v10);
          --v3;
        }
      }
    }
    UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, v2);
    v15 = 1;
    if( v5 )
    {
      do
      {
        v16 = (_DWORD **)(v5 + 1);
        v21 = (_QWORD *)*v5;
        for( j = 0; j < 0xD; ++j )
        {
          v18 = *v16;
          if( !*v16 )
            break;
          --*((_WORD *)CurrentThread + 243);
          ExAcquirePushLockExclusiveEx((UINT64)(v18 + 10), 0i64);
          *((_BYTE *)CurrentThread + 1304) |= 0x80u;
          if( (v18[12] & 4) == 0 && v15 == 1 )
            v15 = MiScrubLargeMappedPage(a1, v2, (INT64)v18);
          MiUnlockAndDereferenceVad(v18);
          ++v16;
        }
        ExFreePoolWithTag(v5, 0);
        v5 = v21;
      }
      while( v21 );
    }
  }
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
}

Referenced by:

MiScrubProcesses