Blame SOURCES/0002-qga-win-Detect-Windows-11-by-build-number.patch

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