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.