PopFxTraceDeviceRegistration

VOID __stdcall PopFxTraceDeviceRegistration(_POP_FX_DEVICE *FxDevice, UINT8 Rundown){
  const _EVENT_DESCRIPTOR *v4; 
  PEPHANDLE__ *v5; 
  const _EVENT_DESCRIPTOR *v6; 
  unsigned int v7; 
  __int64 *v8; 
  unsigned int v9; 
  __int64 *v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned int v13; 
  VOID **PoolWithTag; 
  VOID **a7; 
  __int64 v16; 
  unsigned int v17; 
  VOID **v18; 
  __int64 v19; 
  __int64 v20; 
  UINT64 v21; 
  __int64 i; 
  __int64 v23; 
  int v24; 
  _POP_FX_PERF_INFO *v25; 
  INT64 a6; 
  const _EVENT_DESCRIPTOR *EventDescriptor; 
  UINT64 VetoMasks; 
  int v29; 

  if( Rundown )
  {
    v4 = &POP_ETW_EVENT_DEVICE_REGISTRATION_RUNDOWN;
  }
  else
  {
    PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), 0, 1, *((unsigned int *)FxDevice + 207));
    v4 = (const _EVENT_DESCRIPTOR *)POP_ETW_EVENT_DEVICE_REGISTRATION;
  }
  if( PopDiagHandleRegistered && EtwEventEnabled(PopDiagHandle, v4) )
  {
    v5 = (PEPHANDLE__ *)*((_QWORD *)FxDevice + 7);
    VetoMasks = 0i64;
    v29 = 0;
    PopPepGetDeviceVetoMasks(v5, &VetoMasks);
    PopDiagTraceFxDeviceRegistration(
      v4,
      *((_QWORD *)FxDevice + 6),
      *((_QWORD *)FxDevice + 8),
      *(_DWORD *)(*((_QWORD *)FxDevice + 6) + 156i64),
      *((_DWORD *)FxDevice + 8),
      *((_QWORD *)FxDevice + 6) + 128i64,
      *((_DWORD *)FxDevice + 207),
      (INT64)&VetoMasks);
    v6 = (const _EVENT_DESCRIPTOR *)POP_ETW_EVENT_COMPONENT_REGISTRATION_RUNDOWN;
    if( !Rundown )
      v6 = &POP_ETW_EVENT_COMPONENT_REGISTRATION;
    EventDescriptor = v6;
    if( EtwEventEnabled(PopDiagHandle, v6) )
    {
      v7 = *((_DWORD *)FxDevice + 207);
      if( v7 )
      {
        v8 = (__int64 *)*((_QWORD *)FxDevice + 104);
        v9 = *(_DWORD *)(*v8 + 156);
        if( v7 > 1 )
        {
          v10 = v8 + 1;
          v11 = v7 - 1;
          do
          {
            v12 = *v10;
            v13 = v9;
            ++v10;
            v9 = *(_DWORD *)(v12 + 156);
            if( v9 <= v13 )
              v9 = v13;
            --v11;
          }
          while( v11 );
        }
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 28 * v9, 1297630800i64);
        a7 = PoolWithTag;
        if( PoolWithTag )
        {
          v16 = v9;
          v17 = 0;
          v18 = &PoolWithTag[3 * v16];
          v19 = 0i64;
          do
          {
            v20 = *(_QWORD *)(v19 + *((_QWORD *)FxDevice + 104));
            memset(v18, 0i64, 4 * *(_DWORD *)(v20 + 156));
            PopPepGetComponentVetoMasks(*((PEPHANDLE__ **)FxDevice + 7), v17, (UINT64 *)v18, v21);
            for( i = 0i64; (unsigned int)i < *(_DWORD *)(v20 + 156); HIDWORD(a7[v23 + 2]) = v24 )
            {
              v23 = 3 * i;
              a7[v23] = *(VOID **)(*(_QWORD *)(v20 + 160) + 24 * i);
              a7[v23 + 1] = *(VOID **)(*(_QWORD *)(v20 + 160) + 24 * i + 8);
              LODWORD(a7[v23 + 2]) = *(_DWORD *)(*(_QWORD *)(v20 + 160) + 24 * i + 16);
              v24 = *((_DWORD *)v18 + i);
              i = (unsigned int)(i + 1);
            }
            LODWORD(a6) = *(_DWORD *)(v20 + 156);
            PopDiagTraceFxComponentRegistration(
              EventDescriptor,
              *((_QWORD *)FxDevice + 6),
              v17,
              *(int *)(v20 + 88) < 0,
              *(_DWORD *)(v20 + 152),
              a6,
              (INT64)a7);
            v25 = *(_POP_FX_PERF_INFO **)(v20 + 424);
            if( v25 )
              PopFxTracePerfRegistration(v25, Rundown);
            ++v17;
            v19 += 8i64;
          }
          while( v17 < v7 );
          ExFreePoolWithTag(a7, 0x4D584650u);
        }
      }
    }
  }
}

Referenced by:

PopDiagTraceFxRundown
PopFxRegisterDevice