All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number
@ 2021-09-14 12:14 Kostiantyn Kostiuk
  2021-09-14 12:14 ` [PATCH 2/2] qga-win: Detect Windows 11 by " Kostiantyn Kostiuk
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Kostiantyn Kostiuk @ 2021-09-14 12:14 UTC (permalink / raw)
  To: qemu-devel
  Cc: Yan Vugenfirer, Michael Roth, Philippe Mathieu-Daudé,
	Daniel P . Berrangé,
	Marc-André Lureau

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



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] qga-win: Detect Windows 11 by build number
  2021-09-14 12:14 [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number Kostiantyn Kostiuk
@ 2021-09-14 12:14 ` Kostiantyn Kostiuk
  2021-09-29 11:40 ` [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first " Konstantin Kostiuk
  2021-10-14  8:49 ` Marc-André Lureau
  2 siblings, 0 replies; 5+ messages in thread
From: Kostiantyn Kostiuk @ 2021-09-14 12:14 UTC (permalink / raw)
  To: qemu-devel
  Cc: Yan Vugenfirer, Michael Roth, Philippe Mathieu-Daudé,
	Daniel P . Berrangé,
	Marc-André Lureau

Windows 10 and 11 have the same major and minor versions.
So, the only way to determine the correct version is to
use the build number.

After this commit, the guest agent will return the proper
"version" and "version-id" for Windows 11. The "pretty-name"
is read from the registry and will be incorrect until the
MS updates the registry. We only can create some workaround
and replace 10 to 11.

Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com>
---
 qga/commands-win32.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index a8e9d40b31..f9ac1c31f5 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -2137,7 +2137,7 @@ typedef struct _ga_matrix_lookup_t {
     char const *version_id;
 } ga_matrix_lookup_t;
 
-static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
+static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][7] = {
     {
         /* Desktop editions */
         { 5, 0, "Microsoft Windows 2000",   "2000"},
@@ -2146,7 +2146,6 @@ static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
         { 6, 1, "Microsoft Windows 7"       "7"},
         { 6, 2, "Microsoft Windows 8",      "8"},
         { 6, 3, "Microsoft Windows 8.1",    "8.1"},
-        {10, 0, "Microsoft Windows 10",     "10"},
         { 0, 0, 0}
     },{
         /* Server editions */
@@ -2156,24 +2155,29 @@ static ga_matrix_lookup_t const WIN_VERSION_MATRIX[2][8] = {
         { 6, 2, "Microsoft Windows Server 2012",        "2012"},
         { 6, 3, "Microsoft Windows Server 2012 R2",     "2012r2"},
         { 0, 0, 0},
-        { 0, 0, 0},
         { 0, 0, 0}
     }
 };
 
-typedef struct _ga_win_10_0_server_t {
+typedef struct _ga_win_10_0_t {
     int first_build;
     char const *version;
     char const *version_id;
-} ga_win_10_0_server_t;
+} ga_win_10_0_t;
 
-static ga_win_10_0_server_t const WIN_10_0_SERVER_VERSION_MATRIX[4] = {
+static ga_win_10_0_t const WIN_10_0_SERVER_VERSION_MATRIX[4] = {
     {14393, "Microsoft Windows Server 2016",    "2016"},
     {17763, "Microsoft Windows Server 2019",    "2019"},
     {20344, "Microsoft Windows Server 2022",    "2022"},
     {0, 0}
 };
 
+static ga_win_10_0_t const WIN_10_0_CLIENT_VERSION_MATRIX[3] = {
+    {10240, "Microsoft Windows 10",    "10"},
+    {22000, "Microsoft Windows 11",    "11"},
+    {0, 0}
+};
+
 static void ga_get_win_version(RTL_OSVERSIONINFOEXW *info, Error **errp)
 {
     typedef NTSTATUS(WINAPI *rtl_get_version_t)(
@@ -2201,10 +2205,11 @@ static char *ga_get_win_name(OSVERSIONINFOEXW const *os_version, bool id)
     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;
-    ga_win_10_0_server_t const *win_10_0_version = NULL;
+    ga_win_10_0_t const *win_10_0_table = tbl_idx ?
+        WIN_10_0_SERVER_VERSION_MATRIX : WIN_10_0_CLIENT_VERSION_MATRIX;
+    ga_win_10_0_t const *win_10_0_version = NULL;
     while (table->version != NULL) {
-        if (major == 10 && minor == 0 && tbl_idx) {
+        if (major == 10 && minor == 0) {
             while (win_10_0_table->version != NULL) {
                 if (build >= win_10_0_table->first_build) {
                     win_10_0_version = win_10_0_table;
-- 
2.33.0



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number
  2021-09-14 12:14 [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number Kostiantyn Kostiuk
  2021-09-14 12:14 ` [PATCH 2/2] qga-win: Detect Windows 11 by " Kostiantyn Kostiuk
@ 2021-09-29 11:40 ` Konstantin Kostiuk
  2021-10-13 19:05   ` Konstantin Kostiuk
  2021-10-14  8:49 ` Marc-André Lureau
  2 siblings, 1 reply; 5+ messages in thread
From: Konstantin Kostiuk @ 2021-09-29 11:40 UTC (permalink / raw)
  To: Developers
  Cc: Yan Vugenfirer, Michael Roth, Philippe Mathieu-Daudé,
	Daniel P . Berrangé,
	Marc-André Lureau

[-- Attachment #1: Type: text/plain, Size: 2807 bytes --]

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

[-- Attachment #2: Type: text/html, Size: 3644 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number
  2021-09-29 11:40 ` [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first " Konstantin Kostiuk
@ 2021-10-13 19:05   ` Konstantin Kostiuk
  0 siblings, 0 replies; 5+ messages in thread
From: Konstantin Kostiuk @ 2021-10-13 19:05 UTC (permalink / raw)
  To: Developers
  Cc: Yan Vugenfirer, Michael Roth, Philippe Mathieu-Daudé,
	Daniel P . Berrangé,
	Marc-André Lureau

[-- Attachment #1: Type: text/plain, Size: 2973 bytes --]

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

[-- Attachment #2: Type: text/html, Size: 4034 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number
  2021-09-14 12:14 [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number Kostiantyn Kostiuk
  2021-09-14 12:14 ` [PATCH 2/2] qga-win: Detect Windows 11 by " Kostiantyn Kostiuk
  2021-09-29 11:40 ` [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first " Konstantin Kostiuk
@ 2021-10-14  8:49 ` Marc-André Lureau
  2 siblings, 0 replies; 5+ messages in thread
From: Marc-André Lureau @ 2021-10-14  8:49 UTC (permalink / raw)
  To: Kostiantyn Kostiuk
  Cc: Yan Vugenfirer, Michael Roth, Daniel P . Berrangé,
	Philippe Mathieu-Daudé,
	QEMU

[-- Attachment #1: Type: text/plain, Size: 2971 bytes --]

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

-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 4053 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-10-14  8:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-14 12:14 [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first build number Kostiantyn Kostiuk
2021-09-14 12:14 ` [PATCH 2/2] qga-win: Detect Windows 11 by " Kostiantyn Kostiuk
2021-09-29 11:40 ` [PATCH 1/2] qga-win: Detect OS based on Windows 10 by first " Konstantin Kostiuk
2021-10-13 19:05   ` Konstantin Kostiuk
2021-10-14  8:49 ` Marc-André Lureau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.