[Openvpn-devel] dco-win: get driver version
Commit Message
From: Lev Stipakov <lev@openvpn.net>
Print dco-win driver version using the new ioctl.
Requires dco-win driver 1.0.0 or newer to work.
Change-Id: I1d0d909e7fca3f51b5c848f1a771a989ab040f17
Signed-off-by: Lev Stipakov <lev@openvpn.net>
Acked-by: Arne Schwabe <arne-openvpn@rfc2549.org>
---
This change was reviewed on Gerrit and approved by at least one
developer. I request to merge it to release/2.6.
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/367
This mail reflects revision 3 of this Change.
Acked-by according to Gerrit (reflected above):
Arne Schwabe <arne-openvpn@rfc2549.org>
Comments
This is a useful addition (as we discussed at the hackathon), for
future feature enhancements that require a minimum version of the
DCO-WIN driver ("new driver supports old+new openvpn.exe by means of
v1 and v2 IOCTLs, but new openvpn.exe has no compat layer for old
driver").
Uncrustify complains about ovpn_dco_win.h on commit, because the
exclusion list is not applied in our "commit hook" - but this is
known and accepted for this file ("import from other project").
I have compile-tested this on Ubuntu/MinGW and ran through GHA, and
also done a quick stare-at-code ("does it handle errors, like 'no driver'
or 'driver too old for this IOCTL'?") and this all looks good.
Your patch has been applied to the master and release/2.6 branch.
commit e8e5f8a4c4f8e01dc7317ac87a85d3204882d6bf (master)
commit c54e1b226e9d6709cdc2b243e6a961a6cd47c7c6 (release/2.6)
Author: Lev Stipakov
Date: Sun Oct 8 13:27:55 2023 +0200
dco-win: get driver version
Signed-off-by: Lev Stipakov <lev@openvpn.net>
Acked-by: Arne Schwabe <arne-openvpn@rfc2549.org>
Message-Id: <20231008112755.23568-1-frank@lichtenheld.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg27174.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
--
kind regards,
Gert Doering
@@ -386,7 +386,32 @@
const char *
dco_version_string(struct gc_arena *gc)
{
- return "v0";
+ OVPN_VERSION version;
+ ZeroMemory(&version, sizeof(OVPN_VERSION));
+
+ /* try to open device by symbolic name */
+ HANDLE h = CreateFile("\\\\.\\ovpn-dco", GENERIC_READ | GENERIC_WRITE,
+ 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, NULL);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ return "N/A";
+ }
+
+ DWORD bytes_returned = 0;
+ if (!DeviceIoControl(h, OVPN_IOCTL_GET_VERSION, NULL, 0,
+ &version, sizeof(version), &bytes_returned, NULL))
+ {
+ CloseHandle(h);
+ return "N/A";
+ }
+
+ CloseHandle(h);
+
+ struct buffer out = alloc_buf_gc(256, gc);
+ buf_printf(&out, "%ld.%ld.%ld", version.Major, version.Minor, version.Patch);
+
+ return BSTR(&out);
}
int
@@ -100,6 +100,12 @@
LONG MSS;
} OVPN_SET_PEER, * POVPN_SET_PEER;
+typedef struct _OVPN_VERSION {
+ LONG Major;
+ LONG Minor;
+ LONG Patch;
+} OVPN_VERSION, * POVPN_VERSION;
+
#define OVPN_IOCTL_NEW_PEER CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define OVPN_IOCTL_GET_STATS CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define OVPN_IOCTL_NEW_KEY CTL_CODE(FILE_DEVICE_UNKNOWN, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -107,3 +113,4 @@
#define OVPN_IOCTL_SET_PEER CTL_CODE(FILE_DEVICE_UNKNOWN, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define OVPN_IOCTL_START_VPN CTL_CODE(FILE_DEVICE_UNKNOWN, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define OVPN_IOCTL_DEL_PEER CTL_CODE(FILE_DEVICE_UNKNOWN, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define OVPN_IOCTL_GET_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)