KxDispatchInterrupt

BOOL __stdcall KxDispatchInterrupt(){
  struct _KPRCB *CurrentPrcb; 
  ULONG_PTR v1; 
  UINT64 v2; 
  __int64 v3; 
  UINT64 v4; 
  int v5; 
  __int64 v6; 
  int v7; 
  __int64 v8; 
  _KTHREAD *v9; 
  UINT8 v10; 
  BOOL result; 
  CurrentPrcb = KeGetCurrentPrcb();
  v1 = *((_QWORD *)CurrentPrcb + 1);
  _disable();
  ++*((_BYTE *)CurrentPrcb + 32);
  v2 = __rdtsc() - *((_QWORD *)CurrentPrcb + 4056);
  *(_QWORD *)(v1 + 72) += v2;
  v3 = *(unsigned int *)(v1 + 80);
  *((_QWORD *)CurrentPrcb + 4056) += v2;
  v4 = v2 + v3;
  v5 = v4;
  if( HIDWORD(v4) )
    v5 = -1;
  *(_DWORD *)(v1 + 80) = v5;
  if( (*(_BYTE *)(v1 + 2) & 0x3E) != 0 )
    KiEndThreadAccountingPeriod(CurrentPrcb, (_KTHREAD *)v1, v2);
  _enable();
  KiAbProcessContextSwitch((_KTHREAD *)v1, 0i64);
  KiSetVpThreadSpinLockCount();
  if( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
  {
    v7 = 0;
    do
    {
      do
      {
        ++v7;
        _mm_pause();
      }
      while( (*((_QWORD *)CurrentPrcb + 6) & 1i64) != 0 );
    }
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) );
  }
  v8 = *((_QWORD *)CurrentPrcb + 2);
  *((_QWORD *)CurrentPrcb + 2) = 0i64;
  *((_QWORD *)CurrentPrcb + 1) = v8;
  *(_BYTE *)(v8 + 388) = 2;
  *(_BYTE *)(v1 + 643) = 31;
  KiQueueReadyThread((__int64)CurrentPrcb, v1, v6);
  if( (_BYTE)KeSmapEnabled )
    __stac();
  LOBYTE(result) = SwapContext((_KTHREAD *)1, (_KTHREAD *)v9, v10);
  return result;
}

Referenced by:

KiDispatchInterrupt