KiInterruptDispatchCommon
VOID __stdcall KiInterruptDispatchCommon(
_KINTERRUPT_TYPE InterruptType,
UINT64 Vector,
UINT64 Flags,
_LIST_ENTRY *DisconnectListOut,
_KINTERRUPT_DISPATCH_STATUS *DispatchStatus){
_KINTERRUPT_TYPE v5;
char v6;
_LIST_ENTRY *v7;
UINT8 v8;
unsigned __int8 v9;
_KINTERRUPT *v10;
__int64 v11;
_KINTERRUPT *p_Blink;
_LIST_ENTRY *Flink;
unsigned int v14;
char v15;
UINT64 *v16;
_LIST_ENTRY *v17;
_KINTERRUPT_TYPE v18;
_LIST_ENTRY *v19;
UINT8 OldIrql;
char v21;
_KINTERRUPT_TYPE InterruptTypea;
_KINTERRUPT_DISPATCH_STATUS v23;
_PROCESSOR_NUMBER ProcNumber;
unsigned int Vectora;
unsigned int Vector_4;
UINT64 *SpinLock;
_KINTERRUPT_MODE Mode;
_LIST_ENTRY *DisconnectedList;
__int64 CurrentIrql;
_KINTERRUPT_DISPATCH_STATUS *v31;
_GROUP_AFFINITY Affinity;
__int128 v33;
_GROUP_AFFINITY PreviousAffinity;
Vectora = Vector;
InterruptTypea = InterruptType;
v5 = InterruptType;
OldIrql = 0;
v31 = DispatchStatus;
v6 = Flags;
ProcNumber = 0;
v23 = IsrNotDispatched;
v33 = 0i64;
CurrentIrql = KeGetCurrentIrql();
v7 = (_LIST_ENTRY *)&v33;
v21 = 0;
if( DisconnectListOut )
v7 = DisconnectListOut;
Vector_4 = 0;
DisconnectedList = v7;
v8 = 0;
PreviousAffinity = 0i64;
v7->Blink = v7;
v7->Flink = v7;
if( InterruptType )
{
v11 = (unsigned int)(Vector - 256);
SpinLock = (UINT64 *)(KiGlobalSecondaryIDT + 48 * v11);
KiAcquireSecondaryInterruptConnectLock(SpinLock, &OldIrql);
v10 = 0i64;
if( (unsigned int)v11 < 0x100 )
v10 = *(_KINTERRUPT **)(KiGlobalSecondaryIDT + 48 * v11 + 40);
v7 = DisconnectedList;
v5 = InterruptTypea;
}
else
{
SpinLock = 0i64;
KeGetCurrentProcessorNumberEx(&ProcNumber.Group);
*(_QWORD *)&Affinity.Group = ProcNumber.Group;
Affinity.Mask = 1i64 << ProcNumber.Number;
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
v9 = KeGetCurrentIrql();
__writecr8(0xFui64);
v10 = 0i64;
OldIrql = v9;
if( Vectora > 0xFF )
goto LABEL_10;
_mm_lfence();
v10 = (_KINTERRUPT *)KeGetCurrentPrcb()->InterruptObject[Vectora];
}
v9 = OldIrql;
LABEL_10:
if( v10 )
{
p_Blink = v10;
++v10->ActiveCount;
if( (v6 & 1) != 0 )
{
while( p_Blink->SynchronizeIrql )
{
Flink = p_Blink->InterruptListEntry.Flink;
if( !Flink )
{
p_Blink = 0i64;
break;
}
p_Blink = (_KINTERRUPT *)&Flink[-1].Blink;
if( p_Blink == v10 )
{
if( p_Blink->SynchronizeIrql )
p_Blink = 0i64;
break;
}
}
}
if( p_Blink )
{
v14 = 0;
Mode = v10->Mode;
v15 = 0;
while( (unsigned __int8)CurrentIrql <= 2u || p_Blink->SynchronizeIrql )
{
if( (p_Blink->InternalState & 1) != 0 )
{
v19 = p_Blink->InterruptListEntry.Flink;
}
else
{
++p_Blink->ActiveCount;
++v14;
v16 = SpinLock;
if( InterruptTypea )
KxReleaseSpinLock(SpinLock);
__writecr8(v9);
v8 = KiInvokeInterruptServiceRoutine(p_Blink, v9, Vectora);
v23 = IsrDispatched;
if( InterruptTypea )
{
KiAcquireSecondaryInterruptConnectLock(v16, &OldIrql);
v9 = OldIrql;
}
else
{
v9 = KeGetCurrentIrql();
__writecr8(0xFui64);
OldIrql = v9;
}
v17 = DisconnectedList;
v18 = InterruptTypea;
--p_Blink->ActiveCount;
v19 = p_Blink->InterruptListEntry.Flink;
KiProcessPendingDisconnect(v18, p_Blink, v17);
}
p_Blink = (_KINTERRUPT *)&v19[-1].Blink;
if( Mode )
{
if( v8 )
v15 = 1;
if( p_Blink == v10 )
{
if( !v15 || v14 <= 1 )
goto LABEL_45;
v14 = 0;
v15 = 0;
v8 = 0;
}
}
else if( v8 || p_Blink == v10 )
{
goto LABEL_45;
}
}
v21 = 1;
if( v23 != IsrDispatched )
v23 = IsrDispatchDeferred;
Vector_4 = p_Blink->Vector;
LABEL_45:
v5 = InterruptTypea;
}
--v10->ActiveCount;
v7 = DisconnectedList;
KiProcessPendingDisconnect(v5, v10, DisconnectedList);
}
if( v5 )
{
KxReleaseSpinLock(SpinLock);
__writecr8(v9);
}
else
{
__writecr8(v9);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
}
if( v21 )
IoProcessPassiveInterrupts(Vector_4);
if( (unsigned __int8)CurrentIrql < 2u )
KiProcessDisconnectList(v7);
if( v31 )
*v31 = v23;
}Referenced by:
IopPassiveInterruptWorker
KeDispatchSecondaryInterrupt