KiUpdateSystemTime
UINT64 __fastcall KiUpdateSystemTime(INT64 a1, INT64 a2, CHAR a3){
LARGE_INTEGER PerformanceCounter;
union _LARGE_INTEGER v7;
UINT64 result;
__int16 v9;
_disable();
RtlWriteAcquireTickLock((INT64 *)&KUSER_SHARED_DATA.TimeUpdateLock);
PerformanceCounter = KeQueryPerformanceCounter(0i64);
v7.QuadPart = KiComputeNewSystemTime(PerformanceCounter.QuadPart);
if( a1 )
{
*(_QWORD *)KiSystemTimeErrorAccumulator = 0i64;
v7.QuadPart = a1 + *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
}
KUSER_SHARED_DATA.BaselineSystemTimeQpc = PerformanceCounter.QuadPart;
KUSER_SHARED_DATA.SystemTime.High2Time = v7.HighPart;
*(union _LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart = v7;
if( a2 )
{
KUSER_SHARED_DATA.QpcSystemTimeIncrement = *(_QWORD *)a2;
KUSER_SHARED_DATA.QpcSystemTimeIncrementShift = *(_BYTE *)(a2 + 8);
}
result = ++KUSER_SHARED_DATA.TimeUpdateLock;
if( (a3 & 1) == 0 )
{
if( (a3 & 4) != 0 )
{
KeBootTimeBias = 0i64;
KeBootTime = v7;
}
else
{
KeBootTime.QuadPart += a1;
KeBootTimeBias += a1;
}
}
if( (v9 & 0x200) != 0 )
_enable();
return result;
}Referenced by:
KeSetTimeAdjustment
KiCalibrateTimeAdjustment
KiSetSystemTimeDpc