HalpIommuUnmapLogicalRange
NTSTATUS __stdcall HalpIommuUnmapLogicalRange(INT64 a1, UINT64 *a2, INT64 a3){
int v3;
UINT64 v4;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
unsigned int v10;
__int64 v11;
unsigned int v12;
int v13;
unsigned int v14;
__int64 v15;
unsigned __int64 v16;
VOID *v17;
unsigned __int64 v18;
unsigned int v19;
unsigned __int64 v20;
__int64 v21;
__int128 v23[3];
v3 = *(_DWORD *)(a1 + 28);
v4 = ((a3 & 0xFFF) + 4095 + *a2) & 0xFFFFFFFFFFFFF000ui64;
*a2 = v4;
v6 = a3 & 0xFFFFFFFFFFFFF000ui64;
v7 = *(_QWORD *)(a1 + 16);
v8 = (unsigned int)(1 << v3) * (v4 >> 12);
memset(&v23[1], 0, 32);
LODWORD(v9) = 0;
v23[0] = v7;
while( 1 )
{
if( !v8 )
return 0;
v10 = *(_DWORD *)(a1 + 24) - 1;
if( (unsigned int)v9 < v10 )
break;
LABEL_9:
v14 = *(_DWORD *)(a1 + 4i64 * (unsigned int)v9 + 36);
if( v14 < 0x40 )
v15 = (1i64 << v14) - 1;
else
LODWORD(v15) = -1;
v16 = v8;
v17 = (VOID *)(v7
+ (((unsigned int)v15 & (unsigned int)(v6 >> *(_DWORD *)(a1 + 4i64 * (unsigned int)v9 + 60))) << v3));
v18 = (1 << v14 << v3)
- (unsigned __int64)(((unsigned int)v15 & (unsigned int)(v6 >> *(_DWORD *)(a1 + 4i64 * (unsigned int)v9 + 60))) << v3);
if( v18 <= v8 )
v16 = v18;
memset(v17, 0i64, v16);
if( !byte_140C49BF1 )
KeInvalidateRangeAllCachesNoIpi(v17, (unsigned int)v16);
v8 -= v16;
v19 = 0;
v20 = v16 >> v3 << 12;
if( *(_DWORD *)(a1 + 24) != 1 )
{
do
{
v21 = 1i64 << *(_DWORD *)(a1 + 4i64 * (unsigned int)(v9 - 1) + 60);
if( (v21 & (v6 + v20)) == (v21 & v6) && v8 )
break;
++v19;
LODWORD(v9) = v9 - 1;
}
while( v19 < *(_DWORD *)(a1 + 24) - 1 );
}
v6 += v20;
v7 = *((_QWORD *)v23 + (unsigned int)v9);
}
v11 = (unsigned int)v9;
while( 1 )
{
v12 = *(_DWORD *)(a1 + 4 * v11 + 36);
v13 = v12 < 0x40 ? (1i64 << v12) - 1 : -1;
v7 = *(_QWORD *)(v7
+ (1 << *(_DWORD *)(a1 + 4 * v11 + 36) << v3)
+ 8i64 * (v13 & (unsigned int)(v6 >> *(_DWORD *)(a1 + 4 * v11 + 60))));
if( !v7 )
return -1073741811;
v9 = (unsigned int)(v9 + 1);
v11 = (unsigned int)v9;
*((_QWORD *)v23 + v9) = v7;
if( (unsigned int)v9 >= v10 )
goto LABEL_9;
}
}Referenced by:
HalpIommuDomainUnmapLogicalRange
HalpIommuMapLogical
HalpIommuMapLogicalRange
IommuMapIdentityRange
IommuUnmapIdentityRange