HvlMapGpaPages

NTSTATUS __stdcall HvlMapGpaPages(
        UINT64 PartitionId,
        UINT64 GpaPageStart,
        UINT64 MapFlags,
        UINT64 PageCount,
        UINT64 *SpaPageArray,
        UINT64 *PageCountProcessed){
  NTSTATUS v6; 
  UINT64 v7; 
  int v8; 
  LONGLONG *v10; 
  UINT64 v11; 
  int v12; 
  int v13; 
  __int16 v14; 
  UINT16 v15; 
  UINT16 v16; 
  __int128 v18[5]; 
  v6 = 0;
  v7 = PageCount;
  v8 = MapFlags;
  *PageCountProcessed = 0i64;
  memset(v18, 0, 32);
  v10 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v18, 1, 0i64, 0i64);
  v10[1] = 0i64;
  *((_DWORD *)v10 + 5) = 0;
  v11 = *PageCountProcessed;
  *((_DWORD *)v10 + 4) = v8;
  v12 = v8 & 0x700;
  *v10 = PartitionId;
  v13 = 0;
  do
  {
    if( v7 >= 0x1FD )
      v7 = 509i64;
    if( !v12 )
      memmove((UINT8 *)v10 + 24, (UINT8 *)&SpaPageArray[v11], 8 * v7);
    v10[1] = v11 + GpaPageStart;
    v13 ^= ((unsigned __int16)v13 ^ (unsigned __int16)v7) & 0xFFF;
    HvcallInitiateHypercall();
    v16 = v15;
    if( v15 )
      break;
    v11 = *PageCountProcessed + (v14 & 0xFFF);
    *PageCountProcessed = v11;
    v7 = PageCount - v11;
  }
  while( PageCount != v11 );
  HvlpReleaseHypercallPage((unsigned int *)v18);
  if( v16 )
    return HvlpHvToNtStatus(v16);
  return v6;
}

Referenced by:

VmpFillSlat
VmpFlushTbVaRange