IommuMapLogicalRange
INT64 __fastcall IommuMapLogicalRange(INT64 a1, UINT64 a2, INT64 a3, INT64 a4){
unsigned int v5;
__int64 v8;
unsigned __int64 v9;
__int64 v10;
int v11;
INT64 v12;
INT64 v13;
INT64 v14;
v5 = a2;
if( !*(_BYTE *)(a1 + 44) )
return 3221225711i64;
if( !IommupValidateMdl(a3) )
return 3221225713i64;
if( (a4 & 0xFFF) != 0 )
return 3221225714i64;
v9 = (unsigned __int64)*(unsigned int *)(v8 + 40) >> 12;
v10 = v8 + 8 * ((unsigned __int64)*(unsigned int *)(v8 + 44) >> 12);
if( HalpHvIommu )
{
v14 = (unsigned __int64)*(unsigned int *)(v8 + 40) >> 12;
v11 = IommupHvMapDeviceLogical(a1, v5, v10 + 48, (INT64)&v14, a4);
LABEL_12:
if( v11 >= 0 )
return(unsigned int)v11;
goto LABEL_13;
}
v12 = 0i64;
v11 = 0;
v14 = 0i64;
v13 = a4;
if( v9 )
{
while( 1 )
{
v11 = HalpIommuMapLogicalRange(
0i64,
*(_QWORD *)(a1 + 24),
v5,
*(_QWORD *)(v10 + 8 * v12 + 48) << 12,
4096i64,
v13);
if( v11 < 0 )
break;
v12 = v14 + 1;
v13 += 4096i64;
++v14;
if( !--v9 )
goto LABEL_12;
}
LABEL_13:
IommuUnmapLogicalRange((_BYTE *)a1, (VOID *)a4);
}
return(unsigned int)v11;
}Referenced by:
No references.