VmpProcessAccessedBatch

UINT64 __fastcall VmpProcessAccessedBatch(INT64 a1, INT64 a2, UINT64 a3, UINT64 *a4, INT64 arg20){
  INT64 v6; 
  unsigned int v7; 
  INT64 v10; 
  int SparseGpaPagesAccessState; 
  int v12; 
  UINT64 result; 
  INT64 *i; 
  UINT64 v15; 
  INT64 a5; 
  INT64 a6[4]; 
  a5 = 0i64;
  v6 = *(_QWORD *)(a1 + 72);
  v7 = a3;
  while( 1 )
  {
    v10 = 0i64;
    if( v6 == -1 )
    {
      v12 = -1073741823;
      a5 = 0i64;
    }
    else
    {
      if( (_DWORD)arg20 && (*(_BYTE *)(a1 + 88) & 1) == 0 )
        v10 = 1i64;
      SparseGpaPagesAccessState = HvlGetSparseGpaPagesAccessState(v6, v10, v7, a2, &a5, (INT64)a6);
      v10 = a5;
      v12 = SparseGpaPagesAccessState;
    }
    result = (UINT64)a6;
    for( i = a6; i < (INT64 *)((char *)a6 + v10); ++a4 )
    {
      v15 = *a4;
      if( (*(_BYTE *)i & 1) != 0 )
        v15 |= 1ui64;
      i = (INT64 *)((char *)i + 1);
      *a4 = v15 & 0xFFFFFFFFFFFFFFF9ui64 | 4;
    }
    a2 += 8 * v10;
    v7 -= v10;
    if( !v7 )
      break;
    if( v12 < 0 )
    {
      result = *a4;
      if( (*a4 & 4) == 0 )
      {
        result |= 6ui64;
        *a4 = result;
      }
      a2 += 8i64;
      ++a4;
      if( !--v7 )
        break;
    }
  }
  return result;
}

Referenced by:

VmpQueryAccessedState