93 lines
3.6 KiB
Diff
93 lines
3.6 KiB
Diff
|
From e84e2d323069501ea21e780b99c99f24370fa79f Mon Sep 17 00:00:00 2001
|
||
|
From: Kostiantyn Kostiuk <konstantin@daynix.com>
|
||
|
Date: Tue, 14 Sep 2021 10:58:13 +0000
|
||
|
Subject: [PATCH 2/2] qga-win: Detect Windows 11 by build number
|
||
|
|
||
|
Windows 10 and 11 have the same major and minor versions.
|
||
|
So, the only way to determine the correct version is to
|
||
|
use the build number.
|
||
|
|
||
|
After this commit, the guest agent will return the proper
|
||
|
"version" and "version-id" for Windows 11. The "pretty-name"
|
||
|
is read from the registry and will be incorrect until the
|
||
|
MS updates the registry. We only can create some workaround
|
||
|
and replace 10 to 11.
|
||
|
|
||
|
Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com>
|
||
|
---
|
||
|
qga/commands-win32.c | 23 ++++++++++++++---------
|
||
|
1 file changed, 14 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
|
||
|
index a8e9d40b31..f9ac1c31f5 100644
|
||
|
--- a/qga/commands-win32.c
|
||
|
+++ b/qga/commands-win32.c
|
||
|
@@ -2154,7 +2154,7 @@ typedef struct _ga_matrix_lookup_t {
|
||
|
char const *version_id;
|
||
|
} ga_matrix_lookup_t;
|
||
|
|
||
|
-static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
|
||
|
+static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][7] = {
|
||
|
{
|
||
|
/* Desktop editions */
|
||
|
{ 5, 0, "Microsoft Windows 2000", "2000"},
|
||
|
@@ -2163,7 +2163,6 @@ static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
|
||
|
{ 6, 1, "Microsoft Windows 7" "7"},
|
||
|
{ 6, 2, "Microsoft Windows 8", "8"},
|
||
|
{ 6, 3, "Microsoft Windows 8.1", "8.1"},
|
||
|
- {10, 0, "Microsoft Windows 10", "10"},
|
||
|
{ 0, 0, 0}
|
||
|
},{
|
||
|
/* Server editions */
|
||
|
@@ -2173,24 +2172,29 @@ static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
|
||
|
{ 6, 2, "Microsoft Windows Server 2012", "2012"},
|
||
|
{ 6, 3, "Microsoft Windows Server 2012 R2", "2012r2"},
|
||
|
{ 0, 0, 0},
|
||
|
- { 0, 0, 0},
|
||
|
{ 0, 0, 0}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
-typedef struct _ga_win_10_0_server_t {
|
||
|
+typedef struct _ga_win_10_0_t {
|
||
|
int first_build;
|
||
|
char const *version;
|
||
|
char const *version_id;
|
||
|
-} ga_win_10_0_server_t;
|
||
|
+} ga_win_10_0_t;
|
||
|
|
||
|
-static ga_win_10_0_server_t const WIN_10_0_SERVER_VERSION_MATRIX[4] = {
|
||
|
+static ga_win_10_0_t const WIN_10_0_SERVER_VERSION_MATRIX[4] = {
|
||
|
{14393, "Microsoft Windows Server 2016", "2016"},
|
||
|
{17763, "Microsoft Windows Server 2019", "2019"},
|
||
|
{20344, "Microsoft Windows Server 2022", "2022"},
|
||
|
{0, 0}
|
||
|
};
|
||
|
|
||
|
+static ga_win_10_0_t const WIN_10_0_CLIENT_VERSION_MATRIX[3] = {
|
||
|
+ {10240, "Microsoft Windows 10", "10"},
|
||
|
+ {22000, "Microsoft Windows 11", "11"},
|
||
|
+ {0, 0}
|
||
|
+};
|
||
|
+
|
||
|
static void ga_get_win_version(RTL_OSVERSIONINFOEXW *info, Error **errp)
|
||
|
{
|
||
|
typedef NTSTATUS(WINAPI *rtl_get_version_t)(
|
||
|
@@ -2218,10 +2222,11 @@ static char *ga_get_win_name(OSVERSIONINFOEXW const *os_version, bool id)
|
||
|
DWORD build = os_version->dwBuildNumber;
|
||
|
int tbl_idx = (os_version->wProductType != VER_NT_WORKSTATION);
|
||
|
ga_matrix_lookup_t const *table = WIN_VERSION_MATRIX[tbl_idx];
|
||
|
- ga_win_10_0_server_t const *win_10_0_table = WIN_10_0_SERVER_VERSION_MATRIX;
|
||
|
- ga_win_10_0_server_t const *win_10_0_version = NULL;
|
||
|
+ ga_win_10_0_t const *win_10_0_table = tbl_idx ?
|
||
|
+ WIN_10_0_SERVER_VERSION_MATRIX : WIN_10_0_CLIENT_VERSION_MATRIX;
|
||
|
+ ga_win_10_0_t const *win_10_0_version = NULL;
|
||
|
while (table->version != NULL) {
|
||
|
- if (major == 10 && minor == 0 && tbl_idx) {
|
||
|
+ if (major == 10 && minor == 0) {
|
||
|
while (win_10_0_table->version != NULL) {
|
||
|
if (build >= win_10_0_table->first_build) {
|
||
|
win_10_0_version = win_10_0_table;
|
||
|
--
|
||
|
2.25.1
|