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.