diff mbox series

[1/2] qga-win: Detect OS based on Windows 10 by first build number

Message ID 20210914121420.183499-1-konstantin@daynix.com (mailing list archive)
State New, archived
Headers show
Series [1/2] qga-win: Detect OS based on Windows 10 by first build number | expand

Commit Message

Konstantin Kostiuk Sept. 14, 2021, 12:14 p.m. UTC
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(-)

Comments

Konstantin Kostiuk Sept. 29, 2021, 11:40 a.m. UTC | #1
ping

On Tue, Sep 14, 2021 at 3:14 PM Kostiantyn Kostiuk <konstantin@daynix.com>
wrote:

> 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
> @@ -2162,7 +2162,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;
> @@ -2202,18 +2202,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
>
>
Konstantin Kostiuk Oct. 13, 2021, 7:05 p.m. UTC | #2
ping

On Wed, Sep 29, 2021 at 2:40 PM Konstantin Kostiuk <konstantin@daynix.com>
wrote:

> ping
>
> On Tue, Sep 14, 2021 at 3:14 PM Kostiantyn Kostiuk <konstantin@daynix.com>
> wrote:
>
>> 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
>> @@ -2162,7 +2162,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;
>> @@ -2202,18 +2202,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
>>
>>
Marc-André Lureau Oct. 14, 2021, 8:49 a.m. UTC | #3
On Tue, Sep 14, 2021 at 4:18 PM Kostiantyn Kostiuk <konstantin@daynix.com>
wrote:

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

---
>  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
> @@ -2162,7 +2162,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;
> @@ -2202,18 +2202,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
>
>
>
diff mbox series

Patch

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
@@ -2162,7 +2162,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;
@@ -2202,18 +2202,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);