PopFxRegisterComponentPerfStates

NTSTATUS __fastcall PopFxRegisterComponentPerfStates(
        _POP_FX_DEVICE *P3,
        _POP_FX_COMPONENT *a2,
        UINT64 a3,
        _LIST_ENTRY *a4,
        INT64 a5,
        INT64 a6){
  _POP_FX_DEVICE *v6; 
  char v7; 
  _POP_FX_COMPONENT *v8; 
  NTSTATUS v9; 
  unsigned __int16 *v10; 
  int v11; 
  UINT64 v13; 
  UINT64 v14; 
  unsigned int v15; 
  UINT64 v16; 
  UINT64 i; 
  UINT64 v18; 
  ULONGLONG v19; 
  unsigned __int64 v20; 
  unsigned int v21; 
  unsigned __int16 *v22; 
  __int64 v23; 
  UINT64 v24; 
  size_t v25; 
  VOID **PoolWithTag; 
  VOID **v27; 
  _UNICODE_STRING **v28; 
  _UNICODE_STRING *v29; 
  _UNICODE_STRING *v30; 
  unsigned int j; 
  wchar_t *v32; 
  unsigned int v33; 
  _UNICODE_STRING *v34; 
  int v35; 
  unsigned int v36; 
  wchar_t *k; 
  unsigned __int16 *v38; 
  unsigned __int16 v39; 
  char v40; 
  UINT64 pullResult; 
  PVOID P; 
  unsigned __int64 v43; 
  unsigned __int64 v44; 
  __int64 v45; 

  v6 = P3;
  v7 = a3;
  pullResult = 0i64;
  v8 = a2;
  P = 0i64;
  if( a5 )
  {
    if( !a6 )
    {
      v10 = (unsigned __int16 *)a5;
      P = (PVOID)a5;
      goto LABEL_8;
    }
    return -1073741811;
  }
  if( !a6 )
    return -1073741811;
  v9 = PopFxPepPerfInfoQuery(P3, *((unsigned int *)a2 + 4), (UINT64 **)&P);
  v10 = (unsigned __int16 *)P;
  v11 = v9;
  if( v9 < 0 )
  {
LABEL_52:
    PopFxPepPerfInfoFree(v10);
    return v11;
  }
  v8 = a2;
  v6 = P3;
  v7 = a3;
LABEL_8:
  if( !*(_DWORD *)v10 )
  {
    v11 = -1073741811;
    goto LABEL_51;
  }
  v40 = PopPluginRegisterComponentPerfStates((__int64)v6, *((_DWORD *)v8 + 4), (__int64)v10);
  if( !v40 && (v7 & 1) == 0 )
  {
    v11 = -1073741822;
    goto LABEL_51;
  }
  v11 = RtlULongLongMult(*(unsigned int *)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(*(unsigned int *)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[24 * v15 + 18] )
      {
        v11 = RtlULongLongMult(*(unsigned int *)&v10[24 * v15 + 20], 0x10ui64, &pullResult);
        if( v11 < 0 )
          goto LABEL_51;
        if( v18 + pullResult < v18 )
          goto LABEL_50;
        v16 = v18 + pullResult;
      }
    }
    v19 = *(unsigned int *)v10;
    v20 = (v16 + 1) & 0xFFFFFFFFFFFFFFFEui64;
    v21 = 0;
    v43 = v20;
    if( (_DWORD)v19 )
    {
      v22 = v10 + 4;
      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 )
    {
      v25 = v24 + pullResult;
      if( v24 + pullResult >= v24 )
      {
        v11 = 0;
        PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v24 + pullResult, 1297630800i64);
        v27 = PoolWithTag;
        if( PoolWithTag )
        {
          memset(PoolWithTag, 0i64, v25);
          v27[4] = a4;
          v28 = (_UNICODE_STRING **)(v27 + 20);
          v29 = (_UNICODE_STRING *)((char *)v27 + v14);
          *((_DWORD *)v27 + 36) = *(_DWORD *)v10;
          v27[19] = v27 + 20;
          *(_DWORD *)((char *)v27 + v13) = *(_DWORD *)v10;
          v30 = v29;
          v45 = (__int64)v27 + v13;
          for( j = 0; j < *(_DWORD *)v10; v28 += 4 )
          {
            *v28 = v30;
            ++j;
            v30 += 3;
          }
          v32 = (wchar_t *)((char *)v27 + i);
          v33 = 0;
          if( *(_DWORD *)v10 )
          {
            v34 = v29 + 2;
            do
            {
              *(_QWORD *)&v34[-1].Length = *(_QWORD *)&v10[24 * v33 + 12];
              LODWORD(v34[-1].Buffer) = *(_DWORD *)&v10[24 * v33 + 16];
              HIDWORD(v34[-1].Buffer) = *(_DWORD *)&v10[24 * v33 + 18];
              if( *(_DWORD *)&v10[24 * v33 + 18] )
              {
                *(_QWORD *)&v34->Length = *(_QWORD *)&v10[24 * v33 + 20];
                v34->Buffer = *(wchar_t **)&v10[24 * v33 + 24];
              }
              else
              {
                v35 = *(_DWORD *)&v10[24 * v33 + 20];
                *(_DWORD *)&v34->Length = v35;
                v34->Buffer = v32;
                memmove(v32, *(const VOID **)&v10[24 * v33 + 24], 16 * v35);
                v32 += 8 * *(unsigned int *)&v34->Length;
              }
              v34 += 3;
              ++v33;
            }
            while( v33 < *(_DWORD *)v10 );
          }
          v36 = 0;
          for( k = (wchar_t *)((char *)v27 + v43); v36 < *(_DWORD *)v10; k += (v39 >> 1) + 1 )
          {
            v38 = &v10[24 * v36];
            v39 = v38[4];
            if( v39 )
            {
              v29->Buffer = k;
              v29->Length = v38[4];
              v29->MaximumLength = v38[4] + 2;
              RtlCopyUnicodeString(v29, (PCUNICODE_STRING)(v38 + 4));
              v39 = v38[4];
            }
            v29 += 3;
            ++v36;
          }
          v27[6] = (char *)v27 + v44;
          *v27 = a2;
          KeInitializeEvent((INT64)(v27 + 1), 0, 1u);
          if( (a3 & 6) != 0 )
            *((_BYTE *)v27 + 74) = 1;
          *((_BYTE *)v27 + 73) = v40;
          v27[14] = v27;
          v27[13] = PopFxComponentPerfWork;
          v27[11] = 0i64;
          PopFxTracePerfRegistration((_POP_FX_PERF_INFO *)v27, 0);
          PopPepRegisterComponentPerfStates(*((PEPHANDLE **)P3 + 7), *((unsigned int *)a2 + 4), a3);
          *((_QWORD *)a2 + 53) = v27;
          if( a6 )
            *(_QWORD *)a6 = v45;
        }
        else
        {
          v11 = -1073741670;
        }
        goto LABEL_51;
      }
LABEL_50:
      v11 = -1073741675;
    }
  }
LABEL_51:
  if( !a5 )
    goto LABEL_52;
  return v11;
}

Referenced by:

PoFxRegisterComponentPerfStates