KiDispatchInterrupt
VOID __stdcall KiDispatchInterrupt(UINT8 PreviousIrql){
__int64 v1;
struct _KPRCB *CurrentPrcb;
__int64 v3;
char v4;
KiCheckForSListAddress((KTRAP_FRAME *)(v1 - 128));
CurrentPrcb = KeGetCurrentPrcb();
_disable();
if( (*((_BYTE *)CurrentPrcb + 12588) & 0x3F) != 0 )
{
KyRetireDpcList((struct KPRCB *)CurrentPrcb);
}
else
{
_enable();
if( *((_BYTE *)CurrentPrcb + 12585) )
{
*((_BYTE *)CurrentPrcb + 12585) = 0;
KiQuantumEnd();
}
else if( *((_QWORD *)CurrentPrcb + 2) )
{
v3 = *((_QWORD *)CurrentPrcb + 1);
if( (*(_BYTE *)(v3 + 2) & 4) == 0 || (KiDeferGroupSchedulingPreemption((_ETHREAD *)v3, CurrentPrcb), !v4) )
KxDispatchInterrupt();
}
}
}Referenced by:
KiDpcInterrupt
KiDpcInterruptBypass