PpmWmiGetAllData

NTSTATUS __stdcall PpmWmiGetAllData(
        PROCESSOR_POWER_STATE *PpmState,
        _GUID *GuidPtr,
        UINT64 BufferSize,
        VOID *Buffer,
        UINT64 *Size,
        UINT8 GetAllData){
  unsigned int v8; 
  __int64 v9; 
  __int64 v11; 
  _ETHREAD *CurrentThread; 
  char v13; 
  _PROC_PERF_DOMAIN *Domain; 
  __int64 v15; 
  size_t v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  unsigned int v19; 
  int v20; 
  NTSTATUS v21; 
  _DWORD *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; 
  NTSTATUS 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;
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 123, 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 = GetAllData != 0 ? 72 : 64;
  v20 = v19 + v16;
  if( v8 >= v19 + v16 )
  {
    v22 = (char *)Buffer + v19;
    *(_DWORD *)Buffer = v20;
    if( 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(v22, 0i64, v16);
    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(
            (_KPRCB *)&PpmState[-64],
            (UINT64 *)v22,
            0i64,
            (UINT64 *)v22 + 1,
            (UINT64 *)(v22 + 1),
            0i64);
      }
      else
      {
        v22[1] = PpmState->IdleStates->ProcessorIdleCount;
        v22[2] = PpmState->IdleStates->TargetState;
        v22[3] = PpmState->IdleStates->OldState;
        *((_QWORD *)v22 + 2) = PpmState[-64].PerfFeedback.StallTime;
        IdleStates = PpmState->IdleStates;
        ProcessorIdleCount = PpmState->IdleStates->ProcessorIdleCount;
        if( ProcessorIdleCount )
        {
          v29 = 0i64;
          v30 = v22 + 8;
          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
    {
      *v22 = 0;
      v22[1] = Domain->NominalFrequency;
      *((_QWORD *)v22 + 1) = 0i64;
      *((_QWORD *)v22 + 2) = 0i64;
      *((_BYTE *)v22 + 28) = 100;
      *((_BYTE *)v22 + 29) = Domain->Coordination;
      v22[8] = *(_DWORD *)(2736i64 * *(&stru_140C23628 + 441) + *(&stru_140C00F40 + 365) + 60);
      *((_QWORD *)v22 + 5) = Domain->Members.Bitmap[0];
      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((_POP_RW_LOCK *)((char *)&stru_140C23628 + 984));
  result = v21;
  if( v21 < 0 )
    v20 = 0;
  *(_DWORD *)Size = v20;
  return result;
}

Referenced by:

PpmWmiDispatch