1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef BASE_WIN_WINDOWS_VERSION_H_
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define BASE_WIN_WINDOWS_VERSION_H_
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#pragma once
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef void* HANDLE;
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base {
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace win {
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The running version of Windows.  This is declared outside OSInfo for
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// syntactic sugar reasons; see the declaration of GetVersion() below.
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// NOTE: Keep these in order so callers can do things like
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// "if (base::win::GetVersion() >= base::win::VERSION_VISTA) ...".
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickenum Version {
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VERSION_PRE_XP = 0,   // Not supported.
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VERSION_XP,
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VERSION_SERVER_2003,  // Also includes Windows XP Professional x64.
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VERSION_VISTA,
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VERSION_SERVER_2008,
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VERSION_WIN7,
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A Singleton that can be used to query various pieces of information about the
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// OS and process state.
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API OSInfo {
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  struct VersionNumber {
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int major;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int minor;
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int build;
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  struct ServicePack {
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int major;
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int minor;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The processor architecture this copy of Windows natively uses.  For
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // example, given an x64-capable processor, we have three possibilities:
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   32-bit Chrome running on 32-bit Windows:           X86_ARCHITECTURE
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   32-bit Chrome running on 64-bit Windows via WOW64: X64_ARCHITECTURE
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   64-bit Chrome running on 64-bit Windows:           X64_ARCHITECTURE
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum WindowsArchitecture {
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    X86_ARCHITECTURE,
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    X64_ARCHITECTURE,
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IA64_ARCHITECTURE,
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    OTHER_ARCHITECTURE,
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Whether a process is running under WOW64 (the wrapper that allows 32-bit
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // processes to run on 64-bit versions of Windows).  This will return
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // WOW64_DISABLED for both "32-bit Chrome on 32-bit Windows" and "64-bit
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Chrome on 64-bit Windows".  WOW64_UNKNOWN means "an error occurred", e.g.
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the process does not have sufficient access rights to determine this.
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum WOW64Status {
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WOW64_DISABLED,
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WOW64_ENABLED,
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WOW64_UNKNOWN,
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static OSInfo* GetInstance();
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Version version() const { return version_; }
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The next two functions return arrays of values, [major, minor(, build)].
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VersionNumber version_number() const { return version_number_; }
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ServicePack service_pack() const { return service_pack_; }
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WindowsArchitecture architecture() const { return architecture_; }
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int processors() const { return processors_; }
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  size_t allocation_granularity() const { return allocation_granularity_; }
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WOW64Status wow64_status() const { return wow64_status_; }
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Like wow64_status(), but for the supplied handle instead of the current
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // process.  This doesn't touch member state, so you can bypass the singleton.
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static WOW64Status GetWOW64StatusForProcess(HANDLE process_handle);
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  OSInfo();
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~OSInfo();
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Version version_;
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VersionNumber version_number_;
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ServicePack service_pack_;
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WindowsArchitecture architecture_;
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int processors_;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  size_t allocation_granularity_;
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WOW64Status wow64_status_;
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend struct DefaultSingletonTraits<OSInfo>;
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(OSInfo);
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Because this is by far the most commonly-requested value from the above
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// singleton, we add a global-scope accessor here as syntactic sugar.
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API Version GetVersion();
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace win
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace base
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // BASE_WIN_WINDOWS_VERSION_H_
107