HalpInterruptUnmap

void __fastcall HalpInterruptUnmap(__int64 a1, __int64 a2, __int64 a3, __int64 a4, int *a5, UINT64 a6){
  int *v6; 
  int *v7; 
  int v8; 
  int v9; 
  int v10; 
  INT64 v11; 
  INT64 v12; 
  INT64 *v13; 
  CHAR v14; 
  LARGE_INTEGER *v15; 
  KENLISTMENT *v16; 
  unsigned int v17; 
  ULONG_PTR *v18; 
  ULONG_PTR *Lines; 
  INT64 v20; 
  ULONG_PTR *v21; 
  _INTERRUPT_PROBLEM v22; 
  INT64 v23; 
  unsigned int v24; 
  _DWORD *v25; 
  __int64 v26; 
  _REGISTERED_INTERRUPT_CONTROLLER *v27; 
  int v28; 
  UINT64 SourceLine; 
  INT64 a3a[2]; 
  __int128 v31; 
  __int128 v32; 
  __int64 v33; 
  v6 = a5;
  v33 = 0i64;
  *(_OWORD *)a3a = 0i64;
  v7 = a5 + 1;
  v8 = a5[3];
  a3a[1] = (unsigned int)a5[4];
  v9 = a5[1];
  v31 = 0i64;
  *(_QWORD *)&v31 = 0x1FFFFFFFFi64;
  LODWORD(v33) = v9;
  v10 = *a5;
  LODWORD(a3a[0]) = v8;
  v32 = 0i64;
  if( v10 )
  {
    if( v10 == 3 )
    {
      if( HalpInterruptIsHvLineBasedIntRemappingSupported() )
        HalpHvUnmapDeviceMsiRange(v12, v11, v13, v14);
      if( (unsigned __int8)HalpInterruptIsRemappingRequired() )
      {
        v24 = a6;
        if( (_DWORD)a6 )
        {
          v25 = v6 + 10;
          v26 = (unsigned int)a6;
          do
          {
            LODWORD(v33) = *v7;
            HalpSetIrtEntry(1, v25, (INT64)a3a);
            v25 += 22;
            v7 += 22;
            --v26;
          }
          while( v26 );
        }
        v16 = (KENLISTMENT *)(unsigned int)v6[10];
        if( ((unsigned int)v16 & 0x40000000) == 0 )
          HalpIrtFreeIndex((unsigned int)v16 & 0x3FFFFFFF, v24);
      }
      xHalUnmaskInterrupt(v16, v15);
      return;
    }
    v22 = InterruptProblemBadConnectionData;
    LODWORD(SourceLine) = 3219;
    v23 = 2i64;
    goto LABEL_24;
  }
  v17 = a5[14];
  a5 = 0i64;
  if( (int)HalpInterruptGsiToLine(v17, &a5) < 0 )
  {
    v23 = 0i64;
    LODWORD(SourceLine) = 3133;
    v22 = InterruptProblemNoSuchLines;
LABEL_24:
    v27 = 0i64;
LABEL_26:
    HalpInterruptSetProblemEx(v27, v22, v23, "minkernel\\hals\\lib\\interrupts\\common\\connect.c", SourceLine);
    return;
  }
  if( (unsigned int)(v8 - 3) <= 1 )
  {
    LODWORD(a3a[1]) = 0;
    BYTE4(a3a[0]) = 1;
  }
  v18 = HalpInterruptLookupController((int)a5);
  if( !v18 )
  {
    v22 = InterruptProblemNoSuchController;
    LODWORD(SourceLine) = 3165;
    v23 = 1i64;
    goto LABEL_24;
  }
  Lines = HalpInterruptFindLines((int *)&a5);
  v21 = Lines;
  if( !Lines )
  {
    v23 = 0i64;
    LODWORD(SourceLine) = 3173;
    v27 = (_REGISTERED_INTERRUPT_CONTROLLER *)v18;
    v22 = InterruptProblemNoSuchLines;
    goto LABEL_26;
  }
  if( qword_140C4A168 )
  {
    *(_DWORD *)(Lines[5] + 12) |= 0x10u;
    HalpHvUnmapDeviceInterrupt(*((_DWORD *)v18 + 58), v20, Lines[5]);
    *(_DWORD *)(v21[5] + 12) &= ~0x10u;
  }
  if( (unsigned __int8)HalpInterruptIsRemappingRequired() )
  {
    if( (unsigned int)HalpInterruptModel() == 1 )
    {
      LODWORD(v33) = *v7;
      HalpSetIrtEntry(0, v6 + 10, (INT64)a3a);
      v28 = v6[10];
      if( (v28 & 0x40000000) == 0 )
        HalpIrtFreeIndex(v28 & 0x3FFFFFFF, 1ui64);
    }
  }
  *(_BYTE *)(v21[6] + 12) = 0;
}

Referenced by:

HaliRemoveInterruptRemapping
HalpTimerUnmapInterrupt