71 lines
2.8 KiB
Diff
71 lines
2.8 KiB
Diff
|
From 4eb0bed855a3f2001a3438a58933164046eefb88 Mon Sep 17 00:00:00 2001
|
||
|
From: Kostiantyn Kostiuk <konstantin@daynix.com>
|
||
|
Date: Tue, 14 Sep 2021 10:28:44 +0000
|
||
|
Subject: [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build
|
||
|
number
|
||
|
|
||
|
Windows Server 2016, 2019, 2022 are based on Windows 10 and
|
||
|
have the same major and minor versions. So, the only way to
|
||
|
detect the proper version is to use the build number.
|
||
|
|
||
|
Before this commit, the guest agent use the last build number
|
||
|
for each OS, but it causes problems when new OS releases.
|
||
|
There are few preview versions before release, and we
|
||
|
can't update this list.
|
||
|
|
||
|
After this commit, the guest agent will use the first build
|
||
|
number. For each new preview version or release version,
|
||
|
Microsoft increases the build number, so we can add the number
|
||
|
of the first preview build and this will work until the new
|
||
|
OS release.
|
||
|
|
||
|
Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com>
|
||
|
---
|
||
|
qga/commands-win32.c | 18 +++++++++++-------
|
||
|
1 file changed, 11 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
|
||
|
index 4e84afd83b..a8e9d40b31 100644
|
||
|
--- a/qga/commands-win32.c
|
||
|
+++ b/qga/commands-win32.c
|
||
|
@@ -2179,7 +2179,7 @@ static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
|
||
|
};
|
||
|
|
||
|
typedef struct _ga_win_10_0_server_t {
|
||
|
- int final_build;
|
||
|
+ int first_build;
|
||
|
char const *version;
|
||
|
char const *version_id;
|
||
|
} ga_win_10_0_server_t;
|
||
|
@@ -2219,18 +2219,22 @@ static char *ga_get_win_name(OSVERSIONINFOEXW const *os_version, bool id)
|
||
|
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;
|
||
|
while (table->version != NULL) {
|
||
|
if (major == 10 && minor == 0 && tbl_idx) {
|
||
|
while (win_10_0_table->version != NULL) {
|
||
|
- if (build <= win_10_0_table->final_build) {
|
||
|
- if (id) {
|
||
|
- return g_strdup(win_10_0_table->version_id);
|
||
|
- } else {
|
||
|
- return g_strdup(win_10_0_table->version);
|
||
|
- }
|
||
|
+ if (build >= win_10_0_table->first_build) {
|
||
|
+ win_10_0_version = win_10_0_table;
|
||
|
}
|
||
|
win_10_0_table++;
|
||
|
}
|
||
|
+ if (win_10_0_table) {
|
||
|
+ if (id) {
|
||
|
+ return g_strdup(win_10_0_version->version_id);
|
||
|
+ } else {
|
||
|
+ return g_strdup(win_10_0_version->version);
|
||
|
+ }
|
||
|
+ }
|
||
|
} else if (major == table->major && minor == table->minor) {
|
||
|
if (id) {
|
||
|
return g_strdup(table->version_id);
|
||
|
--
|
||
|
2.33.0
|