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