PpmWmiGetAllData

INT64 __fastcall PpmWmiGetAllData(
        const _PROCESSOR_POWER_STATE *PpmState,
        const _GUID *GuidPtr,
        UINT64 BufferSize,
        VOID *Buffer,
        UINT64 *Size,
        INT64 GetAllData){
  unsigned int v8; 
  __int64 v9; 
  __int64 v11; 
  _ETHREAD *CurrentThread; 
  char v13; 
  _PROC_PERF_DOMAIN *Domain; 
  __int64 v15; 
  unsigned int v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  unsigned int v19; 
  int v20; 
  int v21; 
  char *v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  _PPM_IDLE_STATES *IdleStates; 
  unsigned int ProcessorIdleCount; 
  __int64 v29; 
  unsigned int *v30; 
  __int64 v31; 
  __int64 v32; 
  INT64 result; 
  v8 = BufferSize;
  v9 = PPM_IDLESTATES_DATA_GUID;
  v11 = PPM_IDLESTATES_DATA_GUID - *(_QWORD *)&GuidPtr->Data1;
  if( !v11 )
    v11 = 0xE710D47A1ACF1686ui64 - *(_QWORD *)GuidPtr->Data4;
  if( v11 )
  {
    v13 = 0;
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v13 = 1;
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockSharedEx((UINT64)&PpmIdlePolicyLock, 0i64);
    v9 = PPM_IDLESTATES_DATA_GUID;
  }
  Domain = PpmState->CheckContext.Domain;
  v15 = PPM_PERFSTATES_DATA_GUID - *(_QWORD *)&GuidPtr->Data1;
  if( PPM_PERFSTATES_DATA_GUID == *(_QWORD *)&GuidPtr->Data1 )
    v15 = 0x26018D33012BAAB4i64 - *(_QWORD *)GuidPtr->Data4;
  if( v15 || !Domain )
  {
    v17 = v9 - *(_QWORD *)&GuidPtr->Data1;
    if( !v17 )
      v17 = 0xE710D47A1ACF1686ui64 - *(_QWORD *)GuidPtr->Data4;
    if( v17 || !PpmState->IdleStates )
    {
      v18 = PPM_PERFMON_PERFSTATE_GUID - *(_QWORD *)&GuidPtr->Data1;
      if( PPM_PERFMON_PERFSTATE_GUID == *(_QWORD *)&GuidPtr->Data1 )
        v18 = 0x9E75876A060BA1B0ui64 - *(_QWORD *)GuidPtr->Data4;
      if( v18 || !Domain )
      {
        v21 = -1073741808;
        v20 = 0;
        goto LABEL_48;
      }
      v16 = 12;
    }
    else
    {
      v16 = 32 * PpmState->IdleStates->ProcessorIdleCount + 56;
    }
  }
  else
  {
    v16 = 80;
  }
  v19 = (_BYTE)GetAllData != 0 ? 72 : 64;
  v20 = v19 + v16;
  if( v8 >= v19 + v16 )
  {
    v22 = (char *)Buffer + v19;
    *(_DWORD *)Buffer = v20;
    if( (_BYTE)GetAllData )
    {
      v23 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
      *((_DWORD *)Buffer + 11) |= 0x10u;
      *((_QWORD *)Buffer + 2) = v23;
      *((_DWORD *)Buffer + 13) = 1;
      *((_DWORD *)Buffer + 12) = v19;
    }
    else
    {
      *((_DWORD *)Buffer + 14) = v19;
    }
    *((_DWORD *)Buffer + 15) = v16;
    memset((INT64)v22, 0i64);
    v24 = *(_QWORD *)&GuidPtr->Data1;
    v25 = PPM_PERFSTATES_DATA_GUID - *(_QWORD *)&GuidPtr->Data1;
    if( PPM_PERFSTATES_DATA_GUID == *(_QWORD *)&GuidPtr->Data1 )
      v25 = 0x26018D33012BAAB4i64 - *(_QWORD *)GuidPtr->Data4;
    if( v25 || !Domain )
    {
      v26 = PPM_IDLESTATES_DATA_GUID - v24;
      if( PPM_IDLESTATES_DATA_GUID == v24 )
        v26 = 0xE710D47A1ACF1686ui64 - *(_QWORD *)GuidPtr->Data4;
      if( v26 || !PpmState->IdleStates )
      {
        v32 = PPM_PERFMON_PERFSTATE_GUID - *(_QWORD *)&GuidPtr->Data1;
        if( PPM_PERFMON_PERFSTATE_GUID == *(_QWORD *)&GuidPtr->Data1 )
          v32 = 0x9E75876A060BA1B0ui64 - *(_QWORD *)GuidPtr->Data4;
        if( !v32 && Domain )
          PpmPerfGetCurrentState((__int64)&PpmState[-64], v22, 0i64, (_DWORD *)v22 + 2, (_DWORD *)v22 + 1, 0i64);
      }
      else
      {
        *((_DWORD *)v22 + 1) = PpmState->IdleStates->ProcessorIdleCount;
        *((_DWORD *)v22 + 2) = PpmState->IdleStates->TargetState;
        *((_DWORD *)v22 + 3) = PpmState->IdleStates->OldState;
        *((_QWORD *)v22 + 2) = PpmState[-64].PerfFeedback.StallTime;
        IdleStates = PpmState->IdleStates;
        ProcessorIdleCount = PpmState->IdleStates->ProcessorIdleCount;
        if( ProcessorIdleCount )
        {
          v29 = 0i64;
          v30 = (unsigned int *)(v22 + 32);
          v31 = ProcessorIdleCount;
          do
          {
            v29 += 248i64;
            *(v30 - 2) = *(_DWORD *)((char *)&PpmState->IdleStates->CoordinatedTracing + v29) / 0xAu;
            *(v30 - 1) = *(unsigned int *)((char *)&PpmState->IdleStates->ProcessorMenu.Count + v29);
            *v30 = IdleStates->PrepareInfo.Constraints.TimeCheck;
            v30 += 8;
            *((_BYTE *)v30 - 28) = IdleStates->PrepareInfo.Constraints.PromotePercent;
            *((_BYTE *)v30 - 27) = IdleStates->PrepareInfo.Constraints.DemotePercent;
            *((_BYTE *)v30 - 26) = *((_BYTE *)&PpmState->IdleStates->CoordinatedSelection.Selection + v29);
            *((_QWORD *)v30 - 3) = *(unsigned int *)((char *)&PpmState->IdleStates->ProcessorMenu.Count + v29 + 4);
            *(v30 - 4) = 1;
            --v31;
          }
          while( v31 );
        }
      }
    }
    else
    {
      *(_DWORD *)v22 = 0;
      *((_DWORD *)v22 + 1) = Domain->NominalFrequency;
      *((_QWORD *)v22 + 1) = 0i64;
      *((_QWORD *)v22 + 2) = 0i64;
      v22[28] = 100;
      v22[29] = Domain->Coordination;
      *((_DWORD *)v22 + 8) = *((_DWORD *)PpmCurrentProfile + 684 * dword_140C23D0C + 15);
      *((_QWORD *)v22 + 5) = Domain->Members.Bitmap[0];
      *((_DWORD *)v22 + 16) = 1;
    }
  }
  else
  {
    if( v8 < 0x38 )
    {
      v21 = -1073741789;
      goto LABEL_48;
    }
    *((_DWORD *)Buffer + 12) = v20;
    v20 = 56;
    *((_DWORD *)Buffer + 11) = 32;
  }
  v21 = 0;
LABEL_48:
  if( v13 )
    PopReleaseRwLock((UINT64)&PpmIdlePolicyLock);
  result = (unsigned int)v21;
  if( v21 < 0 )
    v20 = 0;
  *(_DWORD *)Size = v20;
  return result;
}

Referenced by:

PpmWmiDispatch