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