Skip to content

Commit 783cadc

Browse files
authored
从注册表中读取 Windows 版本信息 (#4760)
1 parent cbb4b0c commit 783cadc

1 file changed

Lines changed: 39 additions & 7 deletions

File tree

HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import org.jackhuang.hmcl.util.KeyValuePairUtils;
2121
import org.jackhuang.hmcl.util.platform.windows.Kernel32;
22-
import org.jackhuang.hmcl.util.platform.windows.WinTypes;
22+
import org.jackhuang.hmcl.util.platform.windows.WinReg;
2323

2424
import java.io.BufferedReader;
2525
import java.io.IOException;
@@ -150,13 +150,35 @@ public String getJavaExecutable() {
150150
OSVersion.Windows windowsVersion = null;
151151

152152
Kernel32 kernel32 = Kernel32.INSTANCE;
153+
WinReg reg = WinReg.INSTANCE;
154+
153155
// Get Windows version number
154-
if (kernel32 != null) {
155-
WinTypes.OSVERSIONINFOEXW osVersionInfo = new WinTypes.OSVERSIONINFOEXW();
156-
if (kernel32.GetVersionExW(osVersionInfo)) {
157-
windowsVersion = new OSVersion.Windows(osVersionInfo.dwMajorVersion, osVersionInfo.dwMinorVersion, osVersionInfo.dwBuildNumber);
158-
} else
159-
System.err.println("Failed to obtain OS version number (" + kernel32.GetLastError() + ")");
156+
if (reg != null) {
157+
var baseVersion = OSVersion.Windows.parse(System.getProperty("os.version"));
158+
int majorVersion = baseVersion.major();
159+
int minorVersion = baseVersion.minor();
160+
int buildNumber = baseVersion.build();
161+
int revision = baseVersion.revision();
162+
163+
Object currentBuild = reg.queryValue(WinReg.HKEY.HKEY_LOCAL_MACHINE,
164+
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentBuild");
165+
if (currentBuild instanceof String currentBuildStr) {
166+
try {
167+
buildNumber = Integer.parseInt(currentBuildStr);
168+
} catch (NumberFormatException e) {
169+
System.err.println("Invalid Windows build number: " + currentBuildStr);
170+
}
171+
}
172+
173+
if (majorVersion >= 10) {
174+
Object ubr = reg.queryValue(WinReg.HKEY.HKEY_LOCAL_MACHINE,
175+
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "UBR");
176+
177+
if (ubr instanceof Integer ubrValue)
178+
revision = ubrValue;
179+
}
180+
181+
windowsVersion = new OSVersion.Windows(majorVersion, minorVersion, buildNumber, revision);
160182
}
161183

162184
if (windowsVersion == null) {
@@ -201,6 +223,16 @@ public String getJavaExecutable() {
201223
if (osName.equals("Windows 10") && windowsVersion.isAtLeast(OSVersion.WINDOWS_11))
202224
osName = "Windows 11";
203225

226+
if (windowsVersion.isAtLeast(OSVersion.WINDOWS_10) && reg != null) {
227+
Object displayVersion = reg.queryValue(WinReg.HKEY.HKEY_LOCAL_MACHINE,
228+
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "DisplayVersion");
229+
230+
if (displayVersion instanceof String displayVersionStr
231+
&& displayVersionStr.matches("\\d{2}H\\d")) {
232+
osName = osName + " " + displayVersionStr;
233+
}
234+
}
235+
204236
SYSTEM_NAME = osName;
205237
SYSTEM_VERSION = windowsVersion;
206238
SYSTEM_BUILD_NUMBER = windowsVersion.build();

0 commit comments

Comments
 (0)