HvlDmaMapDeviceLogicalRange
void __fastcall HvlDmaMapDeviceLogicalRange(__int64 a1, int a2, __int64 a3, _QWORD *a4, unsigned __int64 *a5, char a6){
bool v6;
unsigned __int64 *v7;
_QWORD *v8;
_DWORD *v10;
unsigned __int64 v11;
int v12;
unsigned __int64 v13;
int v14;
int v15;
_QWORD *v16;
unsigned int v17;
char v18;
int v19;
int v20;
unsigned __int64 *v21;
__int64 v22;
char *v23;
__int64 v24;
unsigned __int64 v25;
__int64 v26;
INT16 v27;
__int16 v28;
INT16 v29;
__int64 v30;
INT64 v31;
UINT64 v32;
NTSTATUS v33;
__int64 v34;
__int16 v37;
PHYSICAL_ADDRESS PageInfo[2];
__int128 v40;
__int64 v41[14];
v6 = *(_BYTE *)(a1 + 4) == 0;
v7 = a5;
v8 = a4;
*(_OWORD *)&PageInfo[0].anonymous_0.LowPart = 0i64;
v10 = (_DWORD *)a1;
v40 = 0i64;
if( v6 )
{
v11 = *a5;
v12 = 0;
v13 = 0i64;
if( !*a5 )
{
LABEL_38:
*v7 = v13;
return;
}
v14 = 0;
v15 = 179;
while( 1 )
{
if( v11 <= 9 )
{
v16 = v41;
v17 = v11 >= 9 ? 9 : *(_DWORD *)v7;
v18 = 1;
v15 |= 0x10000u;
}
else
{
v16 = HvlpAcquireHypercallPage(PageInfo, 1ui64, 0i64, 0i64);
v17 = *v7 >= 0x1FB ? 507 : *(_DWORD *)v7;
v8 = a4;
v18 = 0;
v15 &= ~0x10000u;
}
LODWORD(v34) = v15;
v16[1] = 0i64;
v16[2] = 0i64;
v16[3] = 0i64;
v16[4] = 0i64;
*v16 = -1i64;
*((_DWORD *)v16 + 4) &= 0xFFFFFFF0;
*((_DWORD *)v16 + 5) = *v10;
v16[4] = a3;
if( a2 )
{
v20 = (a2 & 1) != 0;
if( (a2 & 2) != 0 )
v20 |= 2u;
v19 = v12 | v20;
}
else
{
v19 = 1024;
}
*((_DWORD *)v16 + 7) = v19;
if( v17 )
{
v21 = v16 + 5;
v22 = 0i64;
v23 = (char *)v8 + 8 * v13 - 40 - (_QWORD)v16;
v24 = v17;
do
{
if( a2 )
{
if( a6 )
v25 = v13 + v22 + *a4;
else
v25 = *(unsigned __int64 *)((char *)v21 + (_QWORD)v23);
}
else
{
v25 = 0i64;
}
*v21 = v25;
++v22;
++v21;
--v24;
}
while( v24 );
v7 = a5;
}
v14 ^= ((unsigned __int16)v17 ^ (unsigned __int16)v14) & 0xFFF;
HIDWORD(v34) = v14;
if( v18 )
{
v26 = HvcallFastExtended(v34, v41, 8 * v17 + 40, 0i64, 0);
v27 = v26;
v37 = WORD2(v26);
}
else
{
HvcallInitiateHypercall();
v37 = v28;
v27 = v29;
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
}
v30 = v37 & 0xFFF;
*v7 -= v30;
v13 += v30;
a3 += (unsigned __int16)(v37 & 0xFFF) << 12;
if( !HvlpHvStatusIsInsufficientMemory(v27) )
break;
HvlpHandleInsufficientMemory(v32, v31);
if( v33 < 0 )
{
if( v12 != 0x8000 )
{
v12 = 0x8000;
v33 = 0;
}
LABEL_36:
if( v33 < 0 )
goto LABEL_38;
}
v11 = *v7;
v10 = (_DWORD *)a1;
v8 = a4;
if( !*v7 )
goto LABEL_38;
}
v33 = HvlpHvToNtStatus(v32);
goto LABEL_36;
}
}Referenced by:
No references.