PopFxCompleteComponentPerfState

void __fastcall PopFxCompleteComponentPerfState(__int64 a1, unsigned int a2, __int64 a3, unsigned __int8 a4){
  signed __int32 v8; 
  __int64 v9; 
  int v10; 
  EVENT_DESCRIPTOR *i; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  EVENT_DESCRIPTOR *v15; 
  v8 = _InterlockedExchangeAdd((volatile signed __int32 *)(a3 + 40), 0xFFFFFFFF);
  v9 = *(_QWORD *)(a3 + 80);
  v10 = v8 - 1;
  for( i = 0i64;
        (unsigned int)i < *(_DWORD *)(a3 + 56);
        *(_QWORD *)(v13 + 8) = *(_QWORD *)(*(_QWORD *)(a3 + 48) + 8 * v12 + 8) )
  {
    v12 = (unsigned int)i;
    i = (EVENT_DESCRIPTOR *)(unsigned int)((_DWORD)i + 1);
    v12 *= 2i64;
    v13 = *(_QWORD *)(a3 + 152) + 32i64 * *(unsigned int *)(*(_QWORD *)(a3 + 48) + 8 * v12);
    *(_QWORD *)(v13 + 16) = *(_QWORD *)(a3 + 64);
    *(_BYTE *)(v13 + 24) = 0;
  }
  PopDiagTraceFxPerfRequestProgress((__int64 *)a3, v10 & 7, i);
  if( v10 >= 0 )
  {
    v10 = _InterlockedDecrement((volatile signed __int32 *)(a3 + 40));
    if( (v10 & 0x8000000) == 0 )
      PopFxAddLogEntry(*(_QWORD *)(a1 + 48), a2, 15, 1i64);
  }
  LOBYTE(v14) = a4;
  (*(void(__fastcall **)(_QWORD, _QWORD, __int64, __int64))(a3 + 32))(*(_QWORD *)(a1 + 192), a2, v14, v9);
  if( v10 < 0 )
  {
    _InterlockedDecrement((volatile signed __int32 *)(a3 + 40));
    KeSetEvent((PRKEVENT)(a3 + 8), 0);
  }
  PopDiagTraceFxPerfRequestComplete((__int64 *)a3, a4, v15);
}

Referenced by:

PopFxComponentPerfWork
PopFxIssueComponentPerfStateChanges
PopFxProcessWork