VmpProcessAccessedBatch

UINT64 __stdcall VmpProcessAccessedBatch(INT64 a1, INT64 a2, UINT64 a3, UINT64 *a4, INT64 a5){
  __int64 v6; 
  unsigned int v7; 
  __int64 v10; 
  int SparseGpaPagesAccessState; 
  int v12; 
  UINT64 result; 
  char *i; 
  UINT64 v15; 
  __int64 v16; 
  char v17[32]; 

  v16 = 0i64;
  v6 = *(_QWORD *)(a1 + 72);
  v7 = a3;
  while( 1 )
  {
    v10 = 0i64;
    if( v6 == -1 )
    {
      v12 = -1073741823;
      v16 = 0i64;
    }
    else
    {
      if( (_DWORD)a5 && (*(_BYTE *)(a1 + 88) & 1) == 0 )
        v10 = 1i64;
      SparseGpaPagesAccessState = HvlGetSparseGpaPagesAccessState(v6, v10, v7, a2, &v16, (__int64)v17);
      v10 = v16;
      v12 = SparseGpaPagesAccessState;
    }
    result = (UINT64)v17;
    for( i = v17; i < &v17[v10]; ++a4 )
    {
      v15 = *a4;
      if( (*i & 1) != 0 )
        v15 |= 1ui64;
      ++i;
      *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