PpmEventTraceProcessorIdleAccounting

NTSTATUS __stdcall PpmEventTraceProcessorIdleAccounting(_KPRCB *Prcb, UINT64 Param1, UINT64 Param2){
  int v3; 
  VOID **v5; 
  _PPM_IDLE_STATES *IdleStates; 
  _PROC_IDLE_ACCOUNTING *IdleAccounting; 
  unsigned int StateCount; 
  VOID **PoolWithTag; 
  _QWORD *v10; 
  unsigned __int64 *p_InterruptibleCount; 
  __int64 v12; 
  unsigned __int64 v13; 
  VOID **v14; 
  VOID **v15; 
  ULONG UserDataCount; 
  __int16 Group; 
  unsigned int v19; 
  UINT64 v20; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  __int16 *p_Group; 
  __int64 v23; 
  unsigned __int8 *p_GroupIndex; 
  __int64 v25; 
  UINT64 *v26; 
  __int64 v27; 
  int *v28; 
  __int64 v29; 
  VOID **v30; 
  int v31; 
  int v32; 

  v3 = 0;
  v5 = 0i64;
  Group = 0;
  v19 = 0;
  v20 = 0i64;
  if( PpmEtwRegistered )
  {
    if( EtwEventEnabled(PpmEtwHandle, &PPM_ETW_IDLE_ACCOUNTING_RUNDOWN) )
    {
      IdleStates = Prcb->PowerState.IdleStates;
      if( IdleStates )
      {
        IdleAccounting = Prcb->PowerState.IdleAccounting;
        if( IdleAccounting )
        {
          StateCount = IdleAccounting->StateCount;
          if( IdleStates->InterfaceVersion == 1 )
          {
            v3 = 80 * StateCount;
            PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 80 * StateCount, 1699565648i64);
            v5 = PoolWithTag;
            if( !PoolWithTag )
              return 0;
            memset(PoolWithTag, 0i64, 80 * StateCount);
            if( StateCount )
            {
              v10 = v5 + 3;
              p_InterruptibleCount = &IdleAccounting->State[0].SelectionStatistics.InterruptibleCount;
              v12 = StateCount;
              do
              {
                *(v10 - 3) = *(p_InterruptibleCount - 1);
                v13 = *p_InterruptibleCount;
                p_InterruptibleCount += 125;
                *(v10 - 1) = v13;
                *v10 = *(p_InterruptibleCount - 130);
                v10 += 10;
                *(v10 - 9) = *(p_InterruptibleCount - 129);
                *(v10 - 6) = *(p_InterruptibleCount - 132);
                *(v10 - 5) = *(p_InterruptibleCount - 133);
                *(v10 - 4) = *(p_InterruptibleCount - 134);
                *(v10 - 12) = *(p_InterruptibleCount - 124);
                *(v10 - 8) = *(p_InterruptibleCount - 122);
                *(v10 - 7) = *(p_InterruptibleCount - 123);
                --v12;
              }
              while( v12 );
            }
          }
          v14 = ExAllocatePoolWithTag(0x200ui64, 416 * StateCount + 24, 1699565648i64);
          v15 = v14;
          if( v14 )
          {
            memset(v14, 0i64, 416 * StateCount + 24);
            PpmTranslateIdleAccounting(&Prcb->PowerState, (__int64)v15, &v20);
            Group = Prcb->Group;
            p_Group = &Group;
            p_GroupIndex = &Prcb->GroupIndex;
            v26 = &v20;
            UserDataCount = 5;
            UserData.Ptr = (unsigned __int64)v15;
            UserData.Size = 416 * StateCount + 24;
            UserData.Reserved = 0;
            v23 = 2i64;
            v25 = 1i64;
            v27 = 8i64;
            if( v5 )
            {
              UserDataCount = 6;
              v30 = v5;
              v31 = v3;
              v32 = 0;
            }
            else
            {
              StateCount = 0;
            }
            v19 = StateCount;
            v28 = (int *)&v19;
            v29 = 4i64;
            EtwWriteEx(PpmEtwHandle, &PPM_ETW_IDLE_ACCOUNTING_RUNDOWN, 0i64, 0, 0, 0, UserDataCount, &UserData);
            ExFreePoolWithTag(v15, 0x654D5050u);
          }
          if( v5 )
            ExFreePoolWithTag(v5, 0x654D5050u);
        }
      }
    }
  }
  return 0;
}

Referenced by:

No references.