HalpInterruptRemapFixedLines

NTSTATUS __stdcall HalpInterruptRemapFixedLines(){
  int v0; 
  PVOID *v2; 
  PVOID *v3; 
  PVOID *v4; 
  PVOID *v5; 
  INT64 v6; 
  int v7; 
  __int64 v8; 
  __int64 v9; 
  INT64 v10; 
  bool v11; 
  __int64 v12; 
  __int64 v13; 
  int v14; 
  unsigned __int8 v15; 
  UINT64 IrtIndex; 
  int v17; 
  _INTERRUPT_LINE Line; 

  v0 = 0;
  LODWORD(IrtIndex) = 0;
  Line = 0i64;
  if( !*(&stru_140CF2E80 + 1860) || (*(_DWORD *)(Controller + 220) & 0x100) == 0 && !qword_140C4A168 )
    return v0;
  v2 = (PVOID *)qword_140C4B850;
  v14 = 0;
  while( 1 )
  {
LABEL_22:
    if( v2 == &qword_140C4B850 )
      return v0;
    v3 = v2;
    v2 = (PVOID *)*v2;
    if( *((_DWORD *)v3 + 54) == 2 )
    {
      v4 = (PVOID *)v3[30];
      if( v4 != v3 + 30 )
        break;
    }
  }
  while( 1 )
  {
    v5 = v4;
    v4 = (PVOID *)*v4;
    if( *((_DWORD *)v5 + 8) == 2 )
    {
      v6 = 0i64;
      v7 = *((_DWORD *)v5 + 6) - *((_DWORD *)v5 + 5);
      v17 = 0;
      if( v7 > 0 )
        break;
    }
LABEL_21:
    if( v4 == v3 + 30 )
      goto LABEL_22;
  }
  v8 = 0i64;
  v13 = 0i64;
  v12 = 0i64;
  v9 = 0i64;
  while( 1 )
  {
    if( !*((_BYTE *)v5[6] + v8) )
      goto LABEL_20;
    Line.UnitId = *((_DWORD *)v3 + 58);
    Line.Line = v6 + *((_DWORD *)v5 + 5);
    v10 = (INT64)v5[5] + v9;
    if( (*(_DWORD *)(Controller + 220) & 0x100) != 0 )
      break;
LABEL_15:
    if( qword_140C4A168 )
    {
      v0 = HalpHvMapDeviceInterrupt(*((_DWORD *)v3 + 58), v6, v10, 0i64);
      if( v0 < 0 )
      {
        *((_DWORD *)v3 + 78) = 1825;
        goto LABEL_25;
      }
    }
    v15 = HalpAcquireHighLevelLock(&qword_140C49C40);
    v0 = HalpInterruptSetLineStateInternal((_REGISTERED_INTERRUPT_CONTROLLER *)v3, &Line, (_INTERRUPT_LINE_STATE *)v10);
    KxReleaseSpinLock(&qword_140C49C40);
    __writecr8(v15);
    if( v0 < 0 )
      return v0;
    LODWORD(v6) = v17;
    v8 = v12;
    v9 = v13;
LABEL_20:
    v6 = (unsigned int)(v6 + 1);
    v12 = v8 + 16;
    v9 += 56i64;
    v11 = (int)v6 < *((_DWORD *)v5 + 6) - *((_DWORD *)v5 + 5);
    v17 = v6;
    v8 += 16i64;
    v13 = v9;
    if( !v11 )
      goto LABEL_21;
  }
  v0 = HalpIrtAllocateIndex(&IrtIndex, 1i64);
  if( v0 >= 0 )
  {
    v14 ^= (IrtIndex ^ v14) & 0x3FFFFFFF;
    HalpIommuUpdateRemappingTableEntry(0, v14 & 0x3FFFFFFF, v10);
    *(_DWORD *)(v10 + 24) = 7;
    *(_DWORD *)(v10 + 32) = v14 & 0x3FFFFFFF;
    goto LABEL_15;
  }
  *((_DWORD *)v3 + 78) = 1796;
LABEL_25:
  *((_DWORD *)v3 + 74) = v0;
  *(&CmpDummyThreadEvent + 1789) = 31;
  *((_DWORD *)v3 + 73) = 31;
  v3[38] = (PVOID)"minkernel\\hals\\lib\\interrupts\\common\\intrupt.c";
  return v0;
}

Referenced by:

HalpInitializeInterruptsBspLate