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