KeAccumulateTicks

VOID __stdcall KeAccumulateTicks(
        _KPRCB *Prcb,
        UINT64 LastTick,
        UINT64 CurrentTick,
        UINT8 PreviousIrql,
        CHAR ProcessorMode){
  int v6; 
  int v7; 
  char v9; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v12; 
  INT64 v13; 
  __int64 v14; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  UINT64 BugCheckParameter4; 
  ULONG_PTR v22; 
  unsigned int v23; 
  __int16 v24; 
  unsigned int v25; 
  unsigned int v26; 
  int v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int v30; 
  unsigned int v31; 
  __int64 v32; 
  _KSCB *v33; 
  int v34; 
  v6 = CurrentTick;
  v7 = LastTick;
  v9 = 0;
  KiCheckForTimerExpiration(Prcb);
  *((_DWORD *)Prcb + 3149) = v6;
  v10 = v6 - v7;
  if( !v10 )
  {
    if( KiForceIdleDisabled || (_DWORD)KiForceIdleState != 4 )
      return;
    goto LABEL_18;
  }
  v11 = *((_QWORD *)Prcb + 1);
  v12 = 0;
  if( *((_BYTE *)Prcb + 33) )
  {
    if( !--KiClockPollCycle )
    {
      KiClockPollCycle = KiClockKeepAliveCycle;
      BugCheckParameter4 = (unsigned __int8)KiClockCheckSlot;
      v22 = (ULONG_PTR)*(&KiProcessorBlock + (unsigned __int8)KiClockCheckSlot);
      v23 = (unsigned __int8)KiClockCheckSlot + 1;
      if( v23 >= (unsigned int)KeNumberProcessors_0 )
        LOBYTE(v23) = 0;
      KiClockCheckSlot = v23;
      if( KiCheckKeepAlive(*(unsigned int *)(v22 + 36)) )
      {
        if( !*(_DWORD *)(v22 + 31712) && KeEnableWatchdogTimeout && (KiBugCheckActive & 3) == 0 )
        {
          HvlInvokeHypervisorDebugger(1ui64, BugCheckParameter4);
          KeBugCheckEx(0x101u, (unsigned __int8)KiClockKeepAliveCycle, 0i64, v22, BugCheckParameter4);
        }
        *(_DWORD *)(v22 + 31712) = 0;
      }
    }
  }
  if( ProcessorMode )
  {
    *((_DWORD *)Prcb + 8098) += v10;
    *(_DWORD *)(v11 + 732) += v10;
  }
  else
  {
    *((_DWORD *)Prcb + 8097) += v10;
    if( *((_BYTE *)Prcb + 32) == 2 && *((_BYTE *)Prcb + 12586) )
    {
      v27 = *((_DWORD *)Prcb + 8103);
      *((_DWORD *)Prcb + 8099) += v10;
      v28 = v27 + 1;
      v29 = *((_DWORD *)Prcb + 8104);
      *((_DWORD *)Prcb + 8103) = v28;
      if( v29 )
      {
        v30 = *((_DWORD *)Prcb + 8128);
        v31 = v28;
        if( v30 && v28 >= v30 )
        {
          KiDpcWatchdogCaptureStack((INT64)Prcb);
          v31 = *((_DWORD *)Prcb + 8103);
          v9 = 1;
          v29 = *((_DWORD *)Prcb + 8104);
        }
        if( v31 > v29 )
        {
          if( KeEnableWatchdogTimeout )
          {
            __rdtsc();
            HvlInvokeHypervisorDebugger(3ui64, 0i64);
            if( !(_BYTE)KdDebuggerEnabled || (_BYTE)KdDebuggerNotPresent )
              KeBugCheckEx(
                0x133u,
                0i64,
                *((unsigned int *)Prcb + 8103),
                *((unsigned int *)Prcb + 8104),
                (ULONG_PTR)&KeDpcWatchdogProfileGlobalTriageBlock);
            __int2c();
          }
          *((_DWORD *)Prcb + 8103) = 0;
          KiResetGlobalDpcWatchdogProfiler((INT64)Prcb);
        }
      }
    }
    else if( *((_BYTE *)Prcb + 32) > 1u )
    {
      *((_DWORD *)Prcb + 8100) += v10;
    }
    else
    {
      *(_DWORD *)(v11 + 652) += v10;
    }
    if( PreviousIrql < 2u )
    {
      ++*((_DWORD *)Prcb + 7947);
      v13 = *((_QWORD *)Prcb + 4245);
      *((_DWORD *)Prcb + 7931) = 0;
      if( v13 && *((_QWORD *)Prcb + 4246) != v13 && *((int *)Prcb + 7933) > 0 )
      {
        *((_QWORD *)Prcb + 4246) = v13;
        memset(v13, 0i64);
      }
      goto LABEL_12;
    }
    v16 = *((_DWORD *)Prcb + 7930);
    v17 = *((_DWORD *)Prcb + 7931) + 1;
    *((_DWORD *)Prcb + 7931) = v17;
    if( !v16 )
      goto LABEL_12;
    v18 = *((_DWORD *)Prcb + 7933);
    v19 = v17;
    v20 = v16;
    if( v18 && v17 >= v18 && !v9 )
    {
      KiDpcWatchdogCaptureStack((INT64)Prcb);
      v19 = *((_DWORD *)Prcb + 7931);
      v20 = *((_DWORD *)Prcb + 7930);
    }
    if( v19 < v20 )
      goto LABEL_12;
    if( KeEnableWatchdogTimeout )
    {
      __rdtsc();
      HvlInvokeHypervisorDebugger(2ui64, 0i64);
      if( !(_BYTE)KdDebuggerEnabled || (_BYTE)KdDebuggerNotPresent )
        KeBugCheckEx(0x133u, 1ui64, *((int *)Prcb + 7930), (ULONG_PTR)&KeDpcWatchdogProfileGlobalTriageBlock, 0i64);
      __int2c();
    }
  }
  ++*((_DWORD *)Prcb + 7947);
  *((_DWORD *)Prcb + 7931) = 0;
  KiResetGlobalDpcWatchdogProfiler((INT64)Prcb);
LABEL_12:
  if( v11 != *((_QWORD *)Prcb + 3) && *((_BYTE *)Prcb + 32) <= 1u )
  {
    if( *(char *)(v11 + 195) < 16
      && *(_QWORD *)(v11 + 104)
      && (v32 = *(_QWORD *)(v11 + 104)) != 0
      && (v33 = (_KSCB *)(*((unsigned int *)Prcb + 54) + v32)) != 0i64
      && (KiGetThreadEffectiveRankNonZero((_ETHREAD *)v11, v33, 0i64, 0, 0i64), v34)
      || *(char *)(v11 + 195) < 8 )
    {
      *((_DWORD *)Prcb + 8107) += v10;
    }
  }
  if( v10 < 8 )
  {
    *((_DWORD *)Prcb + 2921) += 15 * (*((_DWORD *)Prcb + 8096) - *((_DWORD *)Prcb + 2920));
    v12 = *((_DWORD *)Prcb + 2921);
    v14 = v10;
    do
    {
      v12 >>= 4;
      --v14;
    }
    while( v14 );
  }
  *((_DWORD *)Prcb + 2921) = v12;
  *((_DWORD *)Prcb + 2920) = *((_DWORD *)Prcb + 8096);
  *((_DWORD *)Prcb + 3143) = (unsigned int)(*((_DWORD *)Prcb + 3143)
                                          + *((_DWORD *)Prcb + 3127)
                                          - *((_DWORD *)Prcb + 3145)) >> v10;
  *((_DWORD *)Prcb + 3145) = *((_DWORD *)Prcb + 3127);
  if( !*((_DWORD *)Prcb + 3126) || (v24 = *((_WORD *)Prcb + 6294), (v24 & 3) != 0) )
  {
    if( (*((_DWORD *)Prcb + 8101))-- == 1 )
    {
      *((_DWORD *)Prcb + 8101) = KiAdjustDpcThreshold;
      v26 = *((_DWORD *)Prcb + 3142);
      if( v26 < KiMaximumDpcQueueDepth )
        *((_DWORD *)Prcb + 3142) = v26 + 1;
    }
  }
  else
  {
    *((_DWORD *)Prcb + 8101) = KiAdjustDpcThreshold;
    if( (v24 & 0x2F) == 0 )
      KiRequestSoftwareInterrupt(Prcb, 2);
    v25 = *((_DWORD *)Prcb + 3142);
    if( *((_DWORD *)Prcb + 3143) < (unsigned int)KiIdealDpcRate && v25 > 1 )
      *((_DWORD *)Prcb + 3142) = v25 - 1;
  }
LABEL_18:
  if( ((_BYTE)KdDebuggerEnabled || KdEventLoggingEnabled) && KiPollSlot == *((_DWORD *)Prcb + 9) )
    KdCheckForDebugBreak();
}

Referenced by:

KeClockInterruptNotify
PpmIdleExecuteTransition