PpmEventTraceProcessorIdle

VOID __stdcall PpmEventTraceProcessorIdle(_KPRCB *Prcb){
  _PPM_IDLE_STATES *IdleStates; 
  int Type; 
  unsigned int ProcessorIdleCount; 
  ULONG v5; 
  size_t v6; 
  VOID **PoolWithTag; 
  _EVENT_DATA_DESCRIPTOR *UserData; 
  unsigned int v9; 
  _EVENT_DATA_DESCRIPTOR *v10; 
  __int64 v11; 
  _EVENT_DATA_DESCRIPTOR *v12; 
  const wchar_t *Buffer; 
  __int64 v14; 
  int MaximumLength; 
  __int16 Group; 
  unsigned int v17; 
  int v18; 

  if( PpmEtwRegistered && EtwEventEnabled(PpmEtwHandle, &PPM_ETW_CURRENT_IDLE_RUNDOWN) )
  {
    IdleStates = Prcb->PowerState.IdleStates;
    if( IdleStates )
    {
      ProcessorIdleCount = IdleStates->ProcessorIdleCount;
      v17 = ProcessorIdleCount;
      Type = IdleStates->Type;
    }
    else
    {
      v17 = 0;
      Type = 0;
      ProcessorIdleCount = 0;
    }
    v18 = Type;
    v5 = 2 * ProcessorIdleCount + 4;
    v6 = 16 * v5 + 37 * ProcessorIdleCount;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 1699565648i64);
    UserData = (_EVENT_DATA_DESCRIPTOR *)PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, v6);
      Group = Prcb->Group;
      v9 = 0;
      UserData->Reserved = 0;
      UserData[1].Reserved = 0;
      UserData[2].Reserved = 0;
      UserData[3].Reserved = 0;
      UserData->Ptr = (unsigned __int64)&Group;
      UserData[1].Ptr = (unsigned __int64)&Prcb->GroupIndex;
      UserData[2].Ptr = (unsigned __int64)&v18;
      v10 = &UserData[v5];
      UserData[3].Ptr = (unsigned __int64)&v17;
      UserData->Size = 2;
      UserData[1].Size = 1;
      UserData[2].Size = 4;
      for( UserData[3].Size = 4; v9 < v17; UserData[v14].Reserved = 0 )
      {
        v11 = v9;
        v12 = &UserData[2 * v9 + 4];
        LODWORD(v10->Ptr) = IdleStates->State[v11].Latency;
        HIDWORD(v10->Ptr) = IdleStates->State[v11].BreakEvenDuration;
        LOBYTE(v10->Size) = IdleStates->State[v11].StateType;
        *(unsigned int *)((char *)&v10->Size + 1) = IdleStates->State[v11].InterruptsEnabled;
        *(unsigned int *)((char *)&v10->Reserved + 1) = IdleStates->State[v11].Interruptible;
        *(_DWORD *)((char *)&v10[1].Ptr + 1) = IdleStates->State[v11].ContextRetained;
        *(_DWORD *)((char *)&v10[1].Ptr + 5) = IdleStates->State[v11].CacheCoherent;
        *(unsigned int *)((char *)&v10[1].Size + 1) = IdleStates->State[v11].WakesSpuriously;
        *(unsigned int *)((char *)&v10[1].Reserved + 1) = IdleStates->State[v11].PlatformOnly;
        *(_DWORD *)((char *)&v10[2].Ptr + 1) = IdleStates->State[v11].NoCState;
        v12->Reserved = 0;
        v12->Ptr = (unsigned __int64)v10;
        v12->Size = 37;
        Buffer = IdleStates->State[v11].Name.Buffer;
        v14 = 2 * v9 + 5;
        if( Buffer )
        {
          MaximumLength = IdleStates->State[v11].Name.MaximumLength;
        }
        else
        {
          MaximumLength = 28;
          Buffer = L"";
        }
        UserData[2 * v9 + 5].Ptr = (unsigned __int64)Buffer;
        v10 = (_EVENT_DATA_DESCRIPTOR *)((char *)v10 + 37);
        UserData[2 * v9++ + 5].Size = MaximumLength;
      }
      EtwWrite(PpmEtwHandle, &PPM_ETW_CURRENT_IDLE_RUNDOWN, 0, v5, UserData);
      ExFreePoolWithTag(UserData, 0x654D5050u);
    }
  }
}

Referenced by:

PpmEventTraceControlCallback