KeEstimateClockTickDuration
VOID __stdcall KeEstimateClockTickDuration(
_KPRCB *Prcb,
UINT8 ScanAll,
UINT8 DeepSleepEnabled,
UINT64 CurrentTime,
UINT64 *NextDueTickDuration,
_KEXPECTED_WAKE_REASON *ExpectedWakeReason){
unsigned __int64 v6;
__int64 v7;
UINT64 *NextDueTime;
_KEXPECTED_WAKE_REASON v9[2];
_DWORD *v10;
*(_QWORD *)v9 = 0i64;
v6 = KiClockTimerNextTickTime;
if( Prcb->ClockOwner )
{
if( ScanAll )
{
if( (_BYTE)KiDynamicTickDisableReason || KiClockState )
ScanAll = 0;
if( ScanAll )
{
LOBYTE(NextDueTime) = CurrentTime;
KiGetNextTimerExpirationDueTime(Prcb, 1u, (UINT64)NextDueTickDuration, DeepSleepEnabled, NextDueTime, v9);
if( (unsigned __int64)NextDueTickDuration + (unsigned int)KiLastRequestedTimeIncrement < *(_QWORD *)v9 )
v6 = *(_QWORD *)v9;
}
}
}
else
{
LOBYTE(NextDueTime) = CurrentTime;
KiGetNextTimerExpirationDueTime(Prcb, 0, (UINT64)NextDueTickDuration, DeepSleepEnabled, NextDueTime, v9);
if( v6 <= *(_QWORD *)v9 )
v6 = *(_QWORD *)v9;
}
v7 = -1i64;
if( v6 != -1i64 )
{
if( v6 <= (unsigned __int64)NextDueTickDuration )
v7 = 0i64;
else
v7 = v6 - (_QWORD)NextDueTickDuration;
}
*(_QWORD *)ExpectedWakeReason = v7;
*v10 = 2;
}Referenced by:
PpmEstimateIdleDuration