KiSynchNumaCounterSetCallback

NTSTATUS __stdcall KiSynchNumaCounterSetCallback(PCW_CALLBACK_TYPE Type, PCW_CALLBACK_INFORMATION *Info, VOID *Context){
  __int32 v5; 
  __int32 v6; 
  struct _PCW_BUFFER *Buffer; 
  unsigned int v8; 
  bool i; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int16 v12; 
  int v13; 
  int v14; 
  _SYNCH_COUNTERS *p_SynchCounters; 
  _SYNCH_COUNTERS *v16; 
  NTSTATUS result; 
  UINT64 ProcIndex; 
  _UNICODE_STRING DestinationString; 
  _PCW_DATA v20; 
  _KAFFINITY_ENUMERATION_CONTEXT Contexta; 
  _PCW_DATA Data; 
  _SYNCH_COUNTERS SumProcInfo; 
  _SYNCH_COUNTERS v24; 
  WCHAR pszDest[12]; 

  memset(&Contexta, 0, sizeof(Contexta));
  memset(&SumProcInfo, 0i64, sizeof(SumProcInfo));
  memset(&v24, 0i64, sizeof(v24));
  LODWORD(ProcIndex) = 0;
  DestinationString = 0i64;
  if( Type == PcwCallbackAddCounter )
  {
    EtwReferenceSpinLockCounters();
    return 0;
  }
  v5 = Type - 1;
  if( !v5 )
  {
    EtwDereferenceSpinLockCounters();
    return 0;
  }
  v6 = v5 - 1;
  if( v6 && v6 != 1 )
    return 0;
  Buffer = Info->EnumerateInstances.Buffer;
  v8 = 0;
  for( i = KeNumberNodes != 0; i; i = v8 < (unsigned __int16)KeNumberNodes )
  {
    v10 = KeNodeBlock[v8];
    v11 = *(_QWORD *)(v10 + 136);
    if( v11 )
    {
      v12 = *(_WORD *)(v10 + 144);
      memset(&SumProcInfo, 0i64, sizeof(SumProcInfo));
      Contexta.CurrentMask = v11;
      v13 = 0;
      Contexta.CurrentIndex = v12;
      Contexta.Affinity = 0i64;
      while( 1 )
      {
        KeEnumerateNextProcessor(&ProcIndex, &Contexta);
        if( v14 )
          break;
        p_SynchCounters = &(*(&KiProcessorBlock + (unsigned int)ProcIndex))->SynchCounters;
        KiAddSynchCounters(&SumProcInfo, p_SynchCounters);
        KiAddSynchCounters(&v24, v16);
        RtlStringCbPrintfW(pszDest, 0x16ui64, (WCHAR *)&stru_1407D2340._Xmm15);
        RtlInitUnicodeString(&DestinationString, pszDest);
        Data.Data = p_SynchCounters;
        Data.Size = 184;
        result = PcwAddInstance(Buffer, &DestinationString, (unsigned int)ProcIndex, 1ui64, &Data);
        if( result < 0 )
          return result;
        ++v13;
      }
      RtlStringCbPrintfW(pszDest, 0x16ui64, (WCHAR *)&stru_1407D2340.TrapFrame);
      RtlInitUnicodeString(&DestinationString, pszDest);
      v20.Data = &SumProcInfo;
      v20.Size = 184;
      result = PcwAddInstance(Buffer, &DestinationString, v8 + (unsigned int)KeMaximumProcessors, 1ui64, &v20);
      if( result < 0 )
        return result;
    }
    ++v8;
  }
  RtlStringCbPrintfW(pszDest, 0x16ui64, (WCHAR *)&stru_1407D2340._MxCsr);
  RtlInitUnicodeString(&DestinationString, pszDest);
  v20.Data = &v24;
  v20.Size = 184;
  return PcwAddInstance(
           Buffer,
           &DestinationString,
           (unsigned int)KeMaximumProcessors + (unsigned __int16)KeNumberNodes,
           1ui64,
           &v20);
}

Referenced by:

No references.