From patchwork Mon Mar 9 02:17:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Rozman X-Patchwork-Id: 1031 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director12.mail.ord1d.rsapps.net ([172.30.191.6]) by backend30.mail.ord1d.rsapps.net with LMTP id QGl1IltCZl7gNgAAIUCqbw for ; Mon, 09 Mar 2020 09:19:23 -0400 Received: from proxy15.mail.ord1d.rsapps.net ([172.30.191.6]) by director12.mail.ord1d.rsapps.net with LMTP id eMFJIltCZl7FUAAAIasKDg ; Mon, 09 Mar 2020 09:19:23 -0400 Received: from smtp23.gate.ord1d ([172.30.191.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy15.mail.ord1d.rsapps.net with LMTP id 2MUcIltCZl7GKQAAAY1PeQ ; Mon, 09 Mar 2020 09:19:23 -0400 X-Spam-Threshold: 95 X-Spam-Score: 0 X-Spam-Flag: NO X-Virus-Scanned: OK X-Orig-To: openvpnslackdevel@openvpn.net X-Originating-Ip: [216.105.38.7] Authentication-Results: smtp23.gate.ord1d.rsapps.net; iprev=pass policy.iprev="216.105.38.7"; spf=pass smtp.mailfrom="openvpn-devel-bounces@lists.sourceforge.net" smtp.helo="lists.sourceforge.net"; dkim=fail (signature verification failed) header.d=sourceforge.net; dkim=fail (signature verification failed) header.d=sf.net; dkim=fail (signature verification failed) header.d=rozman.si; dmarc=fail (p=none; dis=none) header.from=rozman.si X-Suspicious-Flag: YES X-Classification-ID: 975921b0-6208-11ea-acba-525400bfb165-1-1 Received: from [216.105.38.7] ([216.105.38.7:35112] helo=lists.sourceforge.net) by smtp23.gate.ord1d.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id F5/C7-17906-B52466E5; Mon, 09 Mar 2020 09:19:23 -0400 Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1jBIIh-0000CX-K7; Mon, 09 Mar 2020 13:18:31 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jBIIg-0000Ba-LZ for openvpn-devel@lists.sourceforge.net; Mon, 09 Mar 2020 13:18:30 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=iFcTPhAWhB6xydh1cRYaVxuL/IIPu9qufsRrWZXlCgY=; b=hryMkkxihar6y/uhRXusoilY3o L4Z2PjZoYOxnqCvfGJwfxbG/0OMGIQijAP6B827I6KbzfDTPuDMOW7lWQc1Nnu/tiF3XqHjkCYnmE Q5OcTVsTgQST5gVapc5WcjPv/gciIDG1C2EgownnOlXAcDf/scrmi6i8dimxLOJcn5IQ=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=iFcTPhAWhB6xydh1cRYaVxuL/IIPu9qufsRrWZXlCgY=; b=DxomrIYdnOvYMR9tLeml6UfhnU Rh5Xp4PZi1i4zzQ05me+TPb+7o7GEKZ2TEOqztgx4VVWmmi/gPqJ1MLgjTsEicByN+C6IgIp87qwR SGXGmq6zEinjmdJxIxm5d3UZnrmPWDrWkkHop2T7H6/4DP2iZ1GFM26hgrQjopCBEIl0=; Received: from pub5.amebis.si ([213.250.55.21]) by sfi-mx-4.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92.2) id 1jBIIc-006jro-QN for openvpn-devel@lists.sourceforge.net; Mon, 09 Mar 2020 13:18:30 +0000 Received: by pub5.amebis.si (Postfix, from userid 1000) id 85EA61002FCB; Mon, 9 Mar 2020 14:18:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rozman.si; s=default; t=1583759883; bh=iFcTPhAWhB6xydh1cRYaVxuL/IIPu9qufsRrWZXlCgY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mqy0RnxZDuzjuzj+zl5nMeBe0fu9Hu+GQm5BlJlKgRUsV/B4M77vvbB1PZ0gQod2S Rs08ER1/kTZ8GqVJcuY5avGniisH6vlbQ8LaO9rOKTpkz/Y5SbJSdARGs+Lilz07yQ v7NzkGKI8xJxXgOB0ptYup2PH22zyp9TgAJjdkGc= X-Spam-Checker-Version: SpamAssassin 3.4.3 (2019-12-06) on brana.amebis.doma X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.3 Received: from SR6.amebis.doma (unknown [IPv6:2a00:ee2:209:164:a5ae:e83c:b7b:725]) by pub5.amebis.si (Postfix) with ESMTP id B95D31002FCF; Mon, 9 Mar 2020 14:17:49 +0100 (CET) From: Simon Rozman To: openvpn-devel@lists.sourceforge.net Date: Mon, 9 Mar 2020 14:17:27 +0100 Message-Id: <20200309131728.380-11-simon@rozman.si> X-Mailer: git-send-email 2.24.1.windows.2 In-Reply-To: <20200309131728.380-1-simon@rozman.si> References: <20200309131728.380-1-simon@rozman.si> MIME-Version: 1.0 X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid 0.0 AWL AWL: Adjusted score from AWL reputation of From: address X-Headers-End: 1jBIIc-006jro-QN Subject: [Openvpn-devel] [PATCH 11/12] openvpnmsica: Merge FindTUNTAPAdapters into FindSystemInfo X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox 1. We don't need two custom actions to evaluate the system state, do we? 2. FindTUNTAPAdapters was actually broken. It enumerated all existing network adapters, rather than just the ones we are interested in: TAP-Windows6 and Wintun. 3. TUNTAPADAPTER and ACTIVETUNTAPADAPTERS were split into TAPWINDOWS6ADAPTERS, ACTIVETAPWINDOWS6ADAPTERS, WINTUNADAPTERS and ACTIVEWINTUNADAPTERS to allow finer control. Signed-off-by: Simon Rozman Acked-by: Lev Stipakov --- src/openvpnmsica/openvpnmsica.c | 235 ++++++++++++++++---------------- src/openvpnmsica/openvpnmsica.h | 26 ++-- 2 files changed, 125 insertions(+), 136 deletions(-) diff --git a/src/openvpnmsica/openvpnmsica.c b/src/openvpnmsica/openvpnmsica.c index ae9b007f..28cf16b5 100644 --- a/src/openvpnmsica/openvpnmsica.c +++ b/src/openvpnmsica/openvpnmsica.c @@ -248,49 +248,26 @@ cleanup_OpenSCManager: } -UINT __stdcall -FindSystemInfo(_In_ MSIHANDLE hInstall) -{ -#ifdef _MSC_VER -#pragma comment(linker, DLLEXP_EXPORT) -#endif - - debug_popup(TEXT(__FUNCTION__)); - - BOOL bIsCoInitialized = SUCCEEDED(CoInitialize(NULL)); - - OPENVPNMSICA_SAVE_MSI_SESSION(hInstall); - - set_openvpnserv_state(hInstall); - - if (bIsCoInitialized) - { - CoUninitialize(); - } - return ERROR_SUCCESS; -} - - -UINT __stdcall -FindTUNTAPAdapters(_In_ MSIHANDLE hInstall) +static UINT +find_adapters( + _In_ MSIHANDLE hInstall, + _In_z_ LPCTSTR szHardwareId, + _In_z_ LPCTSTR szAdaptersPropertyName, + _In_z_ LPCTSTR szActiveAdaptersPropertyName) { -#ifdef _MSC_VER -#pragma comment(linker, DLLEXP_EXPORT) -#endif - - debug_popup(TEXT(__FUNCTION__)); - UINT uiResult; - BOOL bIsCoInitialized = SUCCEEDED(CoInitialize(NULL)); - - OPENVPNMSICA_SAVE_MSI_SESSION(hInstall); - /* Get existing network adapters. */ + /* Get network adapters with given hardware ID. */ struct tap_adapter_node *pAdapterList = NULL; - uiResult = tap_list_adapters(NULL, NULL, &pAdapterList); + uiResult = tap_list_adapters(NULL, szHardwareId, &pAdapterList); if (uiResult != ERROR_SUCCESS) { - goto cleanup_CoInitialize; + return uiResult; + } + else if (pAdapterList == NULL) + { + /* No adapters - no fun. */ + return ERROR_SUCCESS; } /* Get IPv4/v6 info for all network adapters. Actually, we're interested in link status only: up/down? */ @@ -302,7 +279,7 @@ FindTUNTAPAdapters(_In_ MSIHANDLE hInstall) if (pAdapterAdresses == NULL) { msg(M_NONFATAL, "%s: malloc(%u) failed", __FUNCTION__, ulAdapterAdressesSize); - uiResult = ERROR_OUTOFMEMORY; goto cleanup_tap_list_adapters; + uiResult = ERROR_OUTOFMEMORY; goto cleanup_pAdapterList; } ULONG ulResult = GetAdaptersAddresses( @@ -322,117 +299,135 @@ FindTUNTAPAdapters(_In_ MSIHANDLE hInstall) { SetLastError(ulResult); /* MSDN does not mention GetAdaptersAddresses() to set GetLastError(). But we do have an error code. Set last error manually. */ msg(M_NONFATAL | M_ERRNO, "%s: GetAdaptersAddresses() failed", __FUNCTION__); - uiResult = ulResult; goto cleanup_tap_list_adapters; + uiResult = ulResult; goto cleanup_pAdapterList; } } - if (pAdapterList != NULL) + /* Count adapters. */ + size_t adapter_count = 0; + for (struct tap_adapter_node *pAdapter = pAdapterList; pAdapter; pAdapter = pAdapter->pNext) { - /* Count adapters. */ - size_t adapter_count = 0; - for (struct tap_adapter_node *pAdapter = pAdapterList; pAdapter; pAdapter = pAdapter->pNext) - { - adapter_count++; - } + adapter_count++; + } - /* Prepare semicolon delimited list of TAP adapter ID(s) and active TAP adapter ID(s). */ - LPTSTR - szAdapters = (LPTSTR)malloc(adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)), - szAdaptersTail = szAdapters; - if (szAdapters == NULL) - { - msg(M_FATAL, "%s: malloc(%u) failed", __FUNCTION__, adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)); - uiResult = ERROR_OUTOFMEMORY; goto cleanup_pAdapterAdresses; - } + /* Prepare semicolon delimited list of TAP adapter ID(s) and active TAP adapter ID(s). */ + LPTSTR + szAdapters = (LPTSTR)malloc(adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)), + szAdaptersTail = szAdapters; + if (szAdapters == NULL) + { + msg(M_FATAL, "%s: malloc(%u) failed", __FUNCTION__, adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)); + uiResult = ERROR_OUTOFMEMORY; goto cleanup_pAdapterAdresses; + } + + LPTSTR + szAdaptersActive = (LPTSTR)malloc(adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)), + szAdaptersActiveTail = szAdaptersActive; + if (szAdaptersActive == NULL) + { + msg(M_FATAL, "%s: malloc(%u) failed", __FUNCTION__, adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)); + uiResult = ERROR_OUTOFMEMORY; goto cleanup_szAdapters; + } - LPTSTR - szAdaptersActive = (LPTSTR)malloc(adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)), - szAdaptersActiveTail = szAdaptersActive; - if (szAdaptersActive == NULL) + for (struct tap_adapter_node *pAdapter = pAdapterList; pAdapter; pAdapter = pAdapter->pNext) + { + /* Convert adapter GUID to UTF-16 string. (LPOLESTR defaults to LPWSTR) */ + LPOLESTR szAdapterId = NULL; + StringFromIID((REFIID)&pAdapter->guid, &szAdapterId); + + /* Append to the list of TAP adapter ID(s). */ + if (szAdapters < szAdaptersTail) { - msg(M_FATAL, "%s: malloc(%u) failed", __FUNCTION__, adapter_count * (38 /*GUID*/ + 1 /*separator/terminator*/) * sizeof(TCHAR)); - uiResult = ERROR_OUTOFMEMORY; goto cleanup_szAdapters; + *(szAdaptersTail++) = TEXT(';'); } + memcpy(szAdaptersTail, szAdapterId, 38 * sizeof(TCHAR)); + szAdaptersTail += 38; - for (struct tap_adapter_node *pAdapter = pAdapterList; pAdapter; pAdapter = pAdapter->pNext) + /* If this adapter is active (connected), add it to the list of active TAP adapter ID(s). */ + for (PIP_ADAPTER_ADDRESSES p = pAdapterAdresses; p; p = p->Next) { - /* Convert adapter GUID to UTF-16 string. (LPOLESTR defaults to LPWSTR) */ - LPOLESTR szAdapterId = NULL; - StringFromIID((REFIID)&pAdapter->guid, &szAdapterId); - - /* Append to the list of TAP adapter ID(s). */ - if (szAdapters < szAdaptersTail) - { - *(szAdaptersTail++) = TEXT(';'); - } - memcpy(szAdaptersTail, szAdapterId, 38 * sizeof(TCHAR)); - szAdaptersTail += 38; - - /* If this adapter is active (connected), add it to the list of active TAP adapter ID(s). */ - for (PIP_ADAPTER_ADDRESSES p = pAdapterAdresses; p; p = p->Next) + OLECHAR szId[38 /*GUID*/ + 1 /*terminator*/]; + GUID guid; + if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, p->AdapterName, -1, szId, _countof(szId)) > 0 + && SUCCEEDED(IIDFromString(szId, &guid)) + && memcmp(&guid, &pAdapter->guid, sizeof(GUID)) == 0) { - OLECHAR szId[38 /*GUID*/ + 1 /*terminator*/]; - GUID guid; - if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, p->AdapterName, -1, szId, _countof(szId)) > 0 - && SUCCEEDED(IIDFromString(szId, &guid)) - && memcmp(&guid, &pAdapter->guid, sizeof(GUID)) == 0) + if (p->OperStatus == IfOperStatusUp) { - if (p->OperStatus == IfOperStatusUp) + /* This TAP adapter is active (connected). */ + if (szAdaptersActive < szAdaptersActiveTail) { - /* This TAP adapter is active (connected). */ - if (szAdaptersActive < szAdaptersActiveTail) - { - *(szAdaptersActiveTail++) = TEXT(';'); - } - memcpy(szAdaptersActiveTail, szAdapterId, 38 * sizeof(TCHAR)); - szAdaptersActiveTail += 38; + *(szAdaptersActiveTail++) = TEXT(';'); } - break; + memcpy(szAdaptersActiveTail, szAdapterId, 38 * sizeof(TCHAR)); + szAdaptersActiveTail += 38; } + break; } - CoTaskMemFree(szAdapterId); - } - szAdaptersTail [0] = 0; - szAdaptersActiveTail[0] = 0; - - /* Set Installer TUNTAPADAPTERS property. */ - uiResult = MsiSetProperty(hInstall, TEXT("TUNTAPADAPTERS"), szAdapters); - if (uiResult != ERROR_SUCCESS) - { - SetLastError(uiResult); /* MSDN does not mention MsiSetProperty() to set GetLastError(). But we do have an error code. Set last error manually. */ - msg(M_NONFATAL | M_ERRNO, "%s: MsiSetProperty(\"TUNTAPADAPTERS\") failed", __FUNCTION__); - goto cleanup_szAdaptersActive; - } - - /* Set Installer ACTIVETUNTAPADAPTERS property. */ - uiResult = MsiSetProperty(hInstall, TEXT("ACTIVETUNTAPADAPTERS"), szAdaptersActive); - if (uiResult != ERROR_SUCCESS) - { - SetLastError(uiResult); /* MSDN does not mention MsiSetProperty() to set GetLastError(). But we do have an error code. Set last error manually. */ - msg(M_NONFATAL | M_ERRNO, "%s: MsiSetProperty(\"ACTIVETUNTAPADAPTERS\") failed", __FUNCTION__); - goto cleanup_szAdaptersActive; } + CoTaskMemFree(szAdapterId); + } + szAdaptersTail [0] = 0; + szAdaptersActiveTail[0] = 0; -cleanup_szAdaptersActive: - free(szAdaptersActive); -cleanup_szAdapters: - free(szAdapters); + /* Set Installer properties. */ + uiResult = MsiSetProperty(hInstall, szAdaptersPropertyName, szAdapters); + if (uiResult != ERROR_SUCCESS) + { + SetLastError(uiResult); /* MSDN does not mention MsiSetProperty() to set GetLastError(). But we do have an error code. Set last error manually. */ + msg(M_NONFATAL | M_ERRNO, "%s: MsiSetProperty(\"%s\") failed", __FUNCTION__, szAdaptersPropertyName); + goto cleanup_szAdaptersActive; } - else + uiResult = MsiSetProperty(hInstall, szActiveAdaptersPropertyName, szAdaptersActive); + if (uiResult != ERROR_SUCCESS) { - uiResult = ERROR_SUCCESS; + SetLastError(uiResult); /* MSDN does not mention MsiSetProperty() to set GetLastError(). But we do have an error code. Set last error manually. */ + msg(M_NONFATAL | M_ERRNO, "%s: MsiSetProperty(\"%s\") failed", __FUNCTION__, szActiveAdaptersPropertyName); + goto cleanup_szAdaptersActive; } +cleanup_szAdaptersActive: + free(szAdaptersActive); +cleanup_szAdapters: + free(szAdapters); cleanup_pAdapterAdresses: free(pAdapterAdresses); -cleanup_tap_list_adapters: +cleanup_pAdapterList: tap_free_adapter_list(pAdapterList); -cleanup_CoInitialize: + return uiResult; +} + + +UINT __stdcall +FindSystemInfo(_In_ MSIHANDLE hInstall) +{ +#ifdef _MSC_VER +#pragma comment(linker, DLLEXP_EXPORT) +#endif + + debug_popup(TEXT(__FUNCTION__)); + + BOOL bIsCoInitialized = SUCCEEDED(CoInitialize(NULL)); + + OPENVPNMSICA_SAVE_MSI_SESSION(hInstall); + + set_openvpnserv_state(hInstall); + find_adapters( + hInstall, + TEXT("root\\") TEXT(TAP_WIN_COMPONENT_ID), + TEXT("TAPWINDOWS6ADAPTERS"), + TEXT("ACTIVETAPWINDOWS6ADAPTERS")); + find_adapters( + hInstall, + TEXT("Wintun"), + TEXT("WINTUNADAPTERS"), + TEXT("ACTIVEWINTUNADAPTERS")); + if (bIsCoInitialized) { CoUninitialize(); } - return uiResult; + return ERROR_SUCCESS; } diff --git a/src/openvpnmsica/openvpnmsica.h b/src/openvpnmsica/openvpnmsica.h index 5d140930..221d03ca 100644 --- a/src/openvpnmsica/openvpnmsica.h +++ b/src/openvpnmsica/openvpnmsica.h @@ -76,23 +76,17 @@ extern "C" { /** * Determines Windows information: - * - Sets `DriverCertification` MSI property to "", "attsgn" or "whql" - * according to the driver certification required by the running version of - * Windows. * - * @param hInstall Handle to the installation provided to the DLL custom action + * - Sets `OPENVPNSERVICE` MSI property to PID of OpenVPN Service if running, or its EXE path if + * configured for auto-start. * - * @return ERROR_SUCCESS on success; An error code otherwise - * See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa368072.aspx - */ -DLLEXP_DECL UINT __stdcall -FindSystemInfo(_In_ MSIHANDLE hInstall); - - -/** - * Find existing TAP adapters and set TUNTAPADAPTERS and ACTIVETUNTAPADAPTERS properties with - * semicolon delimited list of all installed TAP adapter GUIDs and active adapter GUIDs - * respectively. + * - Finds existing TAP-Windows6 adapters and set TAPWINDOWS6ADAPTERS and + * ACTIVETAPWINDOWS6ADAPTERS properties with semicolon delimited list of all installed adapter + * GUIDs and active adapter GUIDs respectively. + * + * - Finds existing Wintun adapters and set WINTUNADAPTERS and ACTIVEWINTUNADAPTERS properties + * with semicolon delimited list of all installed adapter GUIDs and active adapter GUIDs + * respectively. * * @param hInstall Handle to the installation provided to the DLL custom action * @@ -100,7 +94,7 @@ FindSystemInfo(_In_ MSIHANDLE hInstall); * See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa368072.aspx */ DLLEXP_DECL UINT __stdcall -FindTUNTAPAdapters(_In_ MSIHANDLE hInstall); +FindSystemInfo(_In_ MSIHANDLE hInstall); /**