PopFxTracePerfRegistration

VOID __stdcall PopFxTracePerfRegistration(_POP_FX_PERF_INFO *FxPerf, UINT8 Rundown){
  const _EVENT_DESCRIPTOR *v4; 
  const _EVENT_DESCRIPTOR *v5; 
  unsigned int v6; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  size_t v10; 
  VOID **PoolWithTag; 
  unsigned int i; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  int v16; 
  unsigned int v17; 
  __int64 j; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 

  if( Rundown )
  {
    v4 = &POP_ETW_EVENT_PERFORMANCE_STATE_REGISTRATION_RUNDOWN;
  }
  else
  {
    v4 = (const _EVENT_DESCRIPTOR *)POP_ETW_EVENT_PERFORMANCE_STATE_REGISTRATION;
    PopFxAddLogEntry(
      *(_QWORD *)(*(_QWORD *)(*(_QWORD *)FxPerf + 80i64) + 48i64),
      *(_DWORD *)(*(_QWORD *)FxPerf + 16i64),
      12,
      *((unsigned int *)FxPerf + 36));
  }
  if( PopDiagHandleRegistered && EtwEventEnabled(PopDiagHandle, v4) )
  {
    PopDiagTraceFxPerfRegistration(
      v4,
      *(_QWORD *)(*(_QWORD *)(*(_QWORD *)FxPerf + 80i64) + 48i64),
      *(unsigned int *)(*(_QWORD *)FxPerf + 16i64),
      *((unsigned int *)FxPerf + 36));
    v5 = (const _EVENT_DESCRIPTOR *)POP_ETW_EVENT_PERFORMANCE_STATE_SET_REGISTRATION_RUNDOWN;
    if( !Rundown )
      v5 = &POP_ETW_EVENT_PERFORMANCE_STATE_SET_REGISTRATION;
    if( EtwEventEnabled(PopDiagHandle, v5) )
    {
      v6 = *((_DWORD *)FxPerf + 36);
      v7 = 0;
      if( v6 )
      {
        v8 = *((_QWORD *)FxPerf + 19);
        v9 = v6;
        do
        {
          if( !*(_DWORD *)(*(_QWORD *)v8 + 28i64) && *(_DWORD *)(*(_QWORD *)v8 + 32i64) > v7 )
            v7 = *(_DWORD *)(*(_QWORD *)v8 + 32i64);
          v8 += 32i64;
          --v9;
        }
        while( v9 );
      }
      v10 = 0;
      if( v7 )
      {
        if( 8 * (unsigned __int64)v7 > 0xFFFFFFFF )
          return;
        v10 = 8 * v7;
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 8 * v7, 1297630800i64);
        if( !PoolWithTag )
          return;
      }
      else
      {
        PoolWithTag = 0i64;
      }
      for( i = 0; i < *((_DWORD *)FxPerf + 36); ++i )
      {
        v13 = *((_QWORD *)FxPerf + 19);
        v14 = 32i64 * i;
        v15 = *(_QWORD *)(v14 + v13);
        v16 = *(_DWORD *)(v15 + 28);
        if( v16 )
        {
          v19 = *(_QWORD *)(v15 + 32);
          v17 = 0;
          v20 = *(_QWORD *)(v15 + 40);
          v21 = 0i64;
        }
        else
        {
          memset(PoolWithTag, 0i64, v10);
          v17 = *(_DWORD *)(v15 + 32);
          for( j = 0i64; (unsigned int)j < v17; v17 = *(_DWORD *)(v15 + 32) )
          {
            PoolWithTag[j] = *(VOID **)(*(_QWORD *)(v15 + 40) + 16i64 * (unsigned int)j);
            j = (unsigned int)(j + 1);
          }
          v13 = *((_QWORD *)FxPerf + 19);
          LOBYTE(v19) = 0;
          v16 = *(_DWORD *)(v15 + 28);
          LOBYTE(v20) = 0;
          v21 = (__int64)PoolWithTag;
        }
        PopDiagTraceFxPerfSetRegistration(
          v5,
          *(_QWORD *)(*(_QWORD *)(*(_QWORD *)FxPerf + 80i64) + 48i64),
          *(_DWORD *)(*(_QWORD *)FxPerf + 16i64),
          i,
          v16,
          *(_DWORD *)(v15 + 24),
          v19,
          v20,
          v15,
          v17,
          v21,
          *(_QWORD *)(v14 + v13 + 8));
      }
      if( PoolWithTag )
        ExFreePoolWithTag(PoolWithTag, 0x4D584650u);
    }
  }
}

Referenced by:

PopFxRegisterComponentPerfStates
PopFxTraceDeviceRegistration