Attention is currently required from: flichtenheld, plaisthos.

Hello plaisthos, flichtenheld,

I'd like you to do a code review.
Please visit

    http://gerrit.openvpn.net/c/openvpn/+/944?usp=email

to review the following change.


Change subject: win: refactor get_windows_version()
......................................................................

win: refactor get_windows_version()

It's 2025, and almost all clients now run on Windows 10 or newer.
Instead of displaying:

  "Windows version 10.0 (Windows 10 or greater)"

we now show the exact build number, e.g.:

  "Windows version: 10.0.22631"

Remove "pre-Win7" checks in a few places.

For IV_PLAT_VER, we now provide only the version number without
binary architecture info. Previously:

  IV_PLAT_VER=10.0,_amd64_executable

Now:

  IV_PLAT_VER=10.0.22631

Change-Id: I39d660ebeec76280e4d4357192b74bf2c0980615
Signed-off-by: Lev Stipakov <l...@openvpn.net>
---
M src/openvpn/tun.c
M src/openvpn/win32.c
M src/openvpn/win32.h
3 files changed, 49 insertions(+), 93 deletions(-)



  git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/44/944/1

diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
index 4f7de6c..5186afa 100644
--- a/src/openvpn/tun.c
+++ b/src/openvpn/tun.c
@@ -5428,11 +5428,8 @@
                     NETSH_PATH_SUFFIX, adapter_index,
                     print_in6_addr(addr_list[i], 0, &gc));

-        /* disable slow address validation on Windows 7 and higher */
-        if (win32_version_info() >= WIN_7)
-        {
-            argv_printf_cat(&argv, "%s", "validate=no");
-        }
+        /* disable slow address validation */
+        argv_printf_cat(&argv, "%s", "validate=no");

         /* Treat errors while adding as non-fatal as we do not check for 
duplicates */
         netsh_command(&argv, 1, (i==0) ? M_FATAL : M_NONFATAL);
@@ -5498,9 +5495,8 @@
                             adapter_index,
                             print_in_addr_t(addr_list[i], 0, &gc));

-                /* disable slow address validation on Windows 7 and higher */
-                /* only for DNS */
-                if (is_dns && win32_version_info() >= WIN_7)
+                /* disable slow address validation for DNS */
+                if (is_dns)
                 {
                     argv_printf_cat(&argv, "%s", "validate=no");
                 }
diff --git a/src/openvpn/win32.c b/src/openvpn/win32.c
index edac71e..8d4c4a3 100644
--- a/src/openvpn/win32.c
+++ b/src/openvpn/win32.c
@@ -1283,42 +1283,6 @@
     return true;
 }

-int
-win32_version_info(void)
-{
-    if (!IsWindowsXPOrGreater())
-    {
-        msg(M_FATAL, "Error: Windows version must be XP or greater.");
-    }
-
-    if (!IsWindowsVistaOrGreater())
-    {
-        return WIN_XP;
-    }
-
-    if (!IsWindows7OrGreater())
-    {
-        return WIN_VISTA;
-    }
-
-    if (!IsWindows8OrGreater())
-    {
-        return WIN_7;
-    }
-
-    if (!IsWindows8Point1OrGreater())
-    {
-        return WIN_8;
-    }
-
-    if (!IsWindows10OrGreater())
-    {
-        return WIN_8_1;
-    }
-
-    return WIN_10;
-}
-
 typedef enum {
     ARCH_X86,
     ARCH_AMD64,
@@ -1420,57 +1384,50 @@
     }
 }

+typedef LONG (WINAPI *RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
+
 const char *
-win32_version_string(struct gc_arena *gc, bool add_name)
+win32_version_string(struct gc_arena *gc, bool add_exec_info)
 {
-    int version = win32_version_info();
-    struct buffer out = alloc_buf_gc(256, gc);
-
-    switch (version)
+    HMODULE hMod = GetModuleHandleW(L"ntdll.dll");
+    if (!hMod)
     {
-        case WIN_XP:
-            buf_printf(&out, "5.1%s", add_name ? " (Windows XP)" : "");
-            break;
-
-        case WIN_VISTA:
-            buf_printf(&out, "6.0%s", add_name ? " (Windows Vista)" : "");
-            break;
-
-        case WIN_7:
-            buf_printf(&out, "6.1%s", add_name ? " (Windows 7)" : "");
-            break;
-
-        case WIN_8:
-            buf_printf(&out, "6.2%s", add_name ? " (Windows 8)" : "");
-            break;
-
-        case WIN_8_1:
-            buf_printf(&out, "6.3%s", add_name ? " (Windows 8.1)" : "");
-            break;
-
-        case WIN_10:
-            buf_printf(&out, "10.0%s", add_name ? " (Windows 10 or greater)" : 
"");
-            break;
-
-        default:
-            msg(M_NONFATAL, "Unknown Windows version: %d", version);
-            buf_printf(&out, "0.0%s", add_name ? " (unknown)" : "");
-            break;
+        return "N/A";
     }

-    buf_printf(&out, ", ");
-
-    arch_t process_arch, host_arch;
-    win32_get_arch(&process_arch, &host_arch);
-    win32_print_arch(process_arch, &out);
-
-    buf_printf(&out, " executable");
-
-    if (host_arch != ARCH_NATIVE)
+    RtlGetVersionPtr fn = (RtlGetVersionPtr)GetProcAddress(hMod, 
"RtlGetVersion");
+    if (!fn)
     {
-        buf_printf(&out, " running on ");
-        win32_print_arch(host_arch, &out);
-        buf_printf(&out, " host");
+        return "N/A";
+    }
+
+    RTL_OSVERSIONINFOW rovi = { 0 };
+    rovi.dwOSVersionInfoSize = sizeof(rovi);
+    if (fn(&rovi) != 0)
+    {
+        return "N/A";
+    }
+
+    struct buffer out = alloc_buf_gc(256, gc);
+
+    buf_printf(&out, "%lu.%lu.%lu", rovi.dwMajorVersion, rovi.dwMinorVersion, 
rovi.dwBuildNumber);
+
+    if (add_exec_info)
+    {
+        buf_printf(&out, ", ");
+
+        arch_t process_arch, host_arch;
+        win32_get_arch(&process_arch, &host_arch);
+        win32_print_arch(process_arch, &out);
+
+        buf_printf(&out, " executable");
+
+        if (host_arch != ARCH_NATIVE)
+        {
+            buf_printf(&out, " running on ");
+            win32_print_arch(host_arch, &out);
+            buf_printf(&out, " host");
+        }
     }

     return (const char *)out.data;
diff --git a/src/openvpn/win32.h b/src/openvpn/win32.h
index 081beeb..d663586 100644
--- a/src/openvpn/win32.h
+++ b/src/openvpn/win32.h
@@ -301,11 +301,14 @@

 int win32_version_info(void);

-/*
- * String representation of Windows version number and name, see
- * 
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx
+/**
+ * @brief Get Windows version string, optionally with architecture info.
+ *
+ * @param gc gc arena to allocate string.
+ * @param add_exec_info Whether to include architecture details.
+ * @return Version string, or "N/A" on failure.
  */
-const char *win32_version_string(struct gc_arena *gc, bool add_name);
+const char *win32_version_string(struct gc_arena *gc, bool add_exec_info);

 /*
  * Send the |size| bytes in buffer |data| to the interactive service |pipe|

--
To view, visit http://gerrit.openvpn.net/c/openvpn/+/944?usp=email
To unsubscribe, or for help writing mail filters, visit 
http://gerrit.openvpn.net/settings

Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: I39d660ebeec76280e4d4357192b74bf2c0980615
Gerrit-Change-Number: 944
Gerrit-PatchSet: 1
Gerrit-Owner: stipa <lstipa...@gmail.com>
Gerrit-Reviewer: flichtenheld <fr...@lichtenheld.com>
Gerrit-Reviewer: plaisthos <arne-open...@rfc2549.org>
Gerrit-CC: openvpn-devel <openvpn-devel@lists.sourceforge.net>
Gerrit-Attention: plaisthos <arne-open...@rfc2549.org>
Gerrit-Attention: flichtenheld <fr...@lichtenheld.com>
Gerrit-MessageType: newchange
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to