HvlDmaUnmapDeviceSparsePages
NTSTATUS __fastcall HvlDmaUnmapDeviceSparsePages(__int64 a1, __int64 a2, unsigned __int64 *a3){
bool v3;
NTSTATUS result;
unsigned __int64 v8;
unsigned __int64 v9;
int v10;
int v11;
_QWORD *v12;
unsigned int v13;
char v14;
_QWORD *v15;
__int64 v16;
__int64 v17;
__int64 v18;
UINT16 v19;
__int16 v20;
UINT16 v21;
__int64 v22;
__int64 v23;
__int16 v24;
PHYSICAL_ADDRESS PageInfo[2];
__int128 v26;
__int64 v27[14];
v3 = *(_BYTE *)(a1 + 4) == 0;
*(_OWORD *)&PageInfo[0].anonymous_0.LowPart = 0i64;
v26 = 0i64;
if( !v3 )
return -1073741637;
v8 = *a3;
result = 0;
v9 = 0i64;
if( *a3 )
{
v10 = 0;
v11 = 200;
do
{
if( v8 <= 0xB )
{
v12 = v27;
if( v8 >= 0xB )
v13 = 11;
else
v13 = *(_DWORD *)a3;
v14 = 1;
v11 |= 0x10000u;
}
else
{
v12 = HvlpAcquireHypercallPage(PageInfo, 1ui64, 0i64, 0i64);
if( *a3 >= 0x1FD )
v13 = 509;
else
v13 = *(_DWORD *)a3;
v14 = 0;
v11 &= ~0x10000u;
}
LODWORD(v23) = v11;
v12[1] = 0i64;
v12[2] = 0i64;
*v12 = -1i64;
*((_DWORD *)v12 + 4) &= 0xFFFFFFF0;
*((_DWORD *)v12 + 5) = *(_DWORD *)a1;
if( v13 )
{
v15 = v12 + 3;
v16 = a2 + 8 * v9 - 24 - (_QWORD)v12;
v17 = v13;
do
{
*v15 = *(_QWORD *)((char *)v15 + v16) << 12;
++v15;
--v17;
}
while( v17 );
}
v10 ^= ((unsigned __int16)v13 ^ (unsigned __int16)v10) & 0xFFF;
HIDWORD(v23) = v10;
if( v14 )
{
v18 = HvcallFastExtended(v23, v27, 8 * v13 + 24, 0i64, 0);
v19 = v18;
v24 = WORD2(v18);
}
else
{
HvcallInitiateHypercall();
v24 = v20;
v19 = v21;
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
}
v22 = v24 & 0xFFF;
v9 += v22;
*a3 -= v22;
result = HvlpHvToNtStatus(v19);
}
while( result >= 0 && v8 );
}
*a3 = v9;
return result;
}Referenced by:
No references.