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