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