sys_info_win.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/scoped_ptr.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::NumberOfProcessors() {
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SYSTEM_INFO info;
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GetSystemInfo(&info);
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(info.dwNumberOfProcessors);
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfPhysicalMemory() {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MEMORYSTATUSEX memory_info;
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memory_info.dwLength = sizeof(memory_info);
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!GlobalMemoryStatusEx(&memory_info)) {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 rv = static_cast<int64>(memory_info.ullTotalPhys);
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (rv < 0)
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    rv = kint64max;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return rv;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfFreeDiskSpace(const FilePath& path) {
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ULARGE_INTEGER available, total, free;
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!GetDiskFreeSpaceExW(path.value().c_str(), &available, &total, &free)) {
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return -1;
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 rv = static_cast<int64>(available.QuadPart);
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (rv < 0)
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    rv = kint64max;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return rv;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemName() {
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return "Windows NT";
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemVersion() {
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  OSVERSIONINFO info = {0};
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GetVersionEx(&info);
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return base::StringPrintf("%lu.%lu",
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            info.dwMajorVersion, info.dwMinorVersion);
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO: Implement OperatingSystemVersionComplete, which would include
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// patchlevel/service pack number. See chrome/browser/views/bug_report_view.cc,
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// BugReportView::SetOSVersion.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::CPUArchitecture() {
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TODO: Make this vary when we support any other architectures.
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return "x86";
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) {
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (width)
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *width = GetSystemMetrics(SM_CXSCREEN);
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (height)
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *height = GetSystemMetrics(SM_CYSCREEN);
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::DisplayCount() {
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return GetSystemMetrics(SM_CMONITORS);
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t SysInfo::VMAllocationGranularity() {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SYSTEM_INFO sysinfo;
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GetSystemInfo(&sysinfo);
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return sysinfo.dwAllocationGranularity;
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SysInfo::OperatingSystemVersionNumbers(int32 *major_version,
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            int32 *minor_version,
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            int32 *bugfix_version) {
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  OSVERSIONINFO info = {0};
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  info.dwOSVersionInfoSize = sizeof(info);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GetVersionEx(&info);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *major_version = info.dwMajorVersion;
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *minor_version = info.dwMinorVersion;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *bugfix_version = 0;
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
110