IommuMapIdentityRange
NTSTATUS __stdcall IommuMapIdentityRange(PVOID BugCheckParameter3){
unsigned int v1;
INT64 v2;
unsigned int v3;
__int64 v6;
unsigned __int64 v7;
__int64 v8;
int v9;
int v10;
unsigned __int64 v11;
bool i;
unsigned __int64 v13;
unsigned __int64 v14;
bool j;
INT64 v16;
INT64 v17;
unsigned __int64 v18;
__int64 v19;
UINT64 v20;
unsigned __int64 v21;
UINT64 v22;
v3 = v1;
if( !*((_BYTE *)BugCheckParameter3 + 44) )
return -1073741585;
if( !IommupValidateMdl(v2) )
return -1073741583;
v7 = (unsigned __int64)*(unsigned int *)(v6 + 40) >> 12;
v8 = v6 + 8 * ((unsigned __int64)*(unsigned int *)(v6 + 44) >> 12);
if( !byte_140C49B2C )
{
v11 = 0i64;
v9 = 0;
for( i = v7 == 0; ; i = v7 == 0 )
{
v21 = v11;
if( i )
break;
v20 = *(_QWORD *)(v8 + 8 * v11 + 48) << 12;
v9 = HalpIommuMapLogicalRange(0i64, *((_QWORD *)BugCheckParameter3 + 3), v3, v20, 4096i64, v20);
if( v9 < 0 )
{
v13 = v21;
v14 = 0i64;
for( j = v21 == 0; ; j = v13 == 0 )
{
v21 = v14;
if( j )
break;
v16 = *((_QWORD *)BugCheckParameter3 + 3);
v17 = *(_QWORD *)(v8 + 8 * v14 + 48) << 12;
v22 = 4096i64;
HalpIommuUnmapLogicalRange(v16, &v22, v17);
v18 = 1i64;
do
{
v19 = 1024i64;
if( v18 < 0x400 )
v19 = v18;
HalpIommuFlushDmaDomain(
BugCheckParameter3,
v17 ^ ((unsigned __int16)v17 ^ (unsigned __int16)(v19 - 1)) & 0x3FF);
v18 -= v19;
v17 += v19 << 12;
}
while( v18 );
v14 = v21 + 1;
--v13;
}
return v9;
}
v11 = v21 + 1;
--v7;
}
return v9;
}
v21 = (unsigned __int64)*(unsigned int *)(v6 + 40) >> 12;
v22 = 0i64;
if( *((_BYTE *)BugCheckParameter3 + 40) )
{
v9 = -1073741811;
goto LABEL_9;
}
LODWORD(v22) = *((_DWORD *)BugCheckParameter3 + 8);
BYTE4(v22) = 0;
v9 = ((__int64(__fastcall *)(UINT64 *, _QWORD, __int64, unsigned __int64 *))qword_140C4A2E0)(&v22, v3, v8 + 48, &v21);
if( v9 < 0 )
{
LABEL_9:
IommupHvUnmapDeviceIdentityRange((INT64)BugCheckParameter3, v8 + 48);
if( v10 < 0 )
KeBugCheckEx(0x1D9u, (PVOID)1, (PVOID)v10, BugCheckParameter3, 0i64);
}
return v9;
}Referenced by:
No references.