PpmIdleCompleteExitLatencyTrace

__int64 PpmIdleCompleteExitLatencyTrace(__int64 a1, int a2, char a3, ...){
  __int64 v3; 
  unsigned __int64 v4; 
  int v5; 
  __int64 result; 
  UINT64 *ExitTime; 
  UINT64 ProcessorStateIndex; 
  va_list ProcessorStateIndexa; 
  __int64 v10; 
  UINT64 ReturnLatency; 
  UINT64 PlatformStateIndex; 
  UINT64 LatencyTraceFlags; 
  va_list va1; 
  va_start(va1, a3);
  va_start(ProcessorStateIndexa, a3);
  ProcessorStateIndex = va_arg(va1, _QWORD);
  v10 = va_arg(va1, _QWORD);
  ReturnLatency = va_arg(va1, _QWORD);
  PlatformStateIndex = va_arg(va1, _QWORD);
  LatencyTraceFlags = va_arg(va1, _QWORD);
  v3 = a1;
  if( a2 < 0 )
    return PpmCancelExitLatencyTrace(a1);
  if( a3 && (v4 = *(_QWORD *)(*(_QWORD *)(a1 + 0x8000) + 56i64), ProcessorStateIndex > v4) )
    v5 = PpmConvertTime(ProcessorStateIndex - v4, PopQpcFrequency, 0x989680ui64);
  else
    v5 = v10;
  LODWORD(ExitTime) = v5;
  if( !PpmTraceExitLatency(
          (UINT64)ProcessorStateIndexa,
          (unsigned int)PlatformStateIndex,
          (unsigned int)LatencyTraceFlags,
          (unsigned int)ReturnLatency,
          ExitTime) )
  {
    a1 = v3;
    return PpmCancelExitLatencyTrace(a1);
  }
  result = *(_QWORD *)(v3 + 0x8000);
  *(_BYTE *)(result + 3) = 0;
  *(_QWORD *)(result + 56) = 0i64;
  return result;
}

Referenced by:

PpmIdleExecuteTransition