ExProcessorCounterSetCallback
NTSTATUS __stdcall ExProcessorCounterSetCallback(PCW_CALLBACK_TYPE Type, PCW_CALLBACK_INFORMATION *Info, PVOID Context){
bool v5;
bool v6;
bool v7;
bool v8;
__int32 v9;
unsigned __int64 CounterMask;
struct _PCW_BUFFER *v11;
unsigned int ActiveProcessorCount;
unsigned int v13;
unsigned __int64 v14;
unsigned int v15;
unsigned __int64 v16;
unsigned __int64 Mask;
unsigned int v18;
unsigned __int64 v19;
unsigned __int64 v20;
ULONG FirstSetRightGroupAffinity;
__int64 v22;
WCHAR v23;
NTSTATUS v24;
WCHAR v25;
WCHAR v26;
__int64 InstanceId;
const _UNICODE_STRING *InstanceMask;
bool v29;
bool v30;
USHORT Count[2];
UINT8 CollectIdleCounters[4];
unsigned int v33;
int v34;
unsigned int v35;
unsigned __int64 v36;
unsigned __int64 v37;
PPCW_BUFFER Buffer;
struct _PCW_DATA v39;
UNICODE_STRING Name;
struct _PCW_DATA v41;
struct _GROUP_AFFINITY Affinity;
struct _PCW_DATA Data;
struct _PCW_DATA v44;
INT64 result;
unsigned __int64 v46;
unsigned __int64 v47;
unsigned __int64 v48;
int v49;
unsigned __int64 v50;
unsigned __int64 v51;
int v52;
int v53;
int v54;
unsigned __int64 v55;
unsigned __int64 v56;
unsigned __int64 v57;
__int64 v58;
__int64 v59;
__int64 v60;
unsigned __int64 v61;
unsigned int v62;
unsigned int v63;
int v64;
int v65;
unsigned __int64 v66;
unsigned __int64 v67;
__int64 v68;
__int64 v69;
unsigned int v70;
int v71;
unsigned __int64 v72;
INT64 v73;
unsigned __int64 v74;
unsigned __int64 v75;
unsigned __int64 v76;
int v77;
unsigned __int64 v78;
unsigned __int64 v79;
int v80;
int v81;
int v82;
unsigned __int64 v83;
unsigned __int64 v84;
unsigned __int64 v85;
__int64 v86;
__int64 v87;
__int64 v88;
unsigned __int64 v89;
unsigned int v90;
unsigned int v91;
int v92;
int v93;
unsigned __int64 v94;
unsigned __int64 v95;
__int64 v96;
__int64 v97;
unsigned int v98;
int v99;
unsigned __int64 v100;
_PCW_PROCESSOR_INFO v101;
wchar_t pszDest[16];
Affinity = 0i64;
memset((INT64)&result, 0i64);
memset((INT64)&v73, 0i64);
Count[0] = 0;
Name = 0i64;
memset((INT64)&v101, 0i64);
CollectIdleCounters[0] = 0;
v5 = 0;
v30 = 0;
v6 = 0;
v29 = 0;
v7 = 0;
v34 = 0;
v8 = 0;
v33 = 0;
v9 = Type - 2;
if( v9 )
{
if( v9 != 1 )
return 0;
CounterMask = Info->AddCounter.CounterMask;
v11 = Info->EnumerateInstances.Buffer;
Buffer = v11;
v5 = (CounterMask & 0x100E0FF05i64) != 0;
CollectIdleCounters[0] = v5;
v6 = (CounterMask & 0xC00F0000) != 0;
v7 = (CounterMask & 0x63F000000i64) != 0;
v30 = v6;
v29 = v7;
v8 = swscanf_s(Info->AddCounter.InstanceMask->Buffer, (PWCHAR)&stru_1407D2340.Xmm15) == 2;
}
else
{
v11 = Info->EnumerateInstances.Buffer;
Buffer = v11;
}
if( !v8 )
{
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
LOWORD(v13) = 0;
v14 = 0i64;
v33 = 0;
v15 = ActiveProcessorCount;
v35 = ActiveProcessorCount;
v41.Data = 0i64;
v16 = 0i64;
v39.Data = 0i64;
if( !KeNumberNodes )
{
LABEL_20:
if( v15 > 1 )
{
v73 /= (unsigned __int64)v15;
v74 /= v15;
v75 /= v15;
v76 /= v15;
v79 /= v15;
v78 /= v15;
v83 /= v15;
v84 /= v15;
v85 /= v15;
v89 /= v15;
v90 /= v15;
v91 /= v15;
}
if( v7 )
{
v92 = v16 / v15;
v93 = v14 / v15;
v94 /= v15;
v95 /= v15;
v100 /= v15;
}
if( v6 )
v98 /= v15;
RtlStringCbPrintfW(pszDest, 0x1Aui64, (WCHAR *)&stru_1407D2340.MxCsr);
RtlInitUnicodeString(&Name, pszDest, v26);
v39.Data = &v73;
v39.Size = 200;
return PcwAddInstance(v11, &Name, KeMaximumProcessors + (unsigned __int16)KeNumberNodes, 1u, &v39);
}
while( 1 )
{
KeQueryNodeActiveAffinity(v13, &Affinity, Count);
Mask = Affinity.Mask;
if( Affinity.Mask )
{
memset((INT64)&result, 0i64);
v18 = Count[0];
v19 = 0i64;
v34 = 0;
v20 = 0i64;
v36 = 0i64;
v37 = 0i64;
if( Count[0] )
{
while( 1 )
{
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity(&Affinity);
v22 = (__int64)*(&KiProcessorBlock + FirstSetRightGroupAffinity);
Affinity.Mask = ~*(_QWORD *)(v22 + 200) & Mask;
ExpQueryProcessorInformationCounters((_KPRCB *)v22, CollectIdleCounters[0], v6, v7, &v101);
RtlStringCbPrintfW(pszDest, 0x1Aui64, (WCHAR *)&stru_1407D2340.Xmm15);
RtlInitUnicodeString(&Name, pszDest, v23);
Data.Size = 200;
Data.Data = &v101;
v24 = PcwAddInstance(v11, &Name, FirstSetRightGroupAffinity, 1u, &Data);
if( v24 < 0 )
return v24;
v57 += v101.C3Time;
v73 += v101.IdleTime;
v74 += v101.AvailableTime;
v75 += v101.UserTime;
v76 += v101.KernelTime;
v77 += v101.Interrupts;
v79 += v101.InterruptTime;
v81 += v101.DpcCount;
v60 += v101.C3Transitions;
v68 += v101.AverageIdleTime;
v69 += v101.IdleBreakEvents;
v61 += v101.StallTime;
v62 += v101.CurrentFrequency;
v63 += v101.PercentMaxFrequency;
v37 += v101.NominalThroughput;
v36 += v101.ActiveThroughput;
v66 += v101.ScaledThroughput;
v67 += v101.ScaledKernelThroughput;
v72 += v101.ScaledFrequency;
v70 += v101.PerformanceLimit;
result += v101.IdleTime;
v46 += v101.AvailableTime;
v47 += v101.UserTime;
v48 += v101.KernelTime;
v49 += v101.Interrupts;
v51 += v101.InterruptTime;
v53 += v101.DpcCount;
v54 += v101.DpcRate;
v50 += v101.DpcTime;
v52 += v101.ClockInterrupts;
v55 += v101.C1Time;
v58 += v101.C1Transitions;
v56 += v101.C2Time;
v59 += v101.C2Transitions;
v71 |= v101.PerformanceLimitFlags;
v82 += v101.DpcRate;
v78 += v101.DpcTime;
v91 += v101.PercentMaxFrequency;
v99 |= v101.PerformanceLimitFlags;
v80 += v101.ClockInterrupts;
v83 += v101.C1Time;
v86 += v101.C1Transitions;
v84 += v101.C2Time;
v87 += v101.C2Transitions;
v90 += v101.CurrentFrequency;
v14 = (unsigned __int64)v41.Data + v101.ActiveThroughput;
v95 += v101.ScaledKernelThroughput;
v85 += v101.C3Time;
v88 += v101.C3Transitions;
v96 += v101.AverageIdleTime;
v97 += v101.IdleBreakEvents;
v89 += v101.StallTime;
v39.Data = (char *)v39.Data + v101.NominalThroughput;
v94 += v101.ScaledThroughput;
v100 += v101.ScaledFrequency;
v98 += v101.PerformanceLimit;
v18 = Count[0];
v6 = v30;
v7 = v29;
v11 = Buffer;
Mask = Affinity.Mask;
v41.Data = (const void *)v14;
if( ++v34 >= (unsigned int)Count[0] )
{
v19 = v36;
v20 = v37;
break;
}
}
}
if( Count[0] > 1u )
{
result /= (unsigned __int64)Count[0];
v46 /= Count[0];
v47 /= Count[0];
v48 /= Count[0];
v51 /= Count[0];
v50 /= Count[0];
v55 /= Count[0];
v56 /= Count[0];
v57 /= Count[0];
v61 /= Count[0];
v62 /= v18;
v63 /= v18;
}
v7 = v29;
if( v29 )
{
v64 = v20 / Count[0];
v65 = v19 / Count[0];
v66 /= Count[0];
v67 /= Count[0];
v72 /= Count[0];
}
v6 = v30;
if( v30 )
v70 /= v18;
RtlStringCbPrintfW(pszDest, 0x1Aui64, (WCHAR *)&stru_1407D2340.TrapFrame);
RtlInitUnicodeString(&Name, pszDest, v25);
v11 = Buffer;
v44.Data = &result;
v44.Size = 200;
v24 = PcwAddInstance(Buffer, &Name, v33 + KeMaximumProcessors, 1u, &v44);
if( v24 < 0 )
return v24;
}
v13 = v33 + 1;
v33 = v13;
if( v13 >= (unsigned __int16)KeNumberNodes )
{
v15 = v35;
v16 = (unsigned __int64)v39.Data;
goto LABEL_20;
}
}
}
InstanceId = Info->EnumerateInstances.InstanceId;
if( (unsigned int)InstanceId >= (unsigned int)KeNumberProcessors_0 )
return -1073741275;
ExpQueryProcessorInformationCounters(*(&KiProcessorBlock + InstanceId), v5, v6, v7, &v101);
InstanceMask = Info->AddCounter.InstanceMask;
v41.Data = &v101;
v41.Size = 200;
v24 = PcwAddInstance(v11, InstanceMask, InstanceId, 1u, &v41);
if( v24 >= 0 )
return 0;
return v24;
}Referenced by:
No references.