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