IommuMapLogicalRange

INT64 __fastcall IommuMapLogicalRange(INT64 a1, UINT64 a2, INT64 a3, INT64 a4){
  unsigned int v5; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  int v11; 
  INT64 v12; 
  INT64 v13; 
  INT64 v14; 
  v5 = a2;
  if( !*(_BYTE *)(a1 + 44) )
    return 3221225711i64;
  if( !IommupValidateMdl(a3) )
    return 3221225713i64;
  if( (a4 & 0xFFF) != 0 )
    return 3221225714i64;
  v9 = (unsigned __int64)*(unsigned int *)(v8 + 40) >> 12;
  v10 = v8 + 8 * ((unsigned __int64)*(unsigned int *)(v8 + 44) >> 12);
  if( HalpHvIommu )
  {
    v14 = (unsigned __int64)*(unsigned int *)(v8 + 40) >> 12;
    v11 = IommupHvMapDeviceLogical(a1, v5, v10 + 48, (INT64)&v14, a4);
LABEL_12:
    if( v11 >= 0 )
      return(unsigned int)v11;
    goto LABEL_13;
  }
  v12 = 0i64;
  v11 = 0;
  v14 = 0i64;
  v13 = a4;
  if( v9 )
  {
    while( 1 )
    {
      v11 = HalpIommuMapLogicalRange(
              0i64,
              *(_QWORD *)(a1 + 24),
              v5,
              *(_QWORD *)(v10 + 8 * v12 + 48) << 12,
              4096i64,
              v13);
      if( v11 < 0 )
        break;
      v12 = v14 + 1;
      v13 += 4096i64;
      ++v14;
      if( !--v9 )
        goto LABEL_12;
    }
LABEL_13:
    IommuUnmapLogicalRange((_BYTE *)a1, (VOID *)a4);
  }
  return(unsigned int)v11;
}

Referenced by:

No references.