KxDispatchInterrupt

VOID __stdcall KxDispatchInterrupt(){
  struct _KPRCB *CurrentPrcb; 
  _ETHREAD *CurrentThread; 
  UINT64 v2; 
  __int64 CurrentRunTime; 
  UINT64 v4; 
  int v5; 
  int v6; 
  _ETHREAD *NextThread; 

  CurrentPrcb = KeGetCurrentPrcb();
  CurrentThread = CurrentPrcb->CurrentThread;
  _disable();
  ++CurrentPrcb->NestingLevel;
  v2 = __rdtsc() - CurrentPrcb->StartCycles;
  CurrentThread->Tcb.CycleTime += v2;
  CurrentRunTime = CurrentThread->Tcb.CurrentRunTime;
  CurrentPrcb->StartCycles += v2;
  v4 = v2 + CurrentRunTime;
  v5 = v4;
  if( HIDWORD(v4) )
    v5 = -1;
  CurrentThread->Tcb.CurrentRunTime = v5;
  if( (CurrentThread->Tcb.gap0[2] & 0x3E) != 0 )
    KiEndThreadAccountingPeriod(CurrentPrcb, &CurrentThread->Tcb, v2);
  _enable();
  KiAbProcessContextSwitch(&CurrentThread->Tcb, 0i64);
  KiSetVpThreadSpinLockCount();
  if( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
  {
    v6 = 0;
    do
    {
      do
      {
        ++v6;
        _mm_pause();
      }
      while( (CurrentPrcb->PrcbLock & 1) != 0 );
    }
    while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) );
  }
  NextThread = CurrentPrcb->NextThread;
  CurrentPrcb->NextThread = 0i64;
  CurrentPrcb->CurrentThread = NextThread;
  NextThread->Tcb.WaitBlockFill6[68] = 2;
  CurrentThread->Tcb.WaitReason = 31;
  KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
  if( (_BYTE)KeSmapEnabled )
    __stac();
  SwapContext();
}

Referenced by:

KiDispatchInterrupt