HalpVpptArmTimer
NTSTATUS __stdcall HalpVpptArmTimer(PVOID TimerData, _TIMER_MODE Mode, UINT64 TickCount){
UINT64 v3;
__int64 v7;
int v8;
_QWORD *v9;
PVOID *v10;
__int64 v11;
unsigned __int64 v12;
UINT64 v13;
INT64 *v14;
INT64 *i;
INT64 v16;
unsigned __int64 v17;
INT64 CurrentQpc;
v3 = TickCount;
if( ((Mode - 1) & 0xFFFFFFFD) != 0 )
return -1073741637;
if( *((_DWORD *)qword_140C4A480 + 57) == 2 )
v3 = HalpTimerScaleCounter(TickCount, *((_QWORD *)qword_140C4A480 + 24), 0x989680ui64);
byte_140C4A478[0] = HalpAcquireHighLevelLock(&unk_140C4A470);
if( (INT64 *)Arg2 == &Arg2 )
{
v7 = 0i64;
v8 = -1;
}
else
{
v7 = *(_QWORD *)(Arg2 + 32);
v8 = *(_DWORD *)(Arg2 + 16);
}
if( *((_BYTE *)TimerData + 24) )
{
v9 = *(_QWORD **)TimerData;
v10 = (PVOID *)*((_QWORD *)TimerData + 1);
if( *(PVOID *)(*(_QWORD *)TimerData + 8i64) != TimerData || *v10 != TimerData )
goto LABEL_19;
*v10 = v9;
v9[1] = v10;
}
CurrentQpc = 0i64;
LODWORD(v11) = RtlGetInterruptTimePrecise(&CurrentQpc);
v12 = v11 + v3;
v13 = 0i64;
*((_QWORD *)TimerData + 4) = v12;
if( Mode != TimerModeOneShot )
v13 = v3;
*((_QWORD *)TimerData + 5) = v13;
v14 = &Arg2;
for( i = (INT64 *)Arg2; i != &Arg2 && v12 >= i[4]; i = (INT64 *)*i )
v14 = i;
v16 = *v14;
if( *(INT64 **)(*v14 + 8) != v14 )
LABEL_19:
__fastfail(3u);
*(_QWORD *)TimerData = v16;
*((_QWORD *)TimerData + 1) = v14;
*(_QWORD *)(v16 + 8) = TimerData;
*v14 = (INT64)TimerData;
if( *(_QWORD *)(Arg2 + 32) != v7 || *(_DWORD *)(Arg2 + 16) != v8 )
HalpVpptUpdatePhysicalTimer();
*((_DWORD *)TimerData + 5) = 2;
*((_BYTE *)TimerData + 24) = 1;
v17 = byte_140C4A478[0];
KxReleaseSpinLock(&unk_140C4A470);
__writecr8(v17);
return 0;
}Referenced by:
No references.