Add OS version and more CPU frequency info.

This commit is contained in:
aignacio_sf 2008-01-08 01:03:28 +00:00
parent 70768a6f9b
commit 3e3f394930

View File

@ -22,17 +22,34 @@
#include "dtool_config.h"
#include "psapi.h"
#include "powrprof.h"
TypeHandle WinGraphicsPipe::_type_handle;
#define MAXIMUM_PROCESSORS 32
typedef struct _PROCESSOR_POWER_INFORMATION
{
ULONG Number;
ULONG MaxMhz;
ULONG CurrentMhz;
ULONG MhzLimit;
ULONG MaxIdleState;
ULONG CurrentIdleState;
}
PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
typedef BOOL (WINAPI *GetProcessMemoryInfoType) (HANDLE Process, PROCESS_MEMORY_COUNTERS *ppsmemCounters, DWORD cb);
typedef BOOL (WINAPI *GlobalMemoryStatusExType) (LPMEMORYSTATUSEX lpBuffer);
typedef long (__stdcall *CallNtPowerInformationType) (POWER_INFORMATION_LEVEL information_level, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength);
static int initialize = false;
static HMODULE psapi_dll = 0;
static HMODULE kernel32_dll = 0;
static HMODULE power_dll = 0;
static GetProcessMemoryInfoType GetProcessMemoryInfoFunction = 0;
static GlobalMemoryStatusExType GlobalMemoryStatusExFunction = 0;
static CallNtPowerInformationType CallNtPowerInformationFunction = 0;
void get_memory_information (DisplayInformation *display_information)
{
@ -641,6 +658,62 @@ int initialize_cpu_id (CPU_ID *cpu_id) {
return state;
}
int update_cpu_frequency_function (int processor_number, DisplayInformation *display_information)
{
int update;
update = false;
display_information -> _maximum_cpu_frequency = 0;
display_information -> _current_cpu_frequency = 0;
if (CallNtPowerInformationFunction) {
int i;
PVOID input_buffer;
PVOID output_buffer;
ULONG input_buffer_size;
ULONG output_buffer_size;
POWER_INFORMATION_LEVEL information_level;
PROCESSOR_POWER_INFORMATION *processor_power_information;
PROCESSOR_POWER_INFORMATION processor_power_information_array [MAXIMUM_PROCESSORS];
memset (processor_power_information_array, 0, sizeof (PROCESSOR_POWER_INFORMATION) * MAXIMUM_PROCESSORS);
processor_power_information = processor_power_information_array;
for (i = 0; i < MAXIMUM_PROCESSORS; i++) {
processor_power_information -> Number = 0xFFFFFFFF;
processor_power_information++;
}
information_level = ProcessorInformation;
input_buffer = NULL;
output_buffer = processor_power_information_array;
input_buffer_size = 0;
output_buffer_size = sizeof (PROCESSOR_POWER_INFORMATION) * MAXIMUM_PROCESSORS;
if (CallNtPowerInformationFunction (information_level, input_buffer, input_buffer_size, output_buffer, output_buffer_size) == 0) {
processor_power_information = processor_power_information_array;
for (i = 0; i < MAXIMUM_PROCESSORS; i++) {
if (processor_power_information -> Number == processor_number) {
PN_uint64 value;
value = processor_power_information -> MaxMhz;
display_information -> _maximum_cpu_frequency = value * 1000000;
value = processor_power_information -> CurrentMhz;
display_information -> _current_cpu_frequency = value * 1000000;
update = true;
break;
}
processor_power_information++;
}
}
}
return update;
}
////////////////////////////////////////////////////////////////////
// Function: WinGraphicsPipe::Constructor
// Access: Public
@ -781,6 +854,36 @@ WinGraphicsPipe() {
}
windisplay_cat.info() << "end CPU ID\n";
OSVERSIONINFO version_info;
version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx (&version_info)) {
sprintf (string, "OS version: %d.%d.%d.%d \n", version_info.dwMajorVersion, version_info.dwMinorVersion, version_info.dwPlatformId, version_info.dwBuildNumber);
windisplay_cat.info() << string;
windisplay_cat.info() << " " << version_info.szCSDVersion << "\n";
_display_information -> _os_version_major = version_info.dwMajorVersion;
_display_information -> _os_version_minor = version_info.dwMinorVersion;
_display_information -> _os_version_build = version_info.dwBuildNumber;
_display_information -> _os_platform_id = version_info.dwPlatformId;
}
HMODULE power_dll;
power_dll = LoadLibrary ("PowrProf.dll");
if (power_dll) {
CallNtPowerInformationFunction = (CallNtPowerInformationType) GetProcAddress (power_dll, "CallNtPowerInformation");
if (CallNtPowerInformationFunction) {
_display_information -> _update_cpu_frequency_function = update_cpu_frequency_function;
update_cpu_frequency_function(0, _display_information);
sprintf (string, "max Mhz %I64d, current Mhz %I64d \n", _display_information -> _maximum_cpu_frequency, _display_information -> _current_cpu_frequency);
windisplay_cat.info() << string;
}
}
if (state) {