PpmUpdateTimeAccumulation

ULONGLONG __fastcall PpmUpdateTimeAccumulation(__int64 a1, __int64 a2, char a3){
  ULONGLONG result; 
  ULONGLONG v7; 
  ULONGLONG v8; 
  UINT64 v9; 
  unsigned __int64 v10; 
  result = __rdtsc();
  v7 = result;
  if( (*(_QWORD *)(a1 + 34208) & 0x8000000000i64) != 0 )
  {
    result = __readmsr(0xDB2u);
    v8 = result;
  }
  else
  {
    v8 = 0i64;
  }
  if( a3 )
  {
    v9 = a2 - *(_QWORD *)(a1 + 32880);
    result = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 32896), a2 - *(_QWORD *)(a1 + 32880));
    if( (*(_QWORD *)(a1 + 34208) & 0x8000000000i64) != 0 )
    {
      result = PpmConvertTime(v9, v7 - *(_QWORD *)(a1 + 32848), v8 - *(_QWORD *)(a1 + 32960));
      *(_QWORD *)(a1 + 32968) += result;
    }
  }
  *(_QWORD *)(a1 + 32880) = a2;
  if( a3 )
  {
    v10 = *(_QWORD *)(a1 + 32848);
    if( v7 > v10 )
    {
      result = v7 - v10;
      *(_QWORD *)(a1 + 32856) += v7 - v10;
    }
  }
  *(_QWORD *)(a1 + 32848) = v7;
  if( (*(_QWORD *)(a1 + 34208) & 0x8000000000i64) != 0 )
    *(_QWORD *)(a1 + 32960) = v8;
  return result;
}

Referenced by:

PpmContinueActiveTimeAccumulation