HalpVpptArmTimer
NTSTATUS __stdcall HalpVpptArmTimer(PVOID TimerData, TIMER_MODE Mode, UINT64 TickCount){
UINT64 v3;
__int64 v7;
int v8;
_QWORD *v9;
PVOID *v10;
__int64 v11;
ULONG_PTR v12;
UINT64 v13;
ULONG_PTR *v14;
ULONG_PTR *i;
ULONG_PTR v16;
unsigned __int64 v17;
INT64 CurrentQpc;
v3 = TickCount;
if( ((Mode - 1) & 0xFFFFFFFD) != 0 )
return -1073741637;
if( *(_DWORD *)(HalpVpptPhysicalTimer + 228) == 2 )
v3 = HalpTimerScaleCounter(TickCount, *(_QWORD *)(HalpVpptPhysicalTimer + 192), 0x989680ui64);
byte_140C4A478 = HalpAcquireHighLevelLock(&qword_140C4A470);
if( (ULONG_PTR *)HalpVpptQueue == &HalpVpptQueue )
{
v7 = 0i64;
v8 = -1;
}
else
{
v7 = *(_QWORD *)(HalpVpptQueue + 32);
v8 = *(_DWORD *)(HalpVpptQueue + 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 = &HalpVpptQueue;
for( i = (ULONG_PTR *)HalpVpptQueue; i != &HalpVpptQueue && v12 >= i[4]; i = (ULONG_PTR *)*i )
v14 = i;
v16 = *v14;
if( *(ULONG_PTR **)(*v14 + 8) != v14 )
LABEL_19:
__fastfail(3u);
*(_QWORD *)TimerData = v16;
*((_QWORD *)TimerData + 1) = v14;
*(_QWORD *)(v16 + 8) = TimerData;
*v14 = (ULONG_PTR)TimerData;
if( *(_QWORD *)(HalpVpptQueue + 32) != v7 || *(_DWORD *)(HalpVpptQueue + 16) != v8 )
HalpVpptUpdatePhysicalTimer();
*((_DWORD *)TimerData + 5) = 2;
*((_BYTE *)TimerData + 24) = 1;
v17 = (unsigned __int8)byte_140C4A478;
KxReleaseSpinLock(&qword_140C4A470);
__writecr8(v17);
return 0;
}Referenced by:
No references.