172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_info.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/win/windows_version.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::NumberOfProcessors() { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return win::OSInfo::GetInstance()->processors(); 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfPhysicalMemory() { 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MEMORYSTATUSEX memory_info; 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memory_info.dwLength = sizeof(memory_info); 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!GlobalMemoryStatusEx(&memory_info)) { 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 rv = static_cast<int64>(memory_info.ullTotalPhys); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv < 0) 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = kint64max; 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv; 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULARGE_INTEGER available, total, free; 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!GetDiskFreeSpaceExW(path.value().c_str(), &available, &total, &free)) { 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return -1; 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 rv = static_cast<int64>(available.QuadPart); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv < 0) 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = kint64max; 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemName() { 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return "Windows NT"; 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemVersion() { 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen win::OSInfo* os_info = win::OSInfo::GetInstance(); 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen win::OSInfo::VersionNumber version_number = os_info->version_number(); 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string version(StringPrintf("%d.%d", version_number.major, 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen version_number.minor)); 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen win::OSInfo::ServicePack service_pack = os_info->service_pack(); 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (service_pack.major != 0) { 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen version += StringPrintf(" SP%d", service_pack.major); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (service_pack.minor != 0) 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen version += StringPrintf(".%d", service_pack.minor); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return version; 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO: Implement OperatingSystemVersionComplete, which would include 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// patchlevel/service pack number. 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// See chrome/browser/ui/views/bug_report_view.cc, BugReportView::SetOSVersion. 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::CPUArchitecture() { 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO: Make this vary when we support any other architectures. 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return "x86"; 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) { 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (width) 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *width = GetSystemMetrics(SM_CXSCREEN); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (height) 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *height = GetSystemMetrics(SM_CYSCREEN); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::DisplayCount() { 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return GetSystemMetrics(SM_CMONITORS); 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t SysInfo::VMAllocationGranularity() { 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return win::OSInfo::GetInstance()->allocation_granularity(); 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SysInfo::OperatingSystemVersionNumbers(int32* major_version, 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int32* minor_version, 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int32* bugfix_version) { 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen win::OSInfo* os_info = win::OSInfo::GetInstance(); 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *major_version = os_info->version_number().major; 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *minor_version = os_info->version_number().minor; 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bugfix_version = 0; 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 109