|
|
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
|