From: Lev Stipakov Date: Sat, 20 Aug 2022 08:47:19 +0000 (+0300) Subject: dco-win: use run-time dynamic linking for GetOverlappedResultEx X-Git-Tag: v2.6_beta1~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2f8053f9a97584b759d11d05a668d38653508617;p=thirdparty%2Fopenvpn.git dco-win: use run-time dynamic linking for GetOverlappedResultEx This function is available starting from Windows 8. Calling it "as is" causes startup error on Windows 7. dco-win driver available on Windows 10 20H1 and newer. On older systems installer will not show nor install the driver and dco-win code won't be reached. It is safe to load GetOverlappedResultEx in runtime and exit in case of error. Signed-off-by: Lev Stipakov Acked-by: Gert Doering Message-Id: <20220820084719.243-1-lstipakov@gmail.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25038.html Signed-off-by: Gert Doering --- diff --git a/src/openvpn/dco_win.c b/src/openvpn/dco_win.c index 28bcccd4e..a20308668 100644 --- a/src/openvpn/dco_win.c +++ b/src/openvpn/dco_win.c @@ -107,6 +107,17 @@ dco_start_tun(struct tuntap *tt) static int dco_connect_wait(HANDLE handle, OVERLAPPED *ov, int timeout, volatile int *signal_received) { + /* GetOverlappedResultEx is available starting from Windows 8 */ + typedef BOOL (*get_overlapped_result_ex_t) (HANDLE, LPOVERLAPPED, LPDWORD, DWORD, BOOL); + get_overlapped_result_ex_t get_overlapped_result_ex = + (get_overlapped_result_ex_t)GetProcAddress(GetModuleHandle("Kernel32.dll"), + "GetOverlappedResultEx"); + + if (get_overlapped_result_ex == NULL) + { + msg(M_ERR, "Failed to load GetOverlappedResult()"); + } + DWORD timeout_msec = timeout * 1000; const int poll_interval_ms = 50; @@ -115,7 +126,7 @@ dco_connect_wait(HANDLE handle, OVERLAPPED *ov, int timeout, volatile int *signa timeout_msec -= poll_interval_ms; DWORD transferred; - if (GetOverlappedResultEx(handle, ov, &transferred, poll_interval_ms, FALSE) != 0) + if (get_overlapped_result_ex(handle, ov, &transferred, poll_interval_ms, FALSE) != 0) { /* TCP connection established by dco */ return 0;