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