|
18 | 18 | package org.jackhuang.hmcl.util.platform; |
19 | 19 |
|
20 | 20 | import org.jackhuang.hmcl.util.KeyValuePairProperties; |
| 21 | +import org.jackhuang.hmcl.util.platform.windows.Kernel32; |
| 22 | +import org.jackhuang.hmcl.util.platform.windows.WinTypes; |
21 | 23 |
|
22 | 24 | import java.io.BufferedReader; |
23 | 25 | import java.io.File; |
|
29 | 31 | import java.nio.file.Files; |
30 | 32 | import java.nio.file.Path; |
31 | 33 | import java.nio.file.Paths; |
32 | | -import java.util.Arrays; |
33 | | -import java.util.Collections; |
34 | | -import java.util.Locale; |
35 | | -import java.util.Map; |
| 34 | +import java.util.*; |
36 | 35 | import java.util.regex.Matcher; |
37 | 36 | import java.util.regex.Pattern; |
38 | 37 |
|
@@ -159,48 +158,69 @@ public String getJavaExecutable() { |
159 | 158 | if (CURRENT_OS == WINDOWS) { |
160 | 159 | String versionNumber = null; |
161 | 160 | int buildNumber = -1; |
| 161 | + int codePage = -1; |
162 | 162 |
|
163 | | - try { |
164 | | - Process process = Runtime.getRuntime().exec(new String[]{"cmd", "ver"}); |
165 | | - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), NATIVE_CHARSET))) { |
166 | | - Matcher matcher = Pattern.compile("(?<version>[0-9]+\\.[0-9]+\\.(?<build>[0-9]+)(\\.[0-9]+)?)]$") |
167 | | - .matcher(reader.readLine().trim()); |
| 163 | + Kernel32 kernel32 = Kernel32.INSTANCE; |
168 | 164 |
|
169 | | - if (matcher.find()) { |
170 | | - versionNumber = matcher.group("version"); |
171 | | - buildNumber = Integer.parseInt(matcher.group("build")); |
| 165 | + // Get Windows version number |
| 166 | + if (kernel32 != null) { |
| 167 | + WinTypes.OSVERSIONINFOEXW osVersionInfo = new WinTypes.OSVERSIONINFOEXW(); |
| 168 | + if (kernel32.GetVersionExW(osVersionInfo)) { |
| 169 | + int majorVersion = osVersionInfo.dwMajorVersion; |
| 170 | + int minorVersion = osVersionInfo.dwMinorVersion; |
| 171 | + |
| 172 | + buildNumber = osVersionInfo.dwBuildNumber; |
| 173 | + versionNumber = majorVersion + "." + minorVersion + "." + buildNumber; |
| 174 | + } else |
| 175 | + System.err.println("Failed to obtain OS version number (" + kernel32.GetLastError() + ")"); |
| 176 | + } |
| 177 | + |
| 178 | + if (versionNumber == null) { |
| 179 | + try { |
| 180 | + Process process = Runtime.getRuntime().exec(new String[]{"cmd", "ver"}); |
| 181 | + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), NATIVE_CHARSET))) { |
| 182 | + Matcher matcher = Pattern.compile("(?<version>[0-9]+\\.[0-9]+\\.(?<build>[0-9]+)(\\.[0-9]+)?)]$") |
| 183 | + .matcher(reader.readLine().trim()); |
| 184 | + |
| 185 | + if (matcher.find()) { |
| 186 | + versionNumber = matcher.group("version"); |
| 187 | + buildNumber = Integer.parseInt(matcher.group("build")); |
| 188 | + } |
172 | 189 | } |
| 190 | + process.destroy(); |
| 191 | + } catch (Throwable ignored) { |
173 | 192 | } |
174 | | - process.destroy(); |
175 | | - } catch (Throwable ignored) { |
176 | 193 | } |
177 | 194 |
|
178 | | - if (versionNumber == null) { |
| 195 | + if (versionNumber == null) |
179 | 196 | versionNumber = System.getProperty("os.version"); |
180 | | - } |
181 | 197 |
|
182 | | - String osName = System.getProperty("os.name"); |
| 198 | + // Get Code Page |
183 | 199 |
|
184 | | - // Java 17 or earlier recognizes Windows 11 as Windows 10 |
185 | | - if (osName.equals("Windows 10") && buildNumber >= 22000) { |
186 | | - osName = "Windows 11"; |
187 | | - } |
188 | | - |
189 | | - int codePage = -1; |
190 | | - try { |
191 | | - Process process = Runtime.getRuntime().exec(new String[]{"chcp.com"}); |
192 | | - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), NATIVE_CHARSET))) { |
193 | | - Matcher matcher = Pattern.compile("(?<cp>[0-9]+)$") |
194 | | - .matcher(reader.readLine().trim()); |
| 200 | + if (kernel32 != null) |
| 201 | + codePage = kernel32.GetACP(); |
| 202 | + else { |
| 203 | + try { |
| 204 | + Process process = Runtime.getRuntime().exec(new String[]{"chcp.com"}); |
| 205 | + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), NATIVE_CHARSET))) { |
| 206 | + Matcher matcher = Pattern.compile("(?<cp>[0-9]+)$") |
| 207 | + .matcher(reader.readLine().trim()); |
195 | 208 |
|
196 | | - if (matcher.find()) { |
197 | | - codePage = Integer.parseInt(matcher.group("cp")); |
| 209 | + if (matcher.find()) { |
| 210 | + codePage = Integer.parseInt(matcher.group("cp")); |
| 211 | + } |
198 | 212 | } |
| 213 | + process.destroy(); |
| 214 | + } catch (Throwable ignored) { |
199 | 215 | } |
200 | | - process.destroy(); |
201 | | - } catch (Throwable ignored) { |
202 | 216 | } |
203 | 217 |
|
| 218 | + String osName = System.getProperty("os.name"); |
| 219 | + |
| 220 | + // Java 17 or earlier recognizes Windows 11 as Windows 10 |
| 221 | + if (osName.equals("Windows 10") && buildNumber >= 22000) |
| 222 | + osName = "Windows 11"; |
| 223 | + |
204 | 224 | SYSTEM_NAME = osName; |
205 | 225 | SYSTEM_VERSION = versionNumber; |
206 | 226 | SYSTEM_BUILD_NUMBER = buildNumber; |
@@ -443,4 +463,5 @@ public static double toGigaBytes(long bytes) { |
443 | 463 |
|
444 | 464 | public static final PhysicalMemoryStatus INVALID = new PhysicalMemoryStatus(0, -1); |
445 | 465 | } |
| 466 | + |
446 | 467 | } |
0 commit comments