KiCalibrateTimeAdjustment
void __fastcall KiCalibrateTimeAdjustment(__int64 a1){
struct _KPRCB *CurrentPrcb;
unsigned int v3;
char v4;
UINT64 v5;
__int64 v6;
unsigned __int64 v7;
UINT64 v8;
unsigned __int64 v9;
__int64 v10;
volatile unsigned __int64 v11;
unsigned __int64 v12;
__int64 *v13;
unsigned __int64 v14;
UINT64 PerformanceCounter;
unsigned __int64 v16;
_LARGE_INTEGER PerformanceFrequency;
__int64 v18;
UINT64 v19;
__int64 v20;
unsigned __int64 v21;
__int64 *v22;
int v23;
int v24;
unsigned int v25;
v19 = 0i64;
CurrentPrcb = KeGetCurrentPrcb();
PerformanceFrequency.QuadPart = 0i64;
if( CurrentPrcb->Number == *(_DWORD *)(a1 + 4) )
{
_disable();
v6 = *(_QWORD *)(a1 + 8);
v3 = v25 >> 9;
v18 = v6;
v7 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
v20 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart + v6;
v8 = KeQueryPerformanceCounter(&PerformanceFrequency);
if( *(_BYTE *)a1 )
{
LODWORD(v16) = (__PAIR64__(HIDWORD(v18), v6) * PerformanceFrequency.QuadPart) >> 32;
HIDWORD(v16) = PerformanceFrequency.anonymous_0.HighPart * HIDWORD(v18)
+ (((((unsigned int)v6 * (unsigned __int64)PerformanceFrequency.anonymous_0.LowPart) >> 32)
+ PerformanceFrequency.anonymous_0.LowPart * (unsigned __int64)HIDWORD(v18)
+ (unsigned int)v6 * (unsigned __int64)(unsigned int)PerformanceFrequency.anonymous_0.HighPart) >> 32);
v9 = v16;
LODWORD(v16) = v6 * PerformanceFrequency.anonymous_0.LowPart;
*(_DWORD *)(a1 + 20) = v9 / 0x989680;
HIDWORD(v16) = v9 % 0x989680;
*(_DWORD *)(a1 + 16) = v16 / 0x989680;
*(_QWORD *)(a1 + 16) += v8;
}
v21 = v7 / (unsigned int)KeMaximumIncrement;
v10 = *(_QWORD *)(a1 + 8);
KiTickOffset = KeMaximumIncrement - v7 % (unsigned int)KeMaximumIncrement;
KUSER_SHARED_DATA.InterruptTimeBias += v10;
LODWORD(v18) = v7 % (unsigned int)KeMaximumIncrement;
if( (KUSER_SHARED_DATA.InterruptTimeBias & 0x8000000000000000ui64) != 0i64 )
__fastfail(5u);
RtlWriteAcquireTickLock((signed __int64 *)&KUSER_SHARED_DATA.TimeUpdateLock);
KUSER_SHARED_DATA.InterruptTime.High2Time = HIDWORD(v20);
*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart = v7;
KUSER_SHARED_DATA.TickCount.High2Time = HIDWORD(v21);
KUSER_SHARED_DATA.TickCountQuad = v11;
KUSER_SHARED_DATA.BaselineInterruptTimeQpc = v12;
qword_140C50398 = 0i64;
RtlWriteReleaseTickLock(v13);
*(_DWORD *)(a1 + 28) = 0;
}
else
{
_disable();
v3 = v25 >> 9;
do
KiPollFreezeExecution();
while( *(_DWORD *)(a1 + 28) );
}
v4 = v3 & 1;
if( KiSelectActiveTimerTable(CurrentPrcb, 1u) )
{
v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
KeRemoveQueueDpc(&CurrentPrcb->TimerExpirationDpc);
KeInsertQueueDpc((UINT64)&CurrentPrcb->TimerExpirationDpc, (unsigned int)(v14 >> 18) - 256, 0i64);
}
CurrentPrcb->LastTick = KUSER_SHARED_DATA.TickCount.LowPart;
v5 = *(_QWORD *)(a1 + 8);
if( *(_BYTE *)a1 )
{
HalCalibratePerformanceCounter((INT32 *)(a1 + 24), *(_QWORD *)(a1 + 16));
KeRebaselineInterruptTime();
if( (xmmword_140CFB490 & 0x8000) != 0 )
{
PerformanceCounter = KeQueryPerformanceCounter(0i64);
v24 = 0;
v19 = PerformanceCounter;
v23 = 8;
v22 = (__int64 *)&v19;
EtwTraceKernelEvent((__int64)&v22, 1u, 0x80008000, 0x1232u, 0x401802u);
}
}
if( CurrentPrcb->ClockOwner )
KiUpdateSystemTime(v5, 0i64, 3ui64);
if( v4 )
_enable();
}Referenced by:
No references.