MiTrimWorkingSetBuildup

void __fastcall MiTrimWorkingSetBuildup(__int64 a1, __int64 a2){
  int v2; 
  __int64 v4; 
  __int64 v5; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  int v10; 
  char *v11; 
  unsigned int v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  char *v16; 
  __int64 i; 
  unsigned __int64 v18; 
  unsigned int v19; 
  unsigned int v20; 
  _DWORD *v21; 
  unsigned int v22; 
  _DWORD *v23; 
  __int64 v24; 
  int v25; 
  __int64 v26; 
  unsigned int j; 
  unsigned int v28; 
  _DWORD *v29; 
  unsigned int SizeOfBitMap; 
  struct _RTL_BITMAP BitMapHeader; 
  INT64 v32; 
  v2 = 0;
  v32 = *(_QWORD *)(a1 + 24);
  BitMapHeader = 0i64;
  while( v2 != 2 )
  {
    v4 = 80i64 * v2;
    v5 = v4 + a2 + 248;
    if( !*(_BYTE *)(v5 + 72) )
      goto LABEL_4;
    v6 = 0;
    v7 = (_QWORD)MmGetPteBase() << 25;
    v8 = v7 + ((*(_QWORD *)(v5 + 64) & 0xFFFFFFFFFFFFF000ui64) << 16);
    BitMapHeader.SizeOfBitMap = 512;
    BitMapHeader.Buffer = (unsigned int *)(v4 + a2 + 248);
    v9 = (__int64)((v8 & 0xFFFFFFE000000000ui64) - v7) >> 16;
    v10 = (((_BYTE)v4 + (_BYTE)a2 - 8) & 4) != 0i64 ? 0x20 : 0;
    v11 = (char *)BitMapHeader.Buffer - ((((_BYTE)v4 + (_BYTE)a2 - 8) & 4) != 0i64 ? 4 : 0);
    while( 1 )
    {
      v12 = v6 < BitMapHeader.SizeOfBitMap ? v6 : 0;
      v13 = BitMapHeader.SizeOfBitMap - 1;
      while( 1 )
      {
        v14 = v13 + v10;
        v15 = v12 + v10;
        if( v13 - v12 == -1 )
          goto LABEL_41;
        v16 = &v11[8 * ((unsigned __int64)v15 >> 6)];
        for( i = ~*(_QWORD *)v16 | ((1i64 << (v15 & 0x3F)) - 1); i == -1; i = ~*(_QWORD *)v16 )
        {
          v16 += 8;
          if( v16 > &v11[8 * ((unsigned __int64)v14 >> 6)] )
            goto LABEL_41;
        }
        _BitScanForward64(&v18, ~i);
        v19 = v18 + ((unsigned int)((v16 - v11) >> 3) << 6);
        if( v19 > v14 )
        {
LABEL_41:
          v19 = -1;
        }
        else if( v19 != -1 )
        {
          break;
        }
        if( !v12 )
          break;
        SizeOfBitMap = v6 + 1;
        if( v6 + 1 > BitMapHeader.SizeOfBitMap )
          SizeOfBitMap = BitMapHeader.SizeOfBitMap;
        v13 = SizeOfBitMap - 1;
        v12 = 0;
      }
      v20 = v19 - v10;
      if( v19 == -1 )
        v20 = -1;
      if( v20 < v6 || v20 == -1 )
        break;
      if( v20 < 0x200 )
      {
        v21 = (_DWORD *)(v5 + 60);
        v22 = v20;
        v23 = (_DWORD *)(v5 + 4 * ((unsigned __int64)v20 >> 5));
        if( v23 != (_DWORD *)(v5 + 60) )
        {
          v24 = v20 & 0x1F;
          if( (*v23 | *((_DWORD *)qword_140011CE0 + v24)) == -1 )
          {
            v22 = v20 - v24 + 32;
            for( ++v23; v23 < v21 && *v23 == -1; ++v23 )
              v22 += 32;
          }
        }
        while( v22 < 0x200 && _bittest((const signed __int32 *)v5, v22) )
          ++v22;
        v25 = 0;
        if( v23 == v21 )
          goto LABEL_32;
        v26 = v22 & 0x1F;
        if( (*v23 & ~*((_DWORD *)qword_140011CE0 + v26)) != 0 )
          goto LABEL_32;
        v25 = 32 - v26;
        if( (_DWORD)v26 != 33 )
        {
          v29 = v23 + 1;
          while( v29 < v21 && !*v29 )
          {
            ++v29;
            v25 += 32;
            if( v25 == -1 )
              goto LABEL_37;
          }
LABEL_32:
          for( j = v25 + v22; j < 0x200 && !_bittest((const signed __int32 *)v5, j) && v25 != -1; ++j )
            ++v25;
        }
LABEL_37:
        if( v25 )
          goto LABEL_38;
        goto LABEL_49;
      }
      v25 = 0;
LABEL_49:
      v22 = 512;
LABEL_38:
      v28 = v22 - v20;
      MiSetVaAgeList(v32, v9 + (v20 << 12), (UINT8 *)v28, v2 != 0 ? 6 : 0);
      RtlClearBits(&BitMapHeader, v20, v28);
      v6 = v20 + v25 + v28;
      if( v25 )
      {
        v11 = (char *)(v5 - ((v5 & 4) != 0 ? 4 : 0));
        if( v6 != 512 )
          continue;
      }
      break;
    }
    *(_BYTE *)(v5 + 72) = 0;
LABEL_4:
    ++v2;
  }
  if( *(_DWORD *)(a2 + 68) )
    *(_QWORD *)(a2 + 16) -= MiFreeWsleList(v32, a2 + 56, BYTE1(*(_DWORD *)a2) & 1);
}

Referenced by:

MiTrimPte
MiTrimPteWorker
MiTrimWorkingSetTail