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