KiCalibrateTimeAdjustment
void __fastcall KiCalibrateTimeAdjustment(ULONG_PTR Argument){
struct _KPRCB *CurrentPrcb;
unsigned int v3;
char v4;
INT64 v5;
__int64 v6;
unsigned __int64 v7;
LARGE_INTEGER v8;
unsigned __int64 v9;
__int64 v10;
volatile unsigned __int64 v11;
unsigned __int64 v12;
INT64 *v13;
unsigned __int64 v14;
LARGE_INTEGER PerformanceCounter;
UINT64 Flag;
unsigned __int64 v17;
union _LARGE_INTEGER PerformanceFrequency;
__int64 v19;
LARGE_INTEGER v20;
__int64 v21;
unsigned __int64 v22;
EVENT_DATA_DESCRIPTOR EventData;
unsigned int v24;
v20.QuadPart = 0i64;
CurrentPrcb = KeGetCurrentPrcb();
PerformanceFrequency.QuadPart = 0i64;
if( *((_DWORD *)CurrentPrcb + 9) == *(_DWORD *)(Argument + 4) )
{
_disable();
v6 = *(_QWORD *)(Argument + 8);
v3 = v24 >> 9;
v19 = v6;
v7 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
v21 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
v8 = KeQueryPerformanceCounter(&PerformanceFrequency);
if( *(_BYTE *)Argument )
{
LODWORD(v17) = (__PAIR64__(HIDWORD(v19), v6) * PerformanceFrequency.QuadPart) >> 32;
HIDWORD(v17) = PerformanceFrequency.HighPart * HIDWORD(v19)
+ (((((unsigned int)v6 * (unsigned __int64)PerformanceFrequency.LowPart) >> 32)
+ PerformanceFrequency.LowPart * (unsigned __int64)HIDWORD(v19)
+ (unsigned int)v6 * (unsigned __int64)(unsigned int)PerformanceFrequency.HighPart) >> 32);
v9 = v17;
LODWORD(v17) = v6 * PerformanceFrequency.LowPart;
*(_DWORD *)(Argument + 20) = v9 / 0x989680;
HIDWORD(v17) = v9 % 0x989680;
*(_DWORD *)(Argument + 16) = v17 / 0x989680;
*(_QWORD *)(Argument + 16) += v8.QuadPart;
}
v22 = v7 / KeMaximumIncrement;
v10 = *(_QWORD *)(Argument + 8);
KiTickOffset = KeMaximumIncrement - v7 % KeMaximumIncrement;
KUSER_SHARED_DATA.InterruptTimeBias += v10;
LODWORD(v19) = v7 % KeMaximumIncrement;
if( (KUSER_SHARED_DATA.InterruptTimeBias & 0x8000000000000000ui64) != 0i64 )
__fastfail(5u);
RtlWriteAcquireTickLock((INT64 *)&KUSER_SHARED_DATA.TimeUpdateLock);
KUSER_SHARED_DATA.InterruptTime.High2Time = HIDWORD(v21);
*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart = v7;
KUSER_SHARED_DATA.TickCount.High2Time = HIDWORD(v22);
KUSER_SHARED_DATA.TickCountQuad = v11;
KUSER_SHARED_DATA.BaselineInterruptTimeQpc = v12;
KiInterruptTimeErrorAccumulator = 0i64;
RtlWriteReleaseTickLock(v13);
*(_DWORD *)(Argument + 28) = 0;
}
else
{
_disable();
v3 = v24 >> 9;
do
KiPollFreezeExecution();
while( *(_DWORD *)(Argument + 28) );
}
v4 = v3 & 1;
if( KiSelectActiveTimerTable((INT64)CurrentPrcb, 1) )
{
v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
KeRemoveQueueDpc((_KDPC *)((char *)CurrentPrcb + 31792));
KeInsertQueueDpc((PRKDPC)((char *)CurrentPrcb + 31792), (PVOID)((unsigned int)(v14 >> 18) - 256), 0i64);
}
*((_DWORD *)CurrentPrcb + 3149) = KUSER_SHARED_DATA.TickCount.LowPart;
v5 = *(_QWORD *)(Argument + 8);
if( *(_BYTE *)Argument )
{
HalCalibratePerformanceCounter((INT64 *)(Argument + 24), *(_QWORD *)(Argument + 16));
KeRebaselineInterruptTime();
if( (*(_WORD *)(&PerfGlobalGroupMask + 2) & 0x8000) != 0 )
{
PerformanceCounter = KeQueryPerformanceCounter(0i64);
EventData.Reserved = 0;
v20 = PerformanceCounter;
EventData.Size = 8;
EventData.Ptr = (unsigned __int64)&v20;
LODWORD(Flag) = 4200450;
EtwTraceKernelEvent(&EventData, 1ui64, 0x80008000ui64, 0x1232u, Flag);
}
}
if( *((_BYTE *)CurrentPrcb + 33) )
KiUpdateSystemTime(v5, 0i64, 3);
if( v4 )
_enable();
}Referenced by:
No references.