Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/node/windowsVersion.ts
13389 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as os from 'os';
7
import { isWindows } from '../common/platform.js';
8
9
let versionInfo: { release: string; buildNumber: number } | undefined;
10
11
/**
12
* Initializes the Windows version cache by reading from the registry.
13
*
14
* On Windows 8.1+, the `os.release()` function may return incorrect version numbers
15
* due to the deprecated GetVersionEx API returning compatibility-shimmed values
16
* when the application doesn't have a proper manifest. Reading from the registry
17
* gives us the real version.
18
*
19
* See: https://github.com/microsoft/vscode/issues/197444
20
*/
21
export async function initWindowsVersionInfo() {
22
if (versionInfo) {
23
return;
24
}
25
26
if (!isWindows) {
27
versionInfo = { release: os.release(), buildNumber: 0 };
28
return;
29
}
30
31
let buildNumber: number | undefined;
32
let release: string | undefined;
33
try {
34
const Registry = await import('@vscode/windows-registry');
35
const versionKey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion';
36
37
const build = Registry.GetStringRegKey('HKEY_LOCAL_MACHINE', versionKey, 'CurrentBuild');
38
if (build !== undefined) {
39
buildNumber = parseInt(build, 10);
40
if (isNaN(buildNumber)) {
41
buildNumber = undefined;
42
}
43
}
44
45
const major = Registry.GetDWORDRegKey('HKEY_LOCAL_MACHINE', versionKey, 'CurrentMajorVersionNumber');
46
const minor = Registry.GetDWORDRegKey('HKEY_LOCAL_MACHINE', versionKey, 'CurrentMinorVersionNumber');
47
if (major !== undefined && minor !== undefined && build !== undefined) {
48
release = `${major}.${minor}.${build}`;
49
}
50
} catch {
51
// ignore
52
} finally {
53
versionInfo = {
54
release: release || os.release(),
55
buildNumber: buildNumber || getWindowsBuildNumberFromOsRelease()
56
};
57
}
58
}
59
60
/**
61
* Gets Windows version information from the registry.
62
* @returns The Windows version in Major.Minor.Build format (e.g., "10.0.19041")
63
*/
64
export async function getWindowsRelease(): Promise<string> {
65
if (!versionInfo) {
66
await initWindowsVersionInfo();
67
}
68
return versionInfo!.release;
69
}
70
71
/**
72
* Gets the Windows build number from the registry.
73
* @returns The Windows build number (e.g., 19041 for Windows 10 2004)
74
*/
75
export async function getWindowsBuildNumberAsync(): Promise<number> {
76
if (!versionInfo) {
77
await initWindowsVersionInfo();
78
}
79
return versionInfo!.buildNumber;
80
}
81
82
/**
83
* Synchronous version of getWindowsBuildNumberAsync().
84
* @returns The Windows build number (e.g., 19041 for Windows 10 2004)
85
*/
86
export function getWindowsBuildNumberSync(): number {
87
if (versionInfo) {
88
return versionInfo.buildNumber;
89
} else {
90
return isWindows ? getWindowsBuildNumberFromOsRelease() : 0;
91
}
92
}
93
94
/**
95
* Gets the cached Windows release string synchronously.
96
* Falls back to os.release() if the cache hasn't been initialized yet.
97
* @returns The Windows version in Major.Minor.Build format (e.g., "10.0.19041")
98
*/
99
export function getWindowsReleaseSync(): string {
100
return versionInfo?.release ?? os.release();
101
}
102
103
/**
104
* Parses the Windows build number from os.release().
105
* This is used as a fallback when registry reading is not available.
106
*/
107
function getWindowsBuildNumberFromOsRelease(): number {
108
const osVersion = (/(\d+)\.(\d+)\.(\d+)/g).exec(os.release());
109
if (osVersion && osVersion.length === 4) {
110
return parseInt(osVersion[3], 10);
111
}
112
return 0;
113
}
114
115