KiInvokeInterruptServiceRoutine
UINT8 __stdcall KiInvokeInterruptServiceRoutine(_KINTERRUPT *Interrupt, UINT8 InterruptIrql, UINT64 Vector){
int v3;
unsigned __int64 SynchronizeIrql;
UINT8 v7;
bool v8;
_ETHREAD *CurrentThread;
unsigned __int8 v10;
unsigned __int8 v11;
char v13;
__int128 Object;
__int128 v15;
_KTIMER Timer;
_KDPC Dpc;
_LARGE_INTEGER TimeStamp[2];
__int128 v19;
v3 = Vector;
*(_OWORD *)&TimeStamp[0].anonymous_0.LowPart = 0i64;
v19 = 0i64;
Object = 0i64;
v15 = 0i64;
memset(&Dpc, 0i64, sizeof(Dpc));
memset(&Timer, 0i64, sizeof(Timer));
SynchronizeIrql = Interrupt->SynchronizeIrql;
v7 = 1;
v13 = 0;
v8 = 0;
if( (_BYTE)SynchronizeIrql )
{
if( InterruptIrql != (_BYTE)SynchronizeIrql )
{
InterruptIrql = KeGetCurrentIrql();
__writecr8(SynchronizeIrql);
}
if( (((unsigned __int64)Interrupt->ActualLock + 3) & 0xFFFFFFFFFFFFFFFDui64) == 0 )
v7 = 0;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
KeWaitForSingleObject((UINT64)Interrupt->PassiveEvent, 0, 0, 0, 0i64);
v8 = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) != 0;
if( (_BYTE)KdDebuggerEnabled && KiPassiveWatchdogTimeout )
{
*((_QWORD *)&v15 + 1) = Interrupt;
*(_QWORD *)&v15 = (char *)&Object + 8;
LOWORD(Object) = 1;
*((_QWORD *)&Object + 1) = (char *)&Object + 8;
BYTE2(Object) = 6;
*(_QWORD *)&Timer.gap0[16] = &Timer.gap0[8];
DWORD1(Object) = 0;
*(_QWORD *)&Timer.gap0[8] = &Timer.gap0[8];
Dpc.DeferredRoutine = (void(__fastcall *)(_KDPC *, void *, void *, void *))KiPassiveIsrWatchdog;
Dpc.DeferredContext = &Object;
Timer.gap0[0] = 8;
*(_DWORD *)&Timer.gap0[4] = 0;
Timer.DueTime.QuadPart = 0i64;
Timer.Period = 0;
Timer.Processor = 0;
Dpc.TargetInfoAsUlong = 275;
Dpc.DpcData = 0i64;
Dpc.ProcessorHistory = 0i64;
KiSetTimerEx(&Timer, (_LARGE_INTEGER)(-10000000i64 * KiPassiveWatchdogTimeout), 0i64, 0, &Dpc);
v13 = 1;
}
v7 = 1;
}
Interrupt->ServiceThread = (_ETHREAD *)KeGetCurrentThread();
if( v8 )
EtwGetKernelTraceTimestamp(TimeStamp, 0x20004000ui64);
KiCallInterruptServiceRoutine(Interrupt, v7);
v11 = v10;
if( v8 )
PerfInfoLogInterrupt(Interrupt, (v3 << 8) | (unsigned int)v10, (_ETW_KERNEL_TRACE_TIMESTAMP *)TimeStamp);
if( v13 && !(unsigned __int8)KeCancelTimer((INT64)&Timer) )
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
Interrupt->ServiceThread = 0i64;
if( (_BYTE)SynchronizeIrql )
{
if( InterruptIrql != (_BYTE)SynchronizeIrql )
__writecr8(InterruptIrql);
}
else
{
KeSetEvent(Interrupt->PassiveEvent, 0, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
return v11 == 1;
}Referenced by:
KiInterruptDispatchCommon