KeConnectInterrupt
VOID __fastcall KeConnectInterrupt(
_KINTERRUPT **InterruptObject,
UINT8 ProcessorCount,
_INTERRUPT_CONNECTION_DATA *ConnectionData){
__int64 v4;
_INTERRUPT_CONNECTION_DATA *v5;
char v6;
unsigned __int8 v7;
UINT8 IsInterruptTypeSecondary;
_KINTERRUPT *v9;
NTSTATUS v10;
INT64 v11;
_KINTERRUPT **v12;
__int64 v13;
_QWORD *IntTrackEntry;
__int64 v15;
int v16;
_BYTE *RedirectObject;
_KINTERRUPT **v18;
__int64 v19;
int v20;
UINT64 Gsiv;
_INTERRUPT_CONNECTION_DATA *ConnectionDataa;
ConnectionDataa = ConnectionData;
LODWORD(Gsiv) = 0;
v4 = ProcessorCount;
v5 = ConnectionData;
v6 = 0;
v7 = 0;
IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
if( (_BYTE)v4 )
{
do
{
v9 = InterruptObject[v7];
v9->InternalState |= 1u;
if( IsInterruptTypeSecondary )
KiConnectSecondaryInterrupt(v9);
else
v10 = KiConnectInterrupt(v9);
if( v10 < 0 )
goto LABEL_35;
if( v10 == 295 )
v6 = 1;
}
while( ++v7 < (unsigned __int8)v4 );
}
if( KiIntSteerConnect(InterruptObject, (unsigned int)v4, v5->Vectors) < 0 )
goto LABEL_34;
v7 = 0;
if( (_BYTE)v4 )
{
v12 = InterruptObject;
v7 = v4;
v13 = v4;
do
{
_InterlockedAnd(&(*v12++)->InternalState, 0xFFFFFFFE);
--v13;
}
while( v13 );
}
if( v6 )
{
if( ((int(__fastcall *)(_INTERRUPT_VECTOR_DATA *, UINT64 *))off_140C008E0[0])(v5->Vectors, &Gsiv) < 0 )
return;
if( IsInterruptTypeSecondary )
KiUnmaskSecondaryInterruptInternal((*InterruptObject)->Vector, (unsigned int)Gsiv);
else
v20 = ((__int64(__fastcall *)(_QWORD, _QWORD))off_140C00778[0])((unsigned int)Gsiv, 0i64);
if( v20 >= 0 )
return;
LABEL_34:
v5 = ConnectionDataa;
LABEL_35:
if( v7 )
{
LOBYTE(v11) = v7;
KeDisconnectInterrupt(InterruptObject, v11, v5);
}
return;
}
v5 = ConnectionDataa;
if( HalEnableInterrupt(ConnectionDataa) < 0 )
goto LABEL_35;
IntTrackEntry = (*InterruptObject)->IntTrackEntry;
if( IntTrackEntry && *((_BYTE *)IntTrackEntry + 56) )
{
v15 = IntTrackEntry[2];
v16 = *(_DWORD *)(v15 + 128);
if( v16 == 2 )
{
if( !(_BYTE)v4 || (RedirectObject = (*InterruptObject)->RedirectObject) == 0i64 )
__fastfail(5u);
RedirectObject[16] = 1;
}
else if( v16 != 1 )
{
return;
}
*(_BYTE *)(v15 + 132) = 1;
_InterlockedExchange(&KiIntTrackRootEnabled, 1);
if( (_BYTE)v4 )
{
v18 = InterruptObject;
v19 = v4;
do
{
_InterlockedOr(&(*v18++)->InternalState, 4u);
--v19;
}
while( v19 );
}
}
}Referenced by:
IopConnectInterrupt