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.