HalpVpptAcknowledgeInterrupt
VOID __stdcall HalpVpptAcknowledgeInterrupt(PVOID TimerData){
PVOID v2;
PVOID v3;
__int64 v4;
__int64 v5;
void *v6;
void *v7;
__int64 v8;
ULONG_PTR v9;
ULONG_PTR v10;
ULONG_PTR *v11;
ULONG_PTR *v12;
ULONG_PTR v13;
__int64 v14;
__int64 v15;
unsigned __int64 v16;
INT64 CurrentQpc;
byte_140C4A478 = HalpAcquireHighLevelLock(&qword_140C4A470);
HalpTimerGetInternalData((KDPC *)HalpVpptPhysicalTimer, (PVOID)HalpVpptPhysicalTimer, v2, v3);
(*(void(__fastcall **)(__int64))(v4 + 120))(v5);
if( !(unsigned __int8)((__int64(*)(void))HalpVpptSkipApi)() )
{
if( (PVOID)HalpVpptQueue != TimerData )
goto LABEL_15;
v8 = *(_QWORD *)HalpVpptQueue;
if( *(ULONG_PTR **)(HalpVpptQueue + 8) == &HalpVpptQueue && *(_QWORD *)(v8 + 8) == HalpVpptQueue )
{
HalpVpptQueue = *(_QWORD *)HalpVpptQueue;
*(_QWORD *)(v8 + 8) = &HalpVpptQueue;
if( !*((_QWORD *)TimerData + 5) )
{
*((_BYTE *)TimerData + 24) = 0;
LABEL_15:
if( (ULONG_PTR *)HalpVpptQueue == &HalpVpptQueue )
{
HalpTimerGetInternalData((KDPC *)HalpVpptPhysicalTimer, (PVOID)HalpVpptPhysicalTimer, v6, v7);
(*(void(__fastcall **)(__int64))(v14 + 136))(v15);
}
else
{
HalpVpptUpdatePhysicalTimer();
}
goto LABEL_20;
}
CurrentQpc = 0i64;
LODWORD(v9) = RtlGetInterruptTimePrecise(&CurrentQpc);
v10 = *((_QWORD *)TimerData + 4);
if( v10 <= v9 )
{
do
v10 += *((_QWORD *)TimerData + 5);
while( v10 <= v9 );
*((_QWORD *)TimerData + 4) = v10;
}
v11 = (ULONG_PTR *)HalpVpptQueue;
v12 = &HalpVpptQueue;
while( v11 != &HalpVpptQueue && v10 >= v11[4] )
{
v12 = v11;
v11 = (ULONG_PTR *)*v11;
}
v13 = *v12;
if( *(ULONG_PTR **)(*v12 + 8) == v12 )
{
*(_QWORD *)TimerData = v13;
*((_QWORD *)TimerData + 1) = v12;
*(_QWORD *)(v13 + 8) = TimerData;
*v12 = (ULONG_PTR)TimerData;
goto LABEL_15;
}
}
__fastfail(3u);
}
LABEL_20:
v16 = (unsigned __int8)byte_140C4A478;
KxReleaseSpinLock(&qword_140C4A470);
__writecr8(v16);
}Referenced by:
No references.