PpmCapturePerformanceDistribution
NTSTATUS __stdcall PpmCapturePerformanceDistribution(
VOID *Buffer,
UINT64 BufferSize,
UINT64 ProcessorCount,
_GROUP_AFFINITY *GroupAffinity,
UINT64 *ReturnSize){
int v5;
unsigned int v6;
unsigned __int64 Mask;
int v10;
_KPRCB *Prcb;
unsigned __int8 CurrentIrql;
NTSTATUS v13;
NTSTATUS result;
unsigned int v15;
UINT64 ProcIndex;
UINT64 Param1;
UINT64 Param2;
__int64 v19;
_KAFFINITY_ENUMERATION_CONTEXT Context;
_KAFFINITY_EX Affinity;
v5 = ProcessorCount;
v6 = BufferSize;
memset(&Affinity, 0i64, sizeof(Affinity));
Mask = GroupAffinity->Mask;
HIDWORD(Param2) = 4 * v5 + 4;
Context.CurrentIndex = GroupAffinity->Group;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
LODWORD(ProcIndex) = 0;
v19 = 0i64;
Param1 = (UINT64)Buffer;
LODWORD(Param2) = v6;
Context.CurrentMask = Mask;
Context.Affinity = 0i64;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v10 )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v13 = PpmCapturePerformanceDistributionCallback(Prcb, (UINT64)&Param1, 0i64);
__writecr8(CurrentIrql);
if( v13 < 0 )
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
KeAddProcessorAffinityEx(&Affinity.Count, Prcb->Number);
result = PopExecuteOnTargetProcessors(
&Affinity,
(INT64 *)PpmCapturePerformanceDistributionCallback,
(_KPRCB *)&Param1,
0i64,
ProcIndex,
Param1,
Param2);
if( result < 0 )
return result;
}
}
v15 = HIDWORD(Param2);
*(_DWORD *)ReturnSize = HIDWORD(Param2);
if( v15 > v6 )
return -1073741820;
*(_DWORD *)Param1 = v5;
return 0;
}Referenced by:
ExpQuerySystemInformation