KiGetNextTimerExpirationDueTime

INT64 *__fastcall KiGetNextTimerExpirationDueTime(
        INT64 a1,
        CHAR a2,
        UINT64 a3,
        CHAR a4,
        UINT8 a5,
        UINT64 *a6,
        INT64 *a7){
  UINT64 NextTimerDueTime; 
  unsigned __int64 v8; 
  CHAR v10; 
  __int64 v12; 
  int v13; 
  UINT64 NextWakeTimeForDeepSleep; 
  unsigned __int64 v15; 
  char *v16; 
  INT64 *result; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  UINT64 v20; 
  UINT64 v21; 
  UINT64 v22; 
  unsigned __int64 v23; 
  NextTimerDueTime = 0i64;
  v8 = -1i64;
  v10 = a2;
  v23 = -1i64;
  if( *(_QWORD *)(a1 + 16) )
  {
    v13 = 1;
    goto LABEL_14;
  }
  if( PoSkipTickMode == 2 && !KiSerializeTimerExpiration && !*(_BYTE *)(a1 + 33) )
  {
    v13 = 2;
    goto LABEL_14;
  }
  NextTimerDueTime = -1i64;
  v12 = 4i64;
  v13 = 4;
  if( a4 )
  {
    NextWakeTimeForDeepSleep = ExGetNextWakeTimeForDeepSleep();
    v23 = NextWakeTimeForDeepSleep;
  }
  else
  {
    NextWakeTimeForDeepSleep = -1i64;
    NextTimerDueTime = KiFindNextTimerDueTime((_KPRCB *)a1, a3, a2);
  }
  if( KiGroupSchedulingEnabled )
  {
    if( v10 )
    {
      if( (unsigned int)KeIsEmptyAffinityEx(&KiGroupSchedulingOverQuotaMask) )
        goto LABEL_7;
    }
    else
    {
      v15 = (unsigned __int64)&KiGroupSchedulingOverQuotaMask;
      v18 = (unsigned int)KiProcessorIndexToNumberMappingTable[*(unsigned int *)(a1 + 36)];
      if( ((KiGroupSchedulingOverQuotaMask.Bitmap[v18 >> 6] >> (v18 & 0x3F)) & 1) == 0 )
        goto LABEL_7;
    }
    if( KiGenerationEndTick * (unsigned __int64)KeMaximumIncrement < NextWakeTimeForDeepSleep )
    {
      NextWakeTimeForDeepSleep = KiGenerationEndTick * KeMaximumIncrement;
      v23 = NextWakeTimeForDeepSleep;
      v13 = 5;
    }
  }
LABEL_7:
  if( *(_BYTE *)(a1 + 33) )
  {
    v15 = -1i64;
    if( !a4 )
      v12 = 2i64;
    LOBYTE(v16) = 0;
    do
    {
      v19 = qword_140C31A50[3 * v12];
      if( v12 == 2 )
      {
        if( v19 < v8 )
          v8 = qword_140C31A50[6];
      }
      else if( v19 < v15 )
      {
        v15 = qword_140C31A50[3 * v12];
        if( v12 == 4 )
          LOBYTE(v16) = 1;
      }
      ++v12;
    }
    while( v12 <= 4 );
    v10 = a2;
    if( v8 < NextTimerDueTime )
    {
      NextTimerDueTime = v8;
      v13 = 6;
    }
    NextWakeTimeForDeepSleep = v23;
    if( v15 < v23 )
    {
      v23 = v15;
      NextWakeTimeForDeepSleep = v15;
      if( v15 < NextTimerDueTime )
      {
        v13 = 6;
        if( (_BYTE)v16 )
          v13 = 7;
      }
    }
  }
  if( (KiVelocityFlags & 0x2000) != 0 )
  {
    NextWakeTimeForDeepSleep = v23;
    v16 = (char *)KiLastNonHrTimerExpiration
        + (unsigned int)KeNonHrTimeIncrement
        - (unsigned __int64)(unsigned int)(KeMinimumIncrement - 1);
    if( KePseudoHrTimeIncrement < (unsigned int)KeNonHrTimeIncrement && v23 < (unsigned __int64)v16 )
    {
      v15 = v23 + (unsigned int)KeNonHrTimeIncrement;
      NextWakeTimeForDeepSleep = (unsigned int)KePseudoHrTimeIncrement + a3;
      if( NextWakeTimeForDeepSleep < (unsigned __int64)v16 )
      {
        v21 = (unsigned int)KePseudoHrTimeIncrement + a3;
        do
        {
          v21 += (unsigned int)KePseudoHrTimeIncrement;
          if( v21 > v15 )
            break;
          NextWakeTimeForDeepSleep = v21;
        }
        while( v21 < (unsigned __int64)v16 );
      }
    }
  }
  if( NextTimerDueTime >= NextWakeTimeForDeepSleep )
    NextTimerDueTime = NextWakeTimeForDeepSleep;
  if( v10 )
  {
    if( KiClockOwnerOneShotRequest && KiClockOwnerOneShotRequest < NextTimerDueTime )
    {
      NextTimerDueTime = KiClockOwnerOneShotRequest;
      v13 = 6;
    }
    if( !(_BYTE)KdDebuggerNotPresent )
    {
      if( (_BYTE)KdDebuggerEnabled )
      {
        if( a3 < NextTimerDueTime )
        {
          v22 = (unsigned int)(10000 * KiDebugPollInterval);
          if( NextTimerDueTime - a3 > v22 )
          {
            NextTimerDueTime = v22 + a3;
            v13 = 8;
          }
        }
      }
    }
  }
  if( *(_BYTE *)(a1 + 33) )
  {
    v20 = ((__int64(__fastcall *)(_QWORD, unsigned __int64, char *))off_140C00968[0])(a5, v15, v16);
    if( v20 )
    {
      if( NextTimerDueTime > v20 )
      {
        NextTimerDueTime = v20;
        v13 = 9;
        if( a3 > v20 )
          NextTimerDueTime = a3;
      }
    }
  }
LABEL_14:
  *a6 = NextTimerDueTime;
  result = a7;
  *(_DWORD *)a7 = v13;
  return result;
}

Referenced by:

KeEstimateClockTickDuration
KePrepareClockTimerForIdle
PpmIdlePrepare
PpmIdleSelectStates