IommuMapIdentityRange

NTSTATUS __stdcall IommuMapIdentityRange(PVOID BugCheckParameter3){
  unsigned int v1; 
  INT64 v2; 
  unsigned int v3; 
  __int64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  int v9; 
  int v10; 
  unsigned __int64 v11; 
  bool i; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  bool j; 
  INT64 v16; 
  INT64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  UINT64 v20; 
  unsigned __int64 v21; 
  UINT64 v22; 

  v3 = v1;
  if( !*((_BYTE *)BugCheckParameter3 + 44) )
    return -1073741585;
  if( !IommupValidateMdl(v2) )
    return -1073741583;
  v7 = (unsigned __int64)*(unsigned int *)(v6 + 40) >> 12;
  v8 = v6 + 8 * ((unsigned __int64)*(unsigned int *)(v6 + 44) >> 12);
  if( !byte_140C49B2C )
  {
    v11 = 0i64;
    v9 = 0;
    for( i = v7 == 0; ; i = v7 == 0 )
    {
      v21 = v11;
      if( i )
        break;
      v20 = *(_QWORD *)(v8 + 8 * v11 + 48) << 12;
      v9 = HalpIommuMapLogicalRange(0i64, *((_QWORD *)BugCheckParameter3 + 3), v3, v20, 4096i64, v20);
      if( v9 < 0 )
      {
        v13 = v21;
        v14 = 0i64;
        for( j = v21 == 0; ; j = v13 == 0 )
        {
          v21 = v14;
          if( j )
            break;
          v16 = *((_QWORD *)BugCheckParameter3 + 3);
          v17 = *(_QWORD *)(v8 + 8 * v14 + 48) << 12;
          v22 = 4096i64;
          HalpIommuUnmapLogicalRange(v16, &v22, v17);
          v18 = 1i64;
          do
          {
            v19 = 1024i64;
            if( v18 < 0x400 )
              v19 = v18;
            HalpIommuFlushDmaDomain(
              BugCheckParameter3,
              v17 ^ ((unsigned __int16)v17 ^ (unsigned __int16)(v19 - 1)) & 0x3FF);
            v18 -= v19;
            v17 += v19 << 12;
          }
          while( v18 );
          v14 = v21 + 1;
          --v13;
        }
        return v9;
      }
      v11 = v21 + 1;
      --v7;
    }
    return v9;
  }
  v21 = (unsigned __int64)*(unsigned int *)(v6 + 40) >> 12;
  v22 = 0i64;
  if( *((_BYTE *)BugCheckParameter3 + 40) )
  {
    v9 = -1073741811;
    goto LABEL_9;
  }
  LODWORD(v22) = *((_DWORD *)BugCheckParameter3 + 8);
  BYTE4(v22) = 0;
  v9 = ((__int64(__fastcall *)(UINT64 *, _QWORD, __int64, unsigned __int64 *))qword_140C4A2E0)(&v22, v3, v8 + 48, &v21);
  if( v9 < 0 )
  {
LABEL_9:
    IommupHvUnmapDeviceIdentityRange((INT64)BugCheckParameter3, v8 + 48);
    if( v10 < 0 )
      KeBugCheckEx(0x1D9u, (PVOID)1, (PVOID)v10, BugCheckParameter3, 0i64);
  }
  return v9;
}

Referenced by:

No references.