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