Files
CpuPowerRegulator/AwSystem.cpp
2024-02-05 23:22:57 +08:00

94 lines
2.9 KiB
C++

#include "AwSystem.h"
#include <windows.h>
#include <powerbase.h>
#include <powersetting.h>
#pragma comment(lib, "PowrProf.lib")
typedef struct _PROCESSOR_POWER_INFORMATION {
ULONG Number;
ULONG MaxMhz;
ULONG CurrentMhz;
ULONG MhzLimit;
ULONG MaxIdleState;
ULONG CurrentIdleState;
} PROCESSOR_POWER_INFORMATION, * PPROCESSOR_POWER_INFORMATION;
uint64_t AwSystem::getCpuFrequency() {
uint64_t cpuFreq = 0;
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
uint32_t cpuPowerInfoArraySize = sizeof(PROCESSOR_POWER_INFORMATION) * systemInfo.dwNumberOfProcessors;
PROCESSOR_POWER_INFORMATION* cpuPowerInfoArray = new PROCESSOR_POWER_INFORMATION[systemInfo.dwNumberOfProcessors];
if (cpuPowerInfoArray == nullptr) {
return cpuFreq;
}
auto status = CallNtPowerInformation(ProcessorInformation, NULL, 0, (void*)cpuPowerInfoArray, cpuPowerInfoArraySize);
/*
if (status == 0) {
for (size_t i = 0; i < systemInfo.dwNumberOfProcessors; i++)
{
std::cout << "Power levels for Processor #" << cpuPowerInfoArray[i].Number << "\n"
"MaxMhz: " << cpuPowerInfoArray[i].MaxMhz << "\n"
"CurrentMhz: " << cpuPowerInfoArray[i].CurrentMhz << "\n"
"MhzLimit: " << cpuPowerInfoArray[i].MhzLimit << "\n"
"MaxIdleState: " << cpuPowerInfoArray[i].MaxIdleState << "\n"
"CurrentIdleState: " << cpuPowerInfoArray[i].CurrentIdleState << "\n"
<< std::endl;
}
}
*/
cpuFreq = cpuPowerInfoArray[0].CurrentMhz;
delete[] cpuPowerInfoArray;
return cpuFreq;
}
bool AwSystem::isUsingPowerAdapter() {
SYSTEM_POWER_STATUS powerStatus;
GetSystemPowerStatus(&powerStatus);
return powerStatus.ACLineStatus == 1;
}
void AwSystem::setCpuPowerIndex(uint64_t percentage, uint32_t sleepInMs) {
GUID guid, * scheme = &guid;
PowerGetActiveScheme(NULL, &scheme);
if (isUsingPowerAdapter()) {
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_THROTTLE_MAXIMUM, percentage);
}
else {
PowerWriteDCValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_THROTTLE_MAXIMUM, percentage);
}
PowerSetActiveScheme(NULL, scheme);
if (sleepInMs > 0) {
Sleep(sleepInMs);
}
}
uint64_t AwSystem::getCpuPowerIndex() {
GUID guid, * scheme = &guid;
uint64_t value = 0;
uint64_t valueSize = sizeof(value);
PUCHAR a;
PowerGetActiveScheme(NULL, &scheme);
if (isUsingPowerAdapter()) {
PowerReadACValue(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_THROTTLE_MAXIMUM, NULL, (PUCHAR)&value, (LPDWORD)&valueSize);
}
else {
PowerReadDCValue(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_THROTTLE_MAXIMUM, NULL, (PUCHAR)&value, (LPDWORD)&valueSize);
}
return value;
}