KiAdjustTimersAfterDripsExit
VOID __fastcall KiAdjustTimersAfterDripsExit(_KPRCB *Prcb, _BYTE *a2){
__int64 v2;
_KPRCB *v3;
unsigned __int8 CurrentIrql;
__int128 v5[2];
__int64 v6;
memset(v5, 0, sizeof(v5));
v6 = 0i64;
if( KiSerializeTimerExpiration )
{
v2 = (__int64)&a2[-KiClockTimerOneShotStartTime];
*((_QWORD *)&v5[1] + 1) = v2;
if( v2 > 10000000i64 * (unsigned int)KiTimerRebaseThresholdOnDripsExit )
{
KUSER_SHARED_DATA.InterruptTimeBias += v2;
if( (KUSER_SHARED_DATA.InterruptTimeBias & 0x8000000000000000ui64) != 0i64 )
__fastfail(5u);
*((_QWORD *)&v5[1] + 1) = -*((_QWORD *)&v5[1] + 1);
DWORD1(v5[0]) = 0;
v3 = KiProcessorBlock;
if( !KiSerializeTimerExpiration )
v3 = Prcb;
LOBYTE(v5[0]) = 1;
LOBYTE(v6) = 1;
*(__int128 *)((char *)v5 + 8) = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiAdjustTimerDueTimes((__int64)KeGetCurrentPrcb(), (__int64)v3 + 14656, (__int64)v5);
__writecr8(CurrentIrql);
}
}
}Referenced by:
KeResumeClockTimerFromIdle