Browse Source

Add OS version and more CPU frequency info.

aignacio_sf 18 years ago
parent
commit
3e3f394930
1 changed files with 103 additions and 0 deletions
  1. 103 0
      panda/src/windisplay/winGraphicsPipe.cxx

+ 103 - 0
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) {