diff options
author | Bishara AbuHattoum <bishara@daynix.com> | 2018-12-19 10:40:51 +0200 |
---|---|---|
committer | Michael Roth <mdroth@linux.vnet.ibm.com> | 2019-03-18 10:24:20 -0500 |
commit | bd586a91338a653082fae7886e0c2dd2f65ca099 (patch) | |
tree | b1e310e385da031a78039b453477ff1612ba0059 | |
parent | bb6c8d407e49d7b805ac52fe46abf4d8d5262046 (diff) | |
download | qemu-bd586a91338a653082fae7886e0c2dd2f65ca099.zip qemu-bd586a91338a653082fae7886e0c2dd2f65ca099.tar.gz qemu-bd586a91338a653082fae7886e0c2dd2f65ca099.tar.bz2 |
qga-win: Adding support for Windows Server 2019 get-osinfo command
Since Windows Server 2016, Microsoft stopped upgrading the major and minor
versions of their new Windows Server product, so, the current functionality
of checking major and minor version numbers to determine the Windows Server
version wont work as expected.
The implemented solution here is to use the build number in addition to the
major and minor version numbers of the product to determine the Windows
Server product version.
The final build number of Windows Server 2016 is 14939, and
the final build number of Windows Server 2019 is 17764, so any Windows
Server product that has the major version of 10 and minor version of 0
with a build number lower or equal to 14939 will resemble 2016 and if the
build number is lower or equal to 17763 will resemble 2019.
Reference:
https://techcommunity.microsoft.com/t5/Windows-Server-Insiders/Windows-Server-2019-version-info/m-p/293112/highlight/true#M859
Signed-off-by: Bishara AbuHattoum <bishara@daynix.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
-rw-r--r-- | qga/commands-win32.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 989b93e..fb48463 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -1941,12 +1941,24 @@ static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = { { 6, 1, "Microsoft Windows Server 2008 R2", "2008r2"}, { 6, 2, "Microsoft Windows Server 2012", "2012"}, { 6, 3, "Microsoft Windows Server 2012 R2", "2012r2"}, - {10, 0, "Microsoft Windows Server 2016", "2016"}, + { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0} } }; +typedef struct _ga_win_10_0_server_t { + int final_build; + char const *version; + char const *version_id; +} ga_win_10_0_server_t; + +static ga_win_10_0_server_t const WIN_10_0_SERVER_VERSION_MATRIX[3] = { + {14393, "Microsoft Windows Server 2016", "2016"}, + {17763, "Microsoft Windows Server 2019", "2019"}, + {0, 0} +}; + static void ga_get_win_version(RTL_OSVERSIONINFOEXW *info, Error **errp) { typedef NTSTATUS(WINAPI * rtl_get_version_t)( @@ -1971,10 +1983,23 @@ static char *ga_get_win_name(OSVERSIONINFOEXW const *os_version, bool id) { DWORD major = os_version->dwMajorVersion; DWORD minor = os_version->dwMinorVersion; + DWORD build = os_version->dwBuildNumber; 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; while (table->version != NULL) { - if (major == table->major && minor == table->minor) { + 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); + } + } + win_10_0_table++; + } + } else if (major == table->major && minor == table->minor) { if (id) { return g_strdup(table->version_id); } else { |