PpmPerfSnapDeliveredPerformance
char __fastcall PpmPerfSnapDeliveredPerformance(__int64 a1, char a2, __int64 a3){
__int64 v3;
unsigned __int64 *v7;
__int64 v8;
bool v9;
char result;
unsigned __int64 v11;
unsigned __int64 v12;
__int64 v13;
__int64 v14;
void(__fastcall *v15)(UINT64 *);
unsigned __int64 v16;
unsigned __int64 v17;
__int64 v18;
const _EVENT_DESCRIPTOR *v19;
UINT64 v20;
__int64 v21;
UINT64 v22;
UINT8 v23;
UINT64 v24;
int *v25;
int v26;
UINT64 ThrottleMSR;
int v28;
int v29;
int v30;
unsigned __int64 v31;
UINT64 v32;
_EVENT_DATA_DESCRIPTOR UserData;
int *v34;
__int64 v35;
UINT64 *v36;
__int64 v37;
int *v38;
__int64 v39;
v3 = *(_QWORD *)(a1 + 16);
if( !v3 )
return 1;
v7 = (unsigned __int64 *)(v3 + 128);
if( *(_BYTE *)(a1 + 60) )
{
v8 = a1 - 33128;
v9 = a1 - 33128 != (_QWORD)KeGetCurrentPrcb();
result = PpmSnapPerformanceAccumulation((_KPRCB *)(a1 - 33128), 0, v9, 1u, (_PROC_PERF_CHECK_SNAP *)(v3 + 128));
}
else
{
v8 = 0i64;
v9 = 0;
while( 1 )
{
result = PpmHvSnapPerformanceAccumulation((_QWORD *)a1, 0i64, a3, (_QWORD *)(v3 + 128));
if( !a2 )
break;
if( result )
goto LABEL_5;
}
}
if( result )
{
LABEL_5:
v11 = *(_QWORD *)(v3 + 224);
if( *v7 <= v11 )
return 0;
v12 = *(_QWORD *)(v3 + 136) - *(_QWORD *)(v3 + 232);
v31 = *v7 - v11;
if( v12 > v31 && v9 )
{
return 0;
}
else
{
if( v8 )
{
if( !v9 )
{
v13 = *(_QWORD *)(v8 + 33128);
v14 = *(_QWORD *)(v8 + 33136);
ThrottleMSR = 0i64;
if( PopProcessorThrottleLogInterval )
{
if( v13 )
{
if( v14 )
{
v15 = *(void(__fastcall **)(UINT64 *))(v13 + 224);
if( v15 )
{
if( *(_BYTE *)(v8 + 33008) )
{
v15(&ThrottleMSR);
if( *(_DWORD *)(v14 + 72) < *(_DWORD *)(v13 + 324) )
{
*(_BYTE *)(v8 + 33016) = 0;
}
else if( *(_BYTE *)(v8 + 33016) )
{
if( *(_QWORD *)(v8 + 33024) != ThrottleMSR )
{
v24 = (unsigned int)(*(_DWORD *)(v8 + 33012) + 1);
*(_DWORD *)(v8 + 33012) = v24;
if( !((unsigned int)v24 % PopProcessorThrottleLogInterval) || (_DWORD)v24 == 1 )
{
LODWORD(v24) = KeGetPcr()->Prcb.Number;
PopDiagTraceIllegalProcessorThrottle(v24, ThrottleMSR, (_LARGE_INTEGER *)(v8 + 33032));
}
}
}
else
{
*(_BYTE *)(v8 + 33016) = 1;
}
*(_QWORD *)(v8 + 33024) = ThrottleMSR;
}
}
}
}
}
}
}
if( v12 )
{
v16 = (*(_QWORD *)(v3 + 160) - *(_QWORD *)(v3 + 256)) / v12;
v17 = (*(_QWORD *)(v3 + 152) - *(_QWORD *)(v3 + 248)) / v12;
v18 = *(_QWORD *)a1 ? *(unsigned int *)(*(_QWORD *)a1 + 316i64) : *(unsigned int *)(v8 + 68);
if( __PAIR64__(v17, v16) != *(_QWORD *)(v3 + 320) )
{
v30 = (*(_QWORD *)(v3 + 152) - *(_QWORD *)(v3 + 248)) * v18 / 0x64ui64 / v12;
v29 = v17;
v28 = v16;
v26 = 0;
if( *(_BYTE *)(a1 + 60) )
{
v19 = &PPM_ETW_DELIVERED_PERF_CHANGE;
LOWORD(v26) = *(unsigned __int8 *)(a1 - 32920);
BYTE2(v26) = *(_BYTE *)(a1 - 32919);
*(_QWORD *)&UserData.Size = 3i64;
}
else
{
v19 = (const _EVENT_DESCRIPTOR *)PPM_ETW_DELIVERED_PERF_CHANGE_HV;
v26 = *(_DWORD *)(*(_QWORD *)(a1 + 8) + 20i64);
*(_QWORD *)&UserData.Size = 4i64;
}
UserData.Ptr = (unsigned __int64)&v26;
if( PpmEtwRegistered )
{
if( PpmEtwHandle
&& (EtwpLevelKeywordEnabled(
(_TRACE_ENABLE_INFO *)(*(_QWORD *)(PpmEtwHandle + 32) + 96i64),
v19->Level,
v19->Keyword)
|| *(_BYTE *)(v21 + 101)
&& EtwpLevelKeywordEnabled((_TRACE_ENABLE_INFO *)(*(_QWORD *)(v21 + 40) + 96i64), v23, v20)) )
{
v32 = PpmConvertTime(v22, PopQpcFrequency, 0xF4240ui64);
v34 = &v28;
v36 = &v32;
v25 = &v29;
v35 = 4i64;
v37 = 8i64;
v39 = 4i64;
if( v19 != &PPM_ETW_DELIVERED_PERF_CHANGE )
v25 = &v30;
v38 = v25;
EtwWriteEx(PpmEtwHandle, v19, 0i64, 0, 0, 0, 4u, &UserData);
}
}
}
}
result = 1;
*(_OWORD *)(v3 + 224) = *(_OWORD *)v7;
*(_OWORD *)(v3 + 240) = *(_OWORD *)(v3 + 144);
*(_OWORD *)(v3 + 256) = *(_OWORD *)(v3 + 160);
*(_OWORD *)(v3 + 272) = *(_OWORD *)(v3 + 176);
*(_OWORD *)(v3 + 288) = *(_OWORD *)(v3 + 192);
*(_OWORD *)(v3 + 304) = *(_OWORD *)(v3 + 208);
}
}
return result;
}Referenced by:
PpmCheckSnapAllDeliveredPerformance
PpmPerfAction