summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostiantyn Kostiuk2021-09-14 12:28:44 +0200
committerKostiantyn Kostiuk2022-01-10 14:05:04 +0100
commit92857cd73848a488506fbe937e0a978c42d52e2c (patch)
tree8b20f691b1f55f6482a7f4a015d1f7394c0f77cc
parentgqa-win: get_pci_info: Replace 'while' with 2 calls of the function (diff)
downloadqemu-92857cd73848a488506fbe937e0a978c42d52e2c.tar.gz
qemu-92857cd73848a488506fbe937e0a978c42d52e2c.tar.xz
qemu-92857cd73848a488506fbe937e0a978c42d52e2c.zip
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> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Kostiantyn Kostiuk <kkostiuk@redhat.com>
-rw-r--r--qga/commands-win32.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 892082504f..3f60419419 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -2195,7 +2195,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;
@@ -2235,18 +2235,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);