83d6d47d082c60a1d513a281830a8ca8e71ef377
[WebKit-https.git] / Source / WebCore / platform / win / SystemInfo.cpp
1 /*
2  * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "SystemInfo.h"
28
29 #include <windows.h>
30 #include <wtf/text/StringConcatenate.h>
31
32 namespace WebCore {
33
34 WindowsVersion windowsVersion(int* major, int* minor)
35 {
36     static bool initialized = false;
37     static WindowsVersion version;
38     static int majorVersion, minorVersion;
39
40     if (!initialized) {
41         initialized = true;
42 #if OS(WINCE)
43         OSVERSIONINFO versionInfo = {0};
44 #else
45         OSVERSIONINFOEX versionInfo = {0};
46 #endif
47         versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
48         GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&versionInfo));
49         majorVersion = versionInfo.dwMajorVersion;
50         minorVersion = versionInfo.dwMinorVersion;
51
52 #if OS(WINCE)
53         if (majorVersion >= 1 && majorVersion <= 7)
54             version = static_cast<WindowsVersion>(WindowsCE1 + (majorVersion - 1));
55         else
56             version = (majorVersion < 1) ? WindowsCE1 : WindowsCE7;
57 #else
58         if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32s)
59             version = Windows3_1;
60         else if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
61             if (!minorVersion)
62                 version = Windows95;
63             else
64                 version = (minorVersion == 10) ? Windows98 : WindowsME;
65         } else {
66             if (majorVersion == 5) {
67                 if (!minorVersion)
68                     version = Windows2000;
69                 else
70                     version = (minorVersion == 1) ? WindowsXP : WindowsServer2003;
71             } else if (majorVersion >= 6) {
72                 if (versionInfo.wProductType == VER_NT_WORKSTATION)
73                     version = (majorVersion == 6 && !minorVersion) ? WindowsVista : Windows7;
74                 else
75                     version = WindowsServer2008;
76             } else
77                 version = (majorVersion == 4) ? WindowsNT4 : WindowsNT3;
78         }
79 #endif
80     }
81
82     if (major)
83         *major = majorVersion;
84     if (minor)
85         *minor = minorVersion;
86     return version;
87 }
88
89 static String osVersionForUAString()
90 {
91     int major, minor;
92     WindowsVersion version = windowsVersion(&major, &minor);
93     switch (version) {
94     case WindowsCE1:
95     case WindowsCE2:
96     case WindowsCE3:
97         return "Windows CE";
98     case WindowsCE4:
99         return "Windows CE .NET";
100     case Windows3_1:
101         return "Windows 3.1";
102     case Windows95:
103         return "Windows 95";
104     case Windows98:
105         return "Windows 98";
106     case WindowsME:
107         return "Windows 98; Win 9x 4.90";
108     case WindowsNT4:
109         return "WinNT4.0";
110     }
111
112     const char* familyName = (version >= WindowsNT3) ? "Windows NT " : "Windows CE ";
113     return makeString(familyName, String::number(major), '.', String::number(minor));
114 }
115
116 static bool isWOW64()
117 {
118     static bool initialized = false;
119     static bool wow64 = false;
120
121     if (!initialized) {
122         initialized = true;
123         HMODULE kernel32Module = GetModuleHandleA("kernel32.dll");
124         if (!kernel32Module)
125             return wow64;
126         typedef BOOL (WINAPI* IsWow64ProcessFunc)(HANDLE, PBOOL);
127         IsWow64ProcessFunc isWOW64Process = reinterpret_cast<IsWow64ProcessFunc>(GetProcAddress(kernel32Module, "IsWow64Process"));
128         if (isWOW64Process) {
129             BOOL result = FALSE;
130             wow64 = isWOW64Process(GetCurrentProcess(), &result) && result;
131         }
132     }
133
134     return wow64;
135 }
136
137 static WORD processorArchitecture()
138 {
139     static bool initialized = false;
140     static WORD architecture = PROCESSOR_ARCHITECTURE_INTEL;
141
142     if (!initialized) {
143         initialized = true;
144         HMODULE kernel32Module = GetModuleHandleA("kernel32.dll");
145         if (!kernel32Module)
146             return architecture;
147         typedef VOID (WINAPI* GetNativeSystemInfoFunc)(LPSYSTEM_INFO);
148         GetNativeSystemInfoFunc getNativeSystemInfo = reinterpret_cast<GetNativeSystemInfoFunc>(GetProcAddress(kernel32Module, "GetNativeSystemInfo"));
149         if (getNativeSystemInfo) {
150             SYSTEM_INFO systemInfo = {0};
151             getNativeSystemInfo(&systemInfo);
152             architecture = systemInfo.wProcessorArchitecture;
153         }
154     }
155
156     return architecture;
157 }
158
159 static String architectureTokenForUAString()
160 {
161 #if !OS(WINCE)
162     if (isWOW64())
163         return "; WOW64";
164     if (processorArchitecture() == PROCESSOR_ARCHITECTURE_AMD64)
165         return "; Win64; x64";
166     if (processorArchitecture() == PROCESSOR_ARCHITECTURE_IA64)
167         return "; Win64; IA64";
168 #endif
169     return String();
170 }
171
172 String windowsVersionForUAString()
173 {
174     return makeString(osVersionForUAString(), architectureTokenForUAString());
175 }
176
177 } // namespace WebCore