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