PopFxTracePerfRegistration

void __fastcall PopFxTracePerfRegistration(unsigned int *a1, char a2, EVENT_DESCRIPTOR *a3){
  EVENT_DESCRIPTOR *v5; 
  EVENT_DESCRIPTOR *v6; 
  EVENT_DESCRIPTOR *v7; 
  unsigned int v8; 
  unsigned int v9; 
  __int64 v10; 
  __int64 v11; 
  UINT64 *PoolWithTag; 
  unsigned int i; 
  __int64 v14; 
  __int64 v15; 
  __int64 Name; 
  PO_FX_PERF_STATE_TYPE Type; 
  unsigned int v18; 
  __int64 j; 
  UINT64 Minimum; 
  UINT64 Maximum; 
  UINT64 *States; 
  UINT64 StatesCount; 
  if( a2 )
  {
    v5 = (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_PERFORMANCE_STATE_REGISTRATION_RUNDOWN;
  }
  else
  {
    v5 = (EVENT_DESCRIPTOR *)POP_ETW_EVENT_PERFORMANCE_STATE_REGISTRATION;
    PopFxAddLogEntry(
      *(_QWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 80i64) + 48i64),
      *(_DWORD *)(*(_QWORD *)a1 + 16i64),
      12,
      a1[36]);
  }
  if( PopDiagHandleRegistered && EtwEventEnabled(PopDiagHandle, v5, a3) )
  {
    PopDiagTraceFxPerfRegistration(
      v5,
      *(PVOID *)(*(_QWORD *)(*(_QWORD *)a1 + 80i64) + 48i64),
      *(unsigned int *)(*(_QWORD *)a1 + 16i64),
      a1[36]);
    v7 = (EVENT_DESCRIPTOR *)POP_ETW_EVENT_PERFORMANCE_STATE_SET_REGISTRATION_RUNDOWN;
    if( !a2 )
      v7 = (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_PERFORMANCE_STATE_SET_REGISTRATION;
    if( EtwEventEnabled(PopDiagHandle, v7, v6) )
    {
      v8 = a1[36];
      v9 = 0;
      if( v8 )
      {
        v10 = *((_QWORD *)a1 + 19);
        v11 = v8;
        do
        {
          if( !*(_DWORD *)(*(_QWORD *)v10 + 28i64) && *(_DWORD *)(*(_QWORD *)v10 + 32i64) > v9 )
            v9 = *(_DWORD *)(*(_QWORD *)v10 + 32i64);
          v10 += 32i64;
          --v11;
        }
        while( v11 );
      }
      if( v9 )
      {
        if( 8 * (unsigned __int64)v9 > 0xFFFFFFFF )
          return;
        PoolWithTag = (UINT64 *)ExAllocatePoolWithTag(PagedPool, 8 * v9, 0x4D584650ui64);
        if( !PoolWithTag )
          return;
      }
      else
      {
        PoolWithTag = 0i64;
      }
      for( i = 0; i < a1[36]; ++i )
      {
        v14 = *((_QWORD *)a1 + 19);
        v15 = 32i64 * i;
        Name = *(_QWORD *)(v15 + v14);
        Type = *(_DWORD *)(Name + 28);
        if( Type )
        {
          Minimum = *(_QWORD *)(Name + 32);
          v18 = 0;
          Maximum = *(_QWORD *)(Name + 40);
          States = 0i64;
        }
        else
        {
          memset((INT64)PoolWithTag, 0i64);
          v18 = *(_DWORD *)(Name + 32);
          for( j = 0i64; (unsigned int)j < v18; v18 = *(_DWORD *)(Name + 32) )
          {
            PoolWithTag[j] = *(_QWORD *)(*(_QWORD *)(Name + 40) + 16i64 * (unsigned int)j);
            j = (unsigned int)(j + 1);
          }
          v14 = *((_QWORD *)a1 + 19);
          Minimum = 0i64;
          Type = *(_DWORD *)(Name + 28);
          Maximum = 0i64;
          States = PoolWithTag;
        }
        LODWORD(StatesCount) = v18;
        PopDiagTraceFxPerfSetRegistration(
          v7,
          *(PVOID *)(*(_QWORD *)(*(_QWORD *)a1 + 80i64) + 48i64),
          *(unsigned int *)(*(_QWORD *)a1 + 16i64),
          i,
          Type,
          *(PO_FX_PERF_STATE_UNIT *)(Name + 24),
          Minimum,
          Maximum,
          (UNICODE_STRING *)Name,
          StatesCount,
          States,
          *(_QWORD *)(v15 + v14 + 8));
      }
      if( PoolWithTag )
        ExFreePoolWithTag(PoolWithTag, 0x4D584650u);
    }
  }
}

Referenced by:

PopFxRegisterComponentPerfStates
PopFxTraceDeviceRegistration