HalpInterruptConnect

NTSTATUS __stdcall HalpInterruptConnect(
        INT64 a1,
        UINT64 a2,
        UINT64 a3,
        UINT8 a4,
        _KINTERRUPT_POLARITY a5,
        _KINTERRUPT_MODE a6,
        UINT64 a7,
        UINT64 a8,
        UINT64 *a9,
        UINT8 a10,
        INT64 a11,
        _KINTERRUPT **a12){
  unsigned int v12; 
  int v13; 
  __int128 v16; 
  NTSTATUS result; 
  _INTERRUPT_VECTOR_DATA *VectorData; 
  UINT64 VectorCount; 
  UINT64 VectorCounta; 
  _PCI_BUSMASTER_DESCRIPTOR Line; 
  _KINTERRUPT **v22; 
  UINT64 *v23; 
  _BYTE Parameters[80]; 
  _QWORD Data[12]; 

  v12 = a2;
  v13 = a3;
  v23 = a9;
  v22 = a12;
  memset(Data, 0i64, sizeof(Data));
  v16 = *(_OWORD *)a1;
  LODWORD(Data[1]) = 0;
  *(_QWORD *)&Line.Type = 0i64;
  LODWORD(Data[6]) = a11 & 0x3FFFFFFF | Data[6] & 0xC0000000 | 0x40000000;
  LODWORD(Data[0]) = 1;
  HIDWORD(Data[1]) = v13;
  LOBYTE(Data[2]) = a4;
  *(_OWORD *)&Data[4] = v16;
  HIDWORD(Data[2]) = a5;
  LODWORD(Data[3]) = a6;
  result = HalpInterruptGsiToLine(v12, (_INTERRUPT_LINE *)&Line);
  if( result >= 0 )
  {
    HalpInterruptApplyOverrides(
      (_INTERRUPT_LINE *)&Line,
      (_KINTERRUPT_POLARITY *)&Data[2] + 1,
      (_KINTERRUPT_MODE *)&Data[3]);
    result = HalpInterruptLineToGsi((_INTERRUPT_LINE *)&Line, &Data[8]);
    if( result >= 0 )
    {
      LODWORD(VectorCount) = 1;
      *(_QWORD *)&Line.Segment = 0i64;
      Line.Type = BusmasterRidInvalid;
      result = HalpInterruptRemap(0i64, 0i64, &Line, 0, (_INTERRUPT_VECTOR_DATA *)&Data[1], VectorCount);
      if( result >= 0 )
      {
        LODWORD(VectorCounta) = 96;
        LODWORD(VectorData) = 4099;
        IoSetDevicePropertyData(
          Pdo,
          (_DEVPROPKEY *)&INTERRUPT_CONNECTION_DATA_PKEY,
          0i64,
          0i64,
          (UINT64)VectorData,
          VectorCounta,
          Data);
        memset(Parameters, 0i64, sizeof(Parameters));
        *(_QWORD *)&Parameters[8] = Pdo;
        *(_QWORD *)&Parameters[16] = v22;
        *(_QWORD *)&Parameters[40] = v23;
        Parameters[48] = a10;
        *(_QWORD *)&Parameters[64] = *(_QWORD *)a1;
        *(_WORD *)&Parameters[72] = *(_WORD *)(a1 + 8);
        *(_DWORD *)Parameters = 4;
        *(_OWORD *)&Parameters[24] = __PAIR128__(a8, a7);
        *(_WORD *)&Parameters[49] = 256;
        *(_DWORD *)&Parameters[52] = v13;
        Parameters[56] = a4;
        *(_DWORD *)&Parameters[60] = a6;
        result = IoConnectInterruptEx((_IO_CONNECT_INTERRUPT_PARAMETERS *)Parameters);
        if( result >= 0 )
          return 0;
      }
    }
  }
  return result;
}

Referenced by:

HalpDmaConfigureInterrupt
HalpRegisterPeiErrorSource
HalpTimerInitializeSystemWatchdog