KiAdjustTimersAfterDripsExit
VOID __stdcall KiAdjustTimersAfterDripsExit(_KPRCB *Prcb){
__int64 v1;
__int64 v2;
_KPRCB *v3;
unsigned __int8 CurrentIrql;
_KI_TIME_ADJUST_CONTEXT AdjustContext[8];
__int64 v6;
memset(AdjustContext, 0, sizeof(AdjustContext));
v6 = 0i64;
if( KiSerializeTimerExpiration )
{
v2 = v1 - KiClockTimerOneShotStartTime;
*(_QWORD *)&AdjustContext[6] = v2;
if( v2 > 10000000i64 * (unsigned int)KiTimerRebaseThresholdOnDripsExit )
{
KUSER_SHARED_DATA.InterruptTimeBias += v2;
if( (KUSER_SHARED_DATA.InterruptTimeBias & 0x8000000000000000ui64) != 0i64 )
__fastfail(5u);
*(_QWORD *)&AdjustContext[6] = -*(_QWORD *)&AdjustContext[6];
AdjustContext[1] = 0;
v3 = KiProcessorBlock;
if( !KiSerializeTimerExpiration )
v3 = Prcb;
LOBYTE(AdjustContext[0]) = 1;
LOBYTE(v6) = 1;
*(_OWORD *)&AdjustContext[2] = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiAdjustTimerDueTimes(KeGetCurrentPrcb(), &v3->TimerTable, AdjustContext);
__writecr8(CurrentIrql);
}
}
}Referenced by:
KeResumeClockTimerFromIdle