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