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