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