PopFxTracePerfRegistration
void __fastcall PopFxTracePerfRegistration(unsigned int *a1, char a2, EVENT_DESCRIPTOR *a3){
EVENT_DESCRIPTOR *v5;
EVENT_DESCRIPTOR *v6;
EVENT_DESCRIPTOR *v7;
unsigned int v8;
unsigned int v9;
__int64 v10;
__int64 v11;
UINT64 *PoolWithTag;
unsigned int i;
__int64 v14;
__int64 v15;
__int64 Name;
PO_FX_PERF_STATE_TYPE Type;
unsigned int v18;
__int64 j;
UINT64 Minimum;
UINT64 Maximum;
UINT64 *States;
UINT64 StatesCount;
if( a2 )
{
v5 = (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_PERFORMANCE_STATE_REGISTRATION_RUNDOWN;
}
else
{
v5 = (EVENT_DESCRIPTOR *)POP_ETW_EVENT_PERFORMANCE_STATE_REGISTRATION;
PopFxAddLogEntry(
*(_QWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 80i64) + 48i64),
*(_DWORD *)(*(_QWORD *)a1 + 16i64),
12,
a1[36]);
}
if( PopDiagHandleRegistered && EtwEventEnabled(PopDiagHandle, v5, a3) )
{
PopDiagTraceFxPerfRegistration(
v5,
*(PVOID *)(*(_QWORD *)(*(_QWORD *)a1 + 80i64) + 48i64),
*(unsigned int *)(*(_QWORD *)a1 + 16i64),
a1[36]);
v7 = (EVENT_DESCRIPTOR *)POP_ETW_EVENT_PERFORMANCE_STATE_SET_REGISTRATION_RUNDOWN;
if( !a2 )
v7 = (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_PERFORMANCE_STATE_SET_REGISTRATION;
if( EtwEventEnabled(PopDiagHandle, v7, v6) )
{
v8 = a1[36];
v9 = 0;
if( v8 )
{
v10 = *((_QWORD *)a1 + 19);
v11 = v8;
do
{
if( !*(_DWORD *)(*(_QWORD *)v10 + 28i64) && *(_DWORD *)(*(_QWORD *)v10 + 32i64) > v9 )
v9 = *(_DWORD *)(*(_QWORD *)v10 + 32i64);
v10 += 32i64;
--v11;
}
while( v11 );
}
if( v9 )
{
if( 8 * (unsigned __int64)v9 > 0xFFFFFFFF )
return;
PoolWithTag = (UINT64 *)ExAllocatePoolWithTag(PagedPool, 8 * v9, 0x4D584650ui64);
if( !PoolWithTag )
return;
}
else
{
PoolWithTag = 0i64;
}
for( i = 0; i < a1[36]; ++i )
{
v14 = *((_QWORD *)a1 + 19);
v15 = 32i64 * i;
Name = *(_QWORD *)(v15 + v14);
Type = *(_DWORD *)(Name + 28);
if( Type )
{
Minimum = *(_QWORD *)(Name + 32);
v18 = 0;
Maximum = *(_QWORD *)(Name + 40);
States = 0i64;
}
else
{
memset((INT64)PoolWithTag, 0i64);
v18 = *(_DWORD *)(Name + 32);
for( j = 0i64; (unsigned int)j < v18; v18 = *(_DWORD *)(Name + 32) )
{
PoolWithTag[j] = *(_QWORD *)(*(_QWORD *)(Name + 40) + 16i64 * (unsigned int)j);
j = (unsigned int)(j + 1);
}
v14 = *((_QWORD *)a1 + 19);
Minimum = 0i64;
Type = *(_DWORD *)(Name + 28);
Maximum = 0i64;
States = PoolWithTag;
}
LODWORD(StatesCount) = v18;
PopDiagTraceFxPerfSetRegistration(
v7,
*(PVOID *)(*(_QWORD *)(*(_QWORD *)a1 + 80i64) + 48i64),
*(unsigned int *)(*(_QWORD *)a1 + 16i64),
i,
Type,
*(PO_FX_PERF_STATE_UNIT *)(Name + 24),
Minimum,
Maximum,
(UNICODE_STRING *)Name,
StatesCount,
States,
*(_QWORD *)(v15 + v14 + 8));
}
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x4D584650u);
}
}
}Referenced by:
PopFxRegisterComponentPerfStates
PopFxTraceDeviceRegistration