HvlDmaMapDeviceSparsePages
INT64 __fastcall HvlDmaMapDeviceSparsePages(INT64 rcx0, INT64 a2, UINT64 *a3){
unsigned int *v3;
unsigned int *v4;
UINT64 *v5;
int v6;
unsigned __int64 v9;
unsigned int v10;
__int64 v11;
int v12;
int v13;
__int64 *v14;
unsigned int v15;
char v16;
int v17;
UINT64 *v18;
_QWORD *v19;
__int64 v20;
__int64 v21;
INT64 v22;
INT16 v23;
__int16 v24;
INT16 v25;
__int64 v26;
UINT16 v27;
NTSTATUS v28;
UINT64 a5;
INT64 a1;
__int16 v31;
__int128 v33[2];
__int64 v34[14];
v4 = v3;
v5 = a3;
v6 = a2;
memset(v33, 0, sizeof(v33));
if( *(_BYTE *)(rcx0 + 4) )
return 3221225659i64;
v9 = *(_QWORD *)v3;
v10 = 0;
v11 = 0i64;
if( *(_QWORD *)v3 )
{
v12 = 0;
v13 = 199;
do
{
if( v9 <= 5 )
{
v14 = v34;
if( v9 >= 5 )
v15 = 5;
else
v15 = *v4;
v16 = 1;
v13 |= 0x10000u;
}
else
{
v14 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v33, 1, 0i64, 0i64);
if( *(_QWORD *)v4 >= 0xFEui64 )
v15 = 254;
else
v15 = *v4;
v5 = a3;
v16 = 0;
v13 &= ~0x10000u;
}
LODWORD(a1) = v13;
v14[1] = 0i64;
v14[2] = 0i64;
v14[3] = 0i64;
*v14 = -1i64;
*((_DWORD *)v14 + 4) &= 0xFFFFFFF0;
*((_DWORD *)v14 + 5) = *(_DWORD *)rcx0;
v17 = 1024;
if( v6 )
v17 = v6;
*((_BYTE *)v14 + 24) = 0;
*((_DWORD *)v14 + 7) = v17;
if( v15 )
{
v18 = &v5[v11];
v19 = v14 + 5;
v20 = v15;
do
{
*(v19 - 1) = *v18 << 12;
v21 = *v18++;
*v19 = v21;
v19 += 2;
--v20;
}
while( v20 );
}
v12 ^= ((unsigned __int16)v15 ^ (unsigned __int16)v12) & 0xFFF;
HIDWORD(a1) = v12;
if( v16 )
{
LODWORD(a5) = 0;
v22 = HvcallFastExtended(a1, v34, 16 * (v15 + 2), 0i64, a5);
v23 = v22;
v31 = WORD2(v22);
}
else
{
HvcallInitiateHypercall();
v31 = v24;
v23 = v25;
HvlpReleaseHypercallPage((unsigned int *)v33);
}
v26 = v31 & 0xFFF;
*(_QWORD *)v4 -= v26;
v11 += v26;
if( HvlpHvStatusIsInsufficientMemory(v23) )
v28 = HvlpHandleInsufficientMemory();
else
v28 = HvlpHvToNtStatus(v27);
v10 = v28;
if( v28 < 0 )
break;
v9 = *(_QWORD *)v4;
v5 = a3;
}
while( *(_QWORD *)v4 );
}
*(_QWORD *)v4 = v11;
return v10;
}Referenced by:
No references.