PpmEventDomainPerfStateChange

VOID __stdcall PpmEventDomainPerfStateChange(_PROC_PERF_DOMAIN *Domain){
  unsigned __int64 v2; 
  _PROC_PERF_CHECK_CONTEXT *Master; 
  unsigned __int16 v4; 
  unsigned __int16 v5; 
  _GROUP_AFFINITY *v6; 
  bool v7; 
  unsigned __int64 v8; 
  int v9; 
  bool v10; 
  unsigned int v11; 
  _OWORD *v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  unsigned int v18; 
  __int64 v19; 
  __int64 v20; 
  int Autonomous; 
  __int64 v22; 
  REGHANDLE v23; 
  int v24; 
  int SelectedState; 
  unsigned int SelectedFrequency; 
  int v27; 
  int DataPtr[2]; 
  __int64 v29; 
  unsigned __int64 v30; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  unsigned int *p_SelectedFrequency; 
  __int64 v33; 
  int *v34; 
  __int64 v35; 
  _OWORD v36[20]; 

  if( Domain->Presence == ProcessorPresenceNt )
  {
    SelectedState = Domain->QosSelection[0].SelectedState;
    SelectedFrequency = Domain->QosSelection[0].SelectedFrequency;
    if( dword_140CED0CC )
    {
      DataPtr[0] = SelectedState;
      v2 = Domain->Members.Bitmap[0];
      Master = Domain->Master;
      v30 = v2;
      v29 = SelectedFrequency;
      DataPtr[1] = 0;
      PpmFireWmiEvent(&Master[-3].RelativePerformance, (_GUID *)&PPM_PERFSTATE_DOMAIN_CHANGE_GUID, 0x18ui64, DataPtr);
    }
    if( PpmEtwRegistered && EtwEventEnabled(PpmEtwHandle, &PPM_ETW_DOMAIN_PERF_STATE_CHANGE) )
    {
      v4 = 0;
      v5 = 0;
      LOWORD(v24) = 0;
      do
      {
        v6 = (_GROUP_AFFINITY *)&v36[v4];
        v7 = v5 < KeActiveProcessors.Count;
        *v6 = 0i64;
        v6->Group = v5;
        if( v7 )
          v8 = KeActiveProcessors.Bitmap[v5];
        else
          v8 = 0i64;
        v6->Mask = v8;
        KeAndGroupAffinityEx(&Domain->Members, v6, v6);
        v10 = v9 == 0;
        v4 = v24;
        if( !v10 )
        {
          v4 = v24 + 1;
          LOWORD(v24) = v24 + 1;
        }
        ++v5;
      }
      while( v5 < 0x14u );
      *(_QWORD *)&UserData.Size = 4i64;
      UserData.Ptr = (unsigned __int64)&SelectedState;
      p_SelectedFrequency = &SelectedFrequency;
      v33 = 4i64;
      v34 = &v24;
      v35 = 2i64;
      v11 = 3;
      if( v4 )
      {
        v12 = v36;
        v13 = v4;
        do
        {
          v14 = 2i64 * v11;
          *(&UserData.Ptr + v14) = (unsigned __int64)v12 + 8;
          *((_QWORD *)&UserData.Size + v14) = 2i64;
          v15 = 2i64 * (v11 + 1);
          v11 += 2;
          *(&UserData.Ptr + v15) = (unsigned __int64)v12++;
          *((_QWORD *)&UserData.Size + v15) = 8i64;
          --v13;
        }
        while( v13 );
      }
      v16 = 2i64 * v11;
      *(&UserData.Ptr + v16) = (unsigned __int64)&Domain->QosSelection[0].SelectedPercent;
      *((_QWORD *)&UserData.Size + v16) = 4i64;
      v17 = v11 + 1;
      v18 = v11 + 2;
      v17 *= 2i64;
      *(&UserData.Ptr + v17) = (unsigned __int64)&Domain->QosSelection[0].MinPercent;
      *((_QWORD *)&UserData.Size + v17) = 4i64;
      v19 = 2i64 * v18;
      *(&UserData.Ptr + v19) = (unsigned __int64)&Domain->QosSelection[0].MaxPercent;
      *((_QWORD *)&UserData.Size + v19) = 4i64;
      v20 = v18 + 1;
      v18 += 2;
      v20 *= 2i64;
      *(&UserData.Ptr + v20) = (unsigned __int64)&Domain->QosSelection[0].TolerancePercent;
      Autonomous = Domain->QosSelection[0].Autonomous;
      *((_QWORD *)&UserData.Size + v20) = 4i64;
      v27 = Autonomous;
      v22 = 2i64 * v18;
      *(&UserData.Ptr + v22) = (unsigned __int64)&v27;
      v23 = PpmEtwHandle;
      *((_QWORD *)&UserData.Size + v22) = 4i64;
      EtwWriteEx(v23, &PPM_ETW_DOMAIN_PERF_STATE_CHANGE, 0i64, 0, 0, 0, v18 + 1, &UserData);
    }
  }
}

Referenced by:

PpmPerfApplyDomainState