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

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