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