PopFxRegisterComponentPerfStates

INT64 __fastcall PopFxRegisterComponentPerfStates(
        UINT64 a1,
        INT64 a2,
        UINT64 a3,
        INT64 a4,
        PO_FX_COMPONENT_PERF_INFO *a5,
        CHAR **a6){
  INT64 v6; 
  char v7; 
  INT64 v8; 
  int v9; 
  struct _PO_FX_COMPONENT_PERF_INFO *v10; 
  NTSTATUS v11; 
  ULONGLONG v13; 
  ULONGLONG v14; 
  unsigned int v15; 
  ULONGLONG v16; 
  ULONGLONG i; 
  ULONGLONG v18; 
  UINT64 v19; 
  unsigned __int64 v20; 
  unsigned int v21; 
  unsigned __int16 *v22; 
  __int64 v23; 
  ULONGLONG v24; 
  char *PoolWithTag; 
  char *v26; 
  UNICODE_STRING **v27; 
  UNICODE_STRING *v28; 
  UNICODE_STRING *v29; 
  unsigned int j; 
  UINT8 *v31; 
  unsigned int v32; 
  UNICODE_STRING *v33; 
  unsigned int v34; 
  unsigned int v35; 
  wchar_t *k; 
  char *v37; 
  unsigned __int16 v38; 
  EVENT_DESCRIPTOR *v39; 
  CHAR v40; 
  ULONGLONG pullResult; 
  PVOID P; 
  unsigned __int64 v43; 
  unsigned __int64 v44; 
  CHAR *v45; 
  v6 = a1;
  v7 = a3;
  pullResult = 0i64;
  v8 = a2;
  P = 0i64;
  if( a5 )
  {
    if( !a6 )
    {
      v10 = a5;
      P = a5;
      goto LABEL_8;
    }
    return 3221225485i64;
  }
  if( !a6 )
    return 3221225485i64;
  v9 = PopFxPepPerfInfoQuery(a1, *(unsigned int *)(a2 + 16), (unsigned int **)&P);
  v10 = (struct _PO_FX_COMPONENT_PERF_INFO *)P;
  v11 = v9;
  if( v9 < 0 )
  {
LABEL_52:
    PopFxPepPerfInfoFree(v10);
    return(unsigned int)v11;
  }
  v8 = a2;
  v6 = a1;
  v7 = a3;
LABEL_8:
  if( !*(_DWORD *)v10 )
  {
    v11 = -1073741811;
    goto LABEL_51;
  }
  v40 = PopPluginRegisterComponentPerfStates(v6, *(unsigned int *)(v8 + 16), (INT64)v10);
  if( !v40 && (v7 & 1) == 0 )
  {
    v11 = -1073741822;
    goto LABEL_51;
  }
  v11 = RtlULongLongMult(*(_DWORD *)v10, 0x20ui64, &pullResult);
  if( v11 >= 0 )
  {
    if( pullResult >= 0xFFFFFFFFFFFFFF60ui64 )
      goto LABEL_50;
    v13 = (pullResult + 167) & 0xFFFFFFFFFFFFFFF8ui64;
    v14 = v13 + 8;
    if( v13 + 8 < v13 )
      goto LABEL_50;
    v11 = RtlULongLongMult(*(_DWORD *)v10, 0x30ui64, &pullResult);
    if( v11 < 0 )
      goto LABEL_51;
    if( v14 + pullResult < v14 )
      goto LABEL_50;
    v15 = 0;
    v16 = (v14 + pullResult + 7) & 0xFFFFFFFFFFFFFFF8ui64;
    for( i = v16; v15 < *(_DWORD *)v10; ++v15 )
    {
      if( !*((_DWORD *)v10 + 12 * v15 + 9) )
      {
        v11 = RtlULongLongMult(*((unsigned int *)v10 + 12 * v15 + 10), 0x10ui64, &pullResult);
        if( v11 < 0 )
          goto LABEL_51;
        if( v18 + pullResult < v18 )
          goto LABEL_50;
        v16 = v18 + pullResult;
      }
    }
    v19 = *(_DWORD *)v10;
    v20 = (v16 + 1) & 0xFFFFFFFFFFFFFFFEui64;
    v21 = 0;
    v43 = v20;
    if( (_DWORD)v19 )
    {
      v22 = (unsigned __int16 *)((char *)v10 + 8);
      do
      {
        v23 = *v22;
        if( (_WORD)v23 )
        {
          if( v23 + v20 + 2 < v20 )
            goto LABEL_50;
          v20 += v23 + 2;
        }
        ++v21;
        v22 += 24;
      }
      while( v21 < (unsigned int)v19 );
    }
    v44 = (v20 + 7) & 0xFFFFFFFFFFFFFFF8ui64;
    v11 = RtlULongLongMult(v19, 0x10ui64, &pullResult);
    if( v11 >= 0 )
    {
      if( v24 + pullResult >= v24 )
      {
        v11 = 0;
        PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v24 + pullResult, 0x4D584650ui64);
        v26 = PoolWithTag;
        if( PoolWithTag )
        {
          memset((INT64)PoolWithTag, 0i64);
          *((_QWORD *)v26 + 4) = a4;
          v27 = (UNICODE_STRING **)(v26 + 160);
          v28 = (UNICODE_STRING *)&v26[v14];
          *((_DWORD *)v26 + 36) = *(_DWORD *)v10;
          *((_QWORD *)v26 + 19) = v26 + 160;
          *(_DWORD *)&v26[v13] = *(_DWORD *)v10;
          v29 = v28;
          v45 = &v26[v13];
          for( j = 0; j < *(_DWORD *)v10; v27 += 4 )
          {
            *v27 = v29;
            ++j;
            v29 += 3;
          }
          v31 = (UINT8 *)&v26[i];
          v32 = 0;
          if( *(_DWORD *)v10 )
          {
            v33 = v28 + 2;
            do
            {
              *(_QWORD *)&v33[-1].Length = *((_QWORD *)v10 + 6 * v32 + 3);
              LODWORD(v33[-1].Buffer) = *((_DWORD *)v10 + 12 * v32 + 8);
              HIDWORD(v33[-1].Buffer) = *((_DWORD *)v10 + 12 * v32 + 9);
              if( *((_DWORD *)v10 + 12 * v32 + 9) )
              {
                *(_QWORD *)&v33->Length = *((_QWORD *)v10 + 6 * v32 + 5);
                v33->Buffer = (wchar_t *)*((_QWORD *)v10 + 6 * v32 + 6);
              }
              else
              {
                v34 = *((_DWORD *)v10 + 12 * v32 + 10);
                *(_DWORD *)&v33->Length = v34;
                v33->Buffer = (wchar_t *)v31;
                memmove(v31, *((UINT8 **)v10 + 6 * v32 + 6), 16i64 * v34);
                v31 += 16 * *(unsigned int *)&v33->Length;
              }
              v33 += 3;
              ++v32;
            }
            while( v32 < *(_DWORD *)v10 );
          }
          v35 = 0;
          for( k = (wchar_t *)&v26[v43]; v35 < *(_DWORD *)v10; k += (v38 >> 1) + 1 )
          {
            v37 = (char *)v10 + 48 * v35;
            v38 = *((_WORD *)v37 + 4);
            if( v38 )
            {
              v28->Buffer = k;
              v28->Length = *((_WORD *)v37 + 4);
              v28->MaximumLength = *((_WORD *)v37 + 4) + 2;
              RtlCopyUnicodeString(v28, (UNICODE_STRING *)(v37 + 8), 0i64);
              v38 = *((_WORD *)v37 + 4);
            }
            v28 += 3;
            ++v35;
          }
          *((_QWORD *)v26 + 6) = &v26[v44];
          *(_QWORD *)v26 = a2;
          KeInitializeEvent((_KEVENT *)(v26 + 8), NotificationEvent, 1u);
          if( (a3 & 6) != 0 )
            v26[74] = 1;
          v26[73] = v40;
          *((_QWORD *)v26 + 14) = v26;
          *((_QWORD *)v26 + 13) = PopFxComponentPerfWork;
          *((_QWORD *)v26 + 11) = 0i64;
          PopFxTracePerfRegistration((unsigned int *)v26, 0, v39);
          PopPepRegisterComponentPerfStates(*(PEPHANDLE__ **)(a1 + 56), *(unsigned int *)(a2 + 16), a3);
          *(_QWORD *)(a2 + 424) = v26;
          if( a6 )
            *a6 = v45;
        }
        else
        {
          v11 = -1073741670;
        }
        goto LABEL_51;
      }
LABEL_50:
      v11 = -1073741675;
    }
  }
LABEL_51:
  if( !a5 )
    goto LABEL_52;
  return(unsigned int)v11;
}

Referenced by:

PoFxRegisterComponentPerfStates