HalpVpptUpdatePhysicalTimer
INT64 __stdcall HalpVpptUpdatePhysicalTimer(){
void *v0;
void *v1;
ULONG_PTR v2;
unsigned __int64 v3;
__int64 v4;
__int64 v5;
INT64 v6;
void *v7;
void *v8;
__int64 v9;
__int64 v10;
int v11;
INT64 v12;
unsigned __int64 v13;
__int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
INT64 result;
INT64 v18;
INT64 CurrentQpc;
v2 = *(unsigned int *)(HalpVpptQueue + 16);
v3 = *(_QWORD *)(HalpVpptQueue + 32);
if( (_DWORD)HalpVpptPhysicalTimerTarget != (_DWORD)v2 )
{
HalpTimerGetInternalData((KDPC *)HalpVpptPhysicalTimer, (PVOID)HalpVpptPhysicalTimer, v0, v1);
(*(void(__fastcall **)(__int64))(v4 + 136))(v5);
if( (*(_DWORD *)(HalpVpptPhysicalTimer + 224) & 0x200000) == 0 )
{
HalpTimerGetInternalData((KDPC *)HalpVpptPhysicalTimer, (PVOID)HalpVpptPhysicalTimer, v7, v8);
(*(void(__fastcall **)(__int64))(v9 + 104))(v10);
}
if( (_DWORD)HalpVpptPhysicalTimerTarget != (_DWORD)v2 )
{
v11 = ExtEnvSetVpptTarget(v6, (unsigned int)v2);
if( v11 < 0 )
ExtEnvCriticalFailure(v12, 0x114ui64, (unsigned int)HalpVpptPhysicalTimerTarget, v2, v11);
LODWORD(HalpVpptPhysicalTimerTarget) = v2;
}
}
LODWORD(v13) = RtlGetInterruptTimePrecise(&CurrentQpc);
if( v13 <= v3 )
v15 = v3 - v13;
else
v15 = 0i64;
v16 = 0x989680ui64 / *(_QWORD *)(HalpVpptPhysicalTimer + 192);
if( *(_DWORD *)(HalpVpptPhysicalTimer + 228) == 2 )
{
if( v16 < 0x1312 )
v16 = 4882i64;
}
else if( v16 < 0x1388 )
{
v16 = 5000i64;
}
if( v15 >= v16 )
v16 = v15;
result = HalpSetTimerAnyMode(HalpVpptPhysicalTimer, v16, v14, (unsigned __int64 *)&CurrentQpc);
if( (int)result < 0 )
ExtEnvCriticalFailure(v18, 0x115ui64, HalpVpptPhysicalTimer, v16, (int)result);
return result;
}Referenced by:
HalpVpptAcknowledgeInterrupt
HalpVpptArmTimer
HalpVpptStop