1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef BASE_WIN_WINDOWS_VERSION_H_ 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define BASE_WIN_WINDOWS_VERSION_H_ 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string> 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/base_export.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/basictypes.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef void* HANDLE; 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace base { 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace win { 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The running version of Windows. This is declared outside OSInfo for 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// syntactic sugar reasons; see the declaration of GetVersion() below. 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// NOTE: Keep these in order so callers can do things like 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// "if (base::win::GetVersion() >= base::win::VERSION_VISTA) ...". 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochenum Version { 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_PRE_XP = 0, // Not supported. 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_XP, 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_SERVER_2003, // Also includes XP Pro x64 and Server 2003 R2. 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_VISTA, // Also includes Windows Server 2008. 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_WIN7, // Also includes Windows Server 2008 R2. 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_WIN8, // Also includes Windows Server 2012. 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_WIN8_1, // Code named Windows Blue 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VERSION_WIN_LAST, // Indicates error condition. 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A rough bucketing of the available types of versions of Windows. This is used 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// to distinguish enterprise enabled versions from home versions and potentially 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// server versions. 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochenum VersionType { 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SUITE_HOME, 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SUITE_PROFESSIONAL, 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SUITE_SERVER, 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SUITE_LAST, 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A singleton that can be used to query various pieces of information about the 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// OS and process state. Note that this doesn't use the base Singleton class, so 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// it can be used without an AtExitManager. 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass BASE_EXPORT OSInfo { 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct VersionNumber { 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int major; 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int minor; 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int build; 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct ServicePack { 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int major; 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int minor; 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 59 // The processor architecture this copy of Windows natively uses. For 60 // example, given an x64-capable processor, we have three possibilities: 61 // 32-bit Chrome running on 32-bit Windows: X86_ARCHITECTURE 62 // 32-bit Chrome running on 64-bit Windows via WOW64: X64_ARCHITECTURE 63 // 64-bit Chrome running on 64-bit Windows: X64_ARCHITECTURE 64 enum WindowsArchitecture { 65 X86_ARCHITECTURE, 66 X64_ARCHITECTURE, 67 IA64_ARCHITECTURE, 68 OTHER_ARCHITECTURE, 69 }; 70 71 // Whether a process is running under WOW64 (the wrapper that allows 32-bit 72 // processes to run on 64-bit versions of Windows). This will return 73 // WOW64_DISABLED for both "32-bit Chrome on 32-bit Windows" and "64-bit 74 // Chrome on 64-bit Windows". WOW64_UNKNOWN means "an error occurred", e.g. 75 // the process does not have sufficient access rights to determine this. 76 enum WOW64Status { 77 WOW64_DISABLED, 78 WOW64_ENABLED, 79 WOW64_UNKNOWN, 80 }; 81 82 static OSInfo* GetInstance(); 83 84 Version version() const { return version_; } 85 // The next two functions return arrays of values, [major, minor(, build)]. 86 VersionNumber version_number() const { return version_number_; } 87 VersionType version_type() const { return version_type_; } 88 ServicePack service_pack() const { return service_pack_; } 89 WindowsArchitecture architecture() const { return architecture_; } 90 int processors() const { return processors_; } 91 size_t allocation_granularity() const { return allocation_granularity_; } 92 WOW64Status wow64_status() const { return wow64_status_; } 93 std::string processor_model_name(); 94 95 // Like wow64_status(), but for the supplied handle instead of the current 96 // process. This doesn't touch member state, so you can bypass the singleton. 97 static WOW64Status GetWOW64StatusForProcess(HANDLE process_handle); 98 99 private: 100 OSInfo(); 101 ~OSInfo(); 102 103 Version version_; 104 VersionNumber version_number_; 105 VersionType version_type_; 106 ServicePack service_pack_; 107 WindowsArchitecture architecture_; 108 int processors_; 109 size_t allocation_granularity_; 110 WOW64Status wow64_status_; 111 std::string processor_model_name_; 112 113 DISALLOW_COPY_AND_ASSIGN(OSInfo); 114}; 115 116// Because this is by far the most commonly-requested value from the above 117// singleton, we add a global-scope accessor here as syntactic sugar. 118BASE_EXPORT Version GetVersion(); 119 120} // namespace win 121} // namespace base 122 123#endif // BASE_WIN_WINDOWS_VERSION_H_ 124