From 3e3f3949300c015b5f2ffe392b43786e67b8abd3 Mon Sep 17 00:00:00 2001 From: aignacio_sf <> Date: Tue, 8 Jan 2008 01:03:28 +0000 Subject: [PATCH] Add OS version and more CPU frequency info. --- panda/src/windisplay/winGraphicsPipe.cxx | 103 +++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/panda/src/windisplay/winGraphicsPipe.cxx b/panda/src/windisplay/winGraphicsPipe.cxx index 58702c8dcb..e5a6f474c1 100644 --- a/panda/src/windisplay/winGraphicsPipe.cxx +++ b/panda/src/windisplay/winGraphicsPipe.cxx @@ -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) {