HalpIommuCleanupPageTable
VOID __fastcall HalpIommuCleanupPageTable(INT64 a1){
INT64 v1;
int v3;
__int128 *v4;
char *v5;
_DWORD *v6;
int v7;
unsigned int v8;
int v9;
__int64 v10;
INT64 v11;
int v12;
__int64 v13;
__int64 v14;
INT64 v15;
__int128 v16[3];
char v17[24];
v1 = *(_QWORD *)(a1 + 16);
memset(v16, 0, sizeof(v16));
if( v1 )
{
v3 = 0;
*(_QWORD *)&v16[0] = v1;
memset((INT64)v17, 0i64);
v4 = v16;
v5 = v17;
v6 = (_DWORD *)(a1 + 36);
do
{
v7 = *(_DWORD *)(a1 + 28);
v8 = 1 << *v6;
v9 = *(_DWORD *)(a1 + 24) - 1;
v15 = v1 + (int)(v8 << v7);
if( v3 == v9 )
{
memset(v1, 0i64);
}
else
{
v10 = *(unsigned int *)v5;
v11 = 0i64;
do
{
v12 = v10;
if( (unsigned int)v10 >= v8 )
break;
v13 = (unsigned int)v10;
v10 = (unsigned int)(v10 + 1);
*(_DWORD *)v5 = v10;
v12 = v10;
v11 = *(_QWORD *)(v1 + (int)(v8 << v7) + 8 * v13);
}
while( !v11 );
if( v11 )
{
v14 = (unsigned int)(v12 - 1);
memset(v1 + (unsigned int)((_DWORD)v14 << v7), 0i64);
++v3;
++v6;
v5 += 4;
v1 = v11;
*(_QWORD *)(v15 + 8 * v14) = 0i64;
v4 = (__int128 *)((char *)v4 + 8);
*(_QWORD *)v4 = v11;
continue;
}
HalpMmAllocCtxFree(v10, v1);
*(_DWORD *)v5 = 0;
}
--v3;
--v6;
v5 -= 4;
v4 = (__int128 *)((char *)v4 - 8);
v1 = *(_QWORD *)v4;
}
while( v3 >= 0 );
}
}Referenced by:
HalpIommuFreeDmaDomain