KiGetNextTimerExpirationDueTime

VOID __stdcall KiGetNextTimerExpirationDueTime(
        _KPRCB *Prcb,
        UINT8 ScanAll,
        UINT64 InterruptTime,
        UINT8 DeepSleepEnabled,
        UINT64 *NextDueTime,
        _KEXPECTED_WAKE_REASON *ExpectedWakeReason){
  UINT64 NextTimerDueTime; 
  unsigned __int64 v7; 
  UINT8 v9; 
  __int64 v11; 
  int v12; 
  UINT64 NextWakeTimeForDeepSleep; 
  unsigned __int64 v14; 
  char *v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  UINT64 v18; 
  UINT64 v19; 
  UINT64 v20; 
  unsigned __int64 v21; 
  int *v24; 

  NextTimerDueTime = 0i64;
  v7 = -1i64;
  v9 = ScanAll;
  v21 = -1i64;
  if( Prcb->NextThread )
  {
    v12 = 1;
    goto LABEL_14;
  }
  if( PoSkipTickMode == 2 && !KiSerializeTimerExpiration && !Prcb->ClockOwner )
  {
    v12 = 2;
    goto LABEL_14;
  }
  NextTimerDueTime = -1i64;
  v11 = 4i64;
  v12 = 4;
  if( DeepSleepEnabled )
  {
    NextWakeTimeForDeepSleep = ExGetNextWakeTimeForDeepSleep();
    v21 = NextWakeTimeForDeepSleep;
  }
  else
  {
    NextWakeTimeForDeepSleep = -1i64;
    NextTimerDueTime = KiFindNextTimerDueTime(Prcb, InterruptTime, ScanAll);
  }
  if( KiGroupSchedulingEnabled )
  {
    if( v9 )
    {
      if( KeIsEmptyAffinityEx(&KiGroupSchedulingOverQuotaMask.Count) )
        goto LABEL_7;
    }
    else
    {
      v14 = (unsigned __int64)&KiGroupSchedulingOverQuotaMask;
      v16 = (unsigned int)KiProcessorIndexToNumberMappingTable[Prcb->Number];
      if( ((KiGroupSchedulingOverQuotaMask.Bitmap[v16 >> 6] >> (v16 & 0x3F)) & 1) == 0 )
        goto LABEL_7;
    }
    if( *(&KiSwapEvent + 41) * (unsigned __int64)(unsigned int)KeMaximumIncrement < NextWakeTimeForDeepSleep )
    {
      NextWakeTimeForDeepSleep = *(&KiSwapEvent + 41) * (unsigned int)KeMaximumIncrement;
      v21 = NextWakeTimeForDeepSleep;
      v12 = 5;
    }
  }
LABEL_7:
  if( Prcb->ClockOwner )
  {
    v14 = -1i64;
    if( !DeepSleepEnabled )
      v11 = 2i64;
    LOBYTE(v15) = 0;
    do
    {
      v17 = qword_140C31A50[3 * v11];
      if( v11 == 2 )
      {
        if( v17 < v7 )
          v7 = qword_140C31A50[6];
      }
      else if( v17 < v14 )
      {
        v14 = qword_140C31A50[3 * v11];
        if( v11 == 4 )
          LOBYTE(v15) = 1;
      }
      ++v11;
    }
    while( v11 <= 4 );
    v9 = ScanAll;
    if( v7 < NextTimerDueTime )
    {
      NextTimerDueTime = v7;
      v12 = 6;
    }
    NextWakeTimeForDeepSleep = v21;
    if( v14 < v21 )
    {
      v21 = v14;
      NextWakeTimeForDeepSleep = v14;
      if( v14 < NextTimerDueTime )
      {
        v12 = 6;
        if( (_BYTE)v15 )
          v12 = 7;
      }
    }
  }
  if( (KiVelocityFlags & 0x2000) != 0 )
  {
    NextWakeTimeForDeepSleep = v21;
    v15 = (char *)KiLastNonHrTimerExpiration
        + (unsigned int)KeNonHrTimeIncrement
        - (unsigned __int64)(unsigned int)(KeMinimumIncrement - 1);
    if( KePseudoHrTimeIncrement < (unsigned int)KeNonHrTimeIncrement && v21 < (unsigned __int64)v15 )
    {
      v14 = v21 + (unsigned int)KeNonHrTimeIncrement;
      NextWakeTimeForDeepSleep = (unsigned int)KePseudoHrTimeIncrement + InterruptTime;
      if( NextWakeTimeForDeepSleep < (unsigned __int64)v15 )
      {
        v19 = (unsigned int)KePseudoHrTimeIncrement + InterruptTime;
        do
        {
          v19 += (unsigned int)KePseudoHrTimeIncrement;
          if( v19 > v14 )
            break;
          NextWakeTimeForDeepSleep = v19;
        }
        while( v19 < (unsigned __int64)v15 );
      }
    }
  }
  if( NextTimerDueTime >= NextWakeTimeForDeepSleep )
    NextTimerDueTime = NextWakeTimeForDeepSleep;
  if( v9 )
  {
    if( KiClockOwnerOneShotRequest && KiClockOwnerOneShotRequest < NextTimerDueTime )
    {
      NextTimerDueTime = KiClockOwnerOneShotRequest;
      v12 = 6;
    }
    if( !(_BYTE)KdDebuggerNotPresent )
    {
      if( (_BYTE)KdDebuggerEnabled )
      {
        if( InterruptTime < NextTimerDueTime )
        {
          v20 = (unsigned int)(10000 * KiDebugPollInterval);
          if( NextTimerDueTime - InterruptTime > v20 )
          {
            NextTimerDueTime = v20 + InterruptTime;
            v12 = 8;
          }
        }
      }
    }
  }
  if( Prcb->ClockOwner )
  {
    v18 = ((__int64(__fastcall *)(_QWORD, unsigned __int64, char *))off_140C00968[0])(
            (unsigned __int8)NextDueTime,
            v14,
            v15);
    if( v18 )
    {
      if( NextTimerDueTime > v18 )
      {
        NextTimerDueTime = v18;
        v12 = 9;
        if( InterruptTime > v18 )
          NextTimerDueTime = InterruptTime;
      }
    }
  }
LABEL_14:
  *(_QWORD *)ExpectedWakeReason = NextTimerDueTime;
  *v24 = v12;
}

Referenced by:

KeEstimateClockTickDuration
KePrepareClockTimerForIdle
PpmIdlePrepare
PpmIdleSelectStates