KiUpdateRunTime

VOID __stdcall KiUpdateRunTime(INT64 ProcessorMode, INT64 PreviousIrql){
  struct _KPRCB *CurrentPrcb; 
  __int16 v3; 
  unsigned int LowPart; 
  _KPRCB *v5; 
  __int64 CurrentThread; 
  __int64 v7; 
  INT64 v8; 
  struct _KPRCB *v9; 
  _KPRCBFLAG v10; 
  unsigned int PrcbFlags; 
  unsigned int v12; 
  char v13; 
  __int16 v14; 

  CurrentPrcb = KeGetCurrentPrcb();
  v3 = v14;
  ++CurrentPrcb->ClockInterrupts;
  ++CurrentPrcb->InterruptLastCount;
  _disable();
  LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
  if( (v3 & 0x200) != 0 )
    _enable();
  KeAccumulateTicks(
    CurrentPrcb,
    CurrentPrcb->LastTick,
    KUSER_SHARED_DATA.TickCount.LowPart,
    PreviousIrql,
    ProcessorMode);
  CurrentThread = (__int64)CurrentPrcb->CurrentThread;
  CurrentPrcb->ClockKeepAlive = 1;
  if( (_ETHREAD *)CurrentThread != CurrentPrcb->IdleThread )
  {
    if( *(_QWORD *)(CurrentThread + 72) >= *(_QWORD *)(CurrentThread + 32)
      || (unsigned int)KiCheckPreferredHeteroProcessor((_KTHREAD *)CurrentThread, CurrentPrcb) )
    {
      goto LABEL_7;
    }
    v9 = KeGetCurrentPrcb();
    v10.PrcbFlags = (volatile int)v9->PrcbFlags;
    if( (v10.PrcbFlags & 0x300) == 0 )
    {
      if( *(_BYTE *)(CurrentThread + 512) != LOBYTE(v10.PrcbFlags) )
        KeCheckAndApplyBamQos((INT64)v9, CurrentThread, v7, v8);
      goto LABEL_4;
    }
    _disable();
    PrcbFlags = v9->PrcbFlags._bf_0 & 0xFFFFFCFF;
    if( (unsigned __int8)*(_DWORD *)(CurrentThread + 512) != LOBYTE(v9->PrcbFlags.PrcbFlags) )
    {
      v12 = PrcbFlags | ((*(_DWORD *)(CurrentThread + 512) & 3) << 8);
      v9->PrcbFlags._bf_0 = v12;
      v13 = PoSetProcessorQoS((INT64)v9, (v12 >> 8) & 3, v7, v8);
      PrcbFlags = v9->PrcbFlags.PrcbFlags;
      if( !v13 )
      {
LABEL_23:
        if( (PrcbFlags & 0x300) == 0 )
          KeUpdatePendingQosRequest((INT64)v9);
        if( (v14 & 0x200) != 0 )
          _enable();
        goto LABEL_4;
      }
      PrcbFlags &= 0xFFFFFCFF;
    }
    v9->PrcbFlags._bf_0 = PrcbFlags;
    goto LABEL_23;
  }
LABEL_4:
  if( KiCheckGroupSchedulingQuantumEnd(CurrentPrcb, (_KTHREAD *)CurrentThread) )
  {
LABEL_7:
    CurrentPrcb->QuantumEnd = 1;
    if( CurrentPrcb->NestingLevel )
    {
      CurrentPrcb->InterruptRequest = 1;
    }
    else
    {
      LOBYTE(v5) = 2;
      HalRequestSoftwareInterrupt((UINT64)v5);
    }
    return;
  }
  if( (int)(CurrentPrcb->ReadyScanTick - LowPart) < 0
    && (!(unsigned int)KiShouldScanSharedReadyQueue(v5) || (CurrentPrcb->SharedReadyQueue->ReadySummary & 0x7FFE) == 0)
    && (CurrentPrcb->ReadySummary & 0x7FFE) == 0 )
  {
    CurrentPrcb->ReadyScanTick = LowPart + 75;
  }
}

Referenced by:

KiUpdateTime