PpmEventTraceProcessorPerformanceDomainRundown

VOID __stdcall PpmEventTraceProcessorPerformanceDomainRundown(INT64 a1, INT64 a2, NPTEXTMETRIC *a3){
  VOID **PoolWithTag; 
  unsigned __int16 v5; 
  UINT16 i; 
  _GROUP_AFFINITY *v7; 
  unsigned __int64 v8; 
  int v9; 
  bool v10; 
  unsigned int v11; 
  _OWORD *v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  unsigned __int16 v17; 
  __int64 v18; 
  __int64 v19; 
  ULONG v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned __int16 j; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  unsigned int v28; 
  unsigned __int16 v29; 
  int v30; 
  _EVENT_DATA_DESCRIPTOR UserData[42]; 
  _OWORD v32[20]; 

  PoolWithTag = 0i64;
  if( PpmEtwRegistered && EtwEventEnabled(PpmEtwHandle, &PPM_ETW_PERF_DOMAIN_RUNDOWN) )
  {
    v5 = 0;
    v29 = 0;
    for( i = 0; i < 0x14u; ++i )
    {
      v7 = (_GROUP_AFFINITY *)&v32[v5];
      *v7 = 0i64;
      v7->Group = i;
      LODWORD(v8) = KeQueryGroupAffinity(i);
      v7->Mask = v8;
      KeAndGroupAffinityEx((_KAFFINITY_EX *)(a1 + 24), v7, v7);
      v10 = v9 == 0;
      v5 = v29;
      if( !v10 )
        v5 = ++v29;
    }
    UserData[0].Ptr = (unsigned __int64)&v29;
    v11 = 1;
    *(_QWORD *)&UserData[0].Size = 2i64;
    if( v5 )
    {
      v12 = v32;
      v13 = v5;
      do
      {
        v14 = v11;
        UserData[v14].Ptr = (unsigned __int64)v12 + 8;
        *(_QWORD *)&UserData[v14].Size = 2i64;
        v15 = v11 + 1;
        v11 += 2;
        UserData[v15].Ptr = (unsigned __int64)v12++;
        *(_QWORD *)&UserData[v15].Size = 8i64;
        --v13;
      }
      while( v13 );
    }
    v16 = *(_DWORD *)(a1 + 200);
    v17 = 0;
    v18 = v11;
    v19 = 0i64;
    v20 = v11 + 1;
    v30 = 0;
    UserData[v18].Ptr = (unsigned __int64)&v30;
    *(_QWORD *)&UserData[v18].Size = 4i64;
    if( v16 )
    {
      v21 = *(_QWORD *)(a1 + 216);
      do
      {
        if( *(_DWORD *)(136i64 * v17 + v21 + 16) == 1 )
        {
          v19 = (unsigned int)(v19 + 1);
          v30 = v19;
        }
        ++v17;
      }
      while( v17 < v16 );
      if( (_DWORD)v19 )
      {
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 4 * v19, 1699565648i64);
        if( !PoolWithTag )
          return;
        v22 = 0;
        for( j = 0; (unsigned int)j < *(_DWORD *)(a1 + 200); ++j )
        {
          v24 = *(_QWORD *)(a1 + 216);
          v25 = 136i64 * j;
          if( *(_DWORD *)(v25 + v24 + 16) == 1 )
          {
            v26 = v22++;
            *((_DWORD *)PoolWithTag + v26) = *(_DWORD *)(v25 + v24 + 20);
          }
        }
        v27 = v20;
        v28 = 4 * v30;
        ++v20;
        UserData[v27].Ptr = (unsigned __int64)PoolWithTag;
        UserData[v27].Size = v28;
        UserData[v27].Reserved = 0;
      }
    }
    EtwWrite(PpmEtwHandle, &PPM_ETW_PERF_DOMAIN_RUNDOWN, 0, v20, UserData);
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0x654D5050u);
  }
}

Referenced by:

PpmEventTraceControlCallback