On Wed, 19 Dec 2018 10:40:51 +0200 Bishara AbuHattoum <[email protected]> wrote:
> 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 <[email protected]> > --- > qga/commands-win32.c | 29 +++++++++++++++++++++++++++-- > 1 file changed, 27 insertions(+), 2 deletions(-) > > diff --git a/qga/commands-win32.c b/qga/commands-win32.c > index 62e1b51..3985b40 100644 > --- a/qga/commands-win32.c > +++ b/qga/commands-win32.c > @@ -2009,12 +2009,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)( > @@ -2039,10 +2051,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) { You should reverse the order of entries in you table for this to work, or break after first match. Otherwise you will always match the last entry. Tomas > + 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 { > -- > 1.8.3.1 > > -- Tomáš Golembiovský <[email protected]>
