diff options
| author | Odd Stranne <odd@mullvad.net> | 2019-04-18 14:46:39 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2019-04-18 14:46:39 +0200 |
| commit | 7fdc2f84a24ee25ab74dbfdfa000600034c78525 (patch) | |
| tree | 12340daab96f74ac64cd733b3c3252d623d19f72 /windows | |
| parent | a0fe634b812e84a69a481c07da01381ab7f02622 (diff) | |
| parent | f11d1e7c18647707d42056d7dec91c6b730f9e26 (diff) | |
| download | mullvadvpn-7fdc2f84a24ee25ab74dbfdfa000600034c78525.tar.xz mullvadvpn-7fdc2f84a24ee25ab74dbfdfa000600034c78525.zip | |
Merge branch 'tap-renaming'
Diffstat (limited to 'windows')
| -rw-r--r-- | windows/nsis-plugins/src/driverlogic/context.cpp | 37 | ||||
| m--------- | windows/windows-libraries | 0 | ||||
| -rw-r--r-- | windows/winnet/extras.sln (renamed from windows/winroute/extras.sln) | 2 | ||||
| -rw-r--r-- | windows/winnet/src/extras/loader/loader.cpp | 27 | ||||
| -rw-r--r-- | windows/winnet/src/extras/loader/loader.vcxproj (renamed from windows/winroute/src/extras/loader/loader.vcxproj) | 12 | ||||
| -rw-r--r-- | windows/winnet/src/extras/loader/loader.vcxproj.filters (renamed from windows/winroute/src/extras/loader/loader.vcxproj.filters) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/extras/loader/stdafx.cpp (renamed from windows/winroute/src/extras/loader/stdafx.cpp) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/extras/loader/stdafx.h (renamed from windows/winroute/src/extras/loader/stdafx.h) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/extras/loader/targetver.h (renamed from windows/winroute/src/extras/loader/targetver.h) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/InterfacePair.cpp (renamed from windows/winroute/src/winroute/InterfacePair.cpp) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/InterfacePair.h (renamed from windows/winroute/src/winroute/InterfacePair.h) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/NetworkInterfaces.cpp (renamed from windows/winroute/src/winroute/NetworkInterfaces.cpp) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/NetworkInterfaces.h (renamed from windows/winroute/src/winroute/NetworkInterfaces.h) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/dllmain.cpp (renamed from windows/winroute/src/winroute/dllmain.cpp) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/interfaceutils.cpp | 127 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/interfaceutils.h | 42 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/stdafx.cpp (renamed from windows/winroute/src/winroute/stdafx.cpp) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/stdafx.h (renamed from windows/winroute/src/winroute/stdafx.h) | 3 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/targetver.h (renamed from windows/winroute/src/winroute/targetver.h) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.cpp | 136 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.def | 6 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.h | 73 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.rc (renamed from windows/winroute/src/winroute/winroute.rc) | 0 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.vcxproj (renamed from windows/winroute/src/winroute/winroute.vcxproj) | 28 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.vcxproj.filters (renamed from windows/winroute/src/winroute/winroute.vcxproj.filters) | 10 | ||||
| -rw-r--r-- | windows/winnet/winnet.sln (renamed from windows/winroute/winroute.sln) | 2 | ||||
| -rw-r--r-- | windows/winroute/src/extras/loader/loader.cpp | 10 | ||||
| -rw-r--r-- | windows/winroute/src/winroute/winroute.cpp | 82 | ||||
| -rw-r--r-- | windows/winroute/src/winroute/winroute.def | 4 | ||||
| -rw-r--r-- | windows/winroute/src/winroute/winroute.h | 50 |
30 files changed, 480 insertions, 171 deletions
diff --git a/windows/nsis-plugins/src/driverlogic/context.cpp b/windows/nsis-plugins/src/driverlogic/context.cpp index d0ad9dfb67..13cb781863 100644 --- a/windows/nsis-plugins/src/driverlogic/context.cpp +++ b/windows/nsis-plugins/src/driverlogic/context.cpp @@ -10,6 +10,8 @@ #include <vector> #include <list> #include <stdexcept> +#include <sstream> +#include <algorithm> namespace { @@ -100,9 +102,40 @@ Context::BaselineStatus Context::establishBaseline() return BaselineStatus::NO_TAP_ADAPTERS_PRESENT; } - for (const auto &adapter : tapAdapters) + // + // Look for TAP adapter with alias "Mullvad". + // + + auto findByAlias = [](const std::set<NetworkAdapter> &adapters, const std::wstring &alias) { - if (0 == _wcsicmp(adapter.alias.c_str(), L"mullvad")) + const auto it = std::find_if(adapters.begin(), adapters.end(), [&alias](const NetworkAdapter &candidate) + { + return 0 == _wcsicmp(candidate.alias.c_str(), alias.c_str()); + }); + + return it != adapters.end(); + }; + + static const wchar_t baseAlias[] = L"Mullvad"; + + if (findByAlias(tapAdapters, baseAlias)) + { + return BaselineStatus::MULLVAD_ADAPTER_PRESENT; + } + + // + // Look for TAP adapter with alias "Mullvad-1", "Mullvad-2", etc. + // + + for (auto i = 0; i < 10; ++i) + { + std::wstringstream ss; + + ss << baseAlias << L"-" << i; + + const auto alias = ss.str(); + + if (findByAlias(tapAdapters, alias)) { return BaselineStatus::MULLVAD_ADAPTER_PRESENT; } diff --git a/windows/windows-libraries b/windows/windows-libraries -Subproject d609c6dea5e97f615f18827d4086949b3e857f8 +Subproject d3ba2ac4292f7e5b37e060da1619ed5e07ef63a diff --git a/windows/winroute/extras.sln b/windows/winnet/extras.sln index 28d1d51341..a6fec71c96 100644 --- a/windows/winroute/extras.sln +++ b/windows/winnet/extras.sln @@ -8,7 +8,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader", "src\extras\loader {89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4} = {89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winroute", "src\winroute\winroute.vcxproj", "{89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winnet", "src\winnet\winnet.vcxproj", "{89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4}" ProjectSection(ProjectDependencies) = postProject {B52E2D10-A94A-4605-914A-2DCEF6A757EF} = {B52E2D10-A94A-4605-914A-2DCEF6A757EF} EndProjectSection diff --git a/windows/winnet/src/extras/loader/loader.cpp b/windows/winnet/src/extras/loader/loader.cpp new file mode 100644 index 0000000000..43ec54978c --- /dev/null +++ b/windows/winnet/src/extras/loader/loader.cpp @@ -0,0 +1,27 @@ +#include "stdafx.h" +#include "../../winnet/winnet.h" +#include <iostream> + +int main() +{ + wchar_t *alias = nullptr; + + const auto status = WinNet_GetTapInterfaceAlias(&alias, nullptr, nullptr); + + switch (status) + { + case WINNET_GTIA_STATUS::FAILURE: + { + std::wcout << L"Could not determine alias" << std::endl; + break; + } + case WINNET_GTIA_STATUS::SUCCESS: + { + std::wcout << L"Interface alias: " << alias << std::endl; + WinNet_ReleaseString(alias); + } + }; + + return 0; +} + diff --git a/windows/winroute/src/extras/loader/loader.vcxproj b/windows/winnet/src/extras/loader/loader.vcxproj index bf010c1fd0..325f813778 100644 --- a/windows/winroute/src/extras/loader/loader.vcxproj +++ b/windows/winnet/src/extras/loader/loader.vcxproj @@ -106,12 +106,13 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Console</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>winroute.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>winnet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> @@ -122,12 +123,13 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Console</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>winroute.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>winnet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -140,6 +142,7 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Console</SubSystem> @@ -147,7 +150,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>winroute.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>winnet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -160,6 +163,7 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> </ClCompile> <Link> <SubSystem>Console</SubSystem> @@ -167,7 +171,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>winroute.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>winnet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/windows/winroute/src/extras/loader/loader.vcxproj.filters b/windows/winnet/src/extras/loader/loader.vcxproj.filters index cd0f4643c7..cd0f4643c7 100644 --- a/windows/winroute/src/extras/loader/loader.vcxproj.filters +++ b/windows/winnet/src/extras/loader/loader.vcxproj.filters diff --git a/windows/winroute/src/extras/loader/stdafx.cpp b/windows/winnet/src/extras/loader/stdafx.cpp index 8d6fa45555..8d6fa45555 100644 --- a/windows/winroute/src/extras/loader/stdafx.cpp +++ b/windows/winnet/src/extras/loader/stdafx.cpp diff --git a/windows/winroute/src/extras/loader/stdafx.h b/windows/winnet/src/extras/loader/stdafx.h index b005a839de..b005a839de 100644 --- a/windows/winroute/src/extras/loader/stdafx.h +++ b/windows/winnet/src/extras/loader/stdafx.h diff --git a/windows/winroute/src/extras/loader/targetver.h b/windows/winnet/src/extras/loader/targetver.h index 87c0086de7..87c0086de7 100644 --- a/windows/winroute/src/extras/loader/targetver.h +++ b/windows/winnet/src/extras/loader/targetver.h diff --git a/windows/winroute/src/winroute/InterfacePair.cpp b/windows/winnet/src/winnet/InterfacePair.cpp index 3c8af26079..3c8af26079 100644 --- a/windows/winroute/src/winroute/InterfacePair.cpp +++ b/windows/winnet/src/winnet/InterfacePair.cpp diff --git a/windows/winroute/src/winroute/InterfacePair.h b/windows/winnet/src/winnet/InterfacePair.h index 9582bac3cd..9582bac3cd 100644 --- a/windows/winroute/src/winroute/InterfacePair.h +++ b/windows/winnet/src/winnet/InterfacePair.h diff --git a/windows/winroute/src/winroute/NetworkInterfaces.cpp b/windows/winnet/src/winnet/NetworkInterfaces.cpp index 2aa352de27..2aa352de27 100644 --- a/windows/winroute/src/winroute/NetworkInterfaces.cpp +++ b/windows/winnet/src/winnet/NetworkInterfaces.cpp diff --git a/windows/winroute/src/winroute/NetworkInterfaces.h b/windows/winnet/src/winnet/NetworkInterfaces.h index bf1d53dddf..bf1d53dddf 100644 --- a/windows/winroute/src/winroute/NetworkInterfaces.h +++ b/windows/winnet/src/winnet/NetworkInterfaces.h diff --git a/windows/winroute/src/winroute/dllmain.cpp b/windows/winnet/src/winnet/dllmain.cpp index e66eb0495d..e66eb0495d 100644 --- a/windows/winroute/src/winroute/dllmain.cpp +++ b/windows/winnet/src/winnet/dllmain.cpp diff --git a/windows/winnet/src/winnet/interfaceutils.cpp b/windows/winnet/src/winnet/interfaceutils.cpp new file mode 100644 index 0000000000..9a406fa6ff --- /dev/null +++ b/windows/winnet/src/winnet/interfaceutils.cpp @@ -0,0 +1,127 @@ +#include "stdafx.h" +#include "interfaceutils.h" +#include "libcommon/error.h" +#include "libcommon/string.h" +#include "libcommon/synchronization.h" +#include <vector> +#include <cstdint> +#include <algorithm> +#include <winsock2.h> +#include <iphlpapi.h> +#include <windows.h> + +//static +std::wstring InterfaceUtils::m_alias; + +//static +std::mutex InterfaceUtils::m_mutex; + +//static +std::set<InterfaceUtils::NetworkAdapter> InterfaceUtils::GetAllAdapters() +{ + ULONG bufferSize = 0; + + const ULONG flags = GAA_FLAG_SKIP_UNICAST | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; + + auto status = GetAdaptersAddresses(AF_INET, flags, nullptr, nullptr, &bufferSize); + + THROW_UNLESS(ERROR_BUFFER_OVERFLOW, status, "Probe for adapter listing buffer size"); + + // Memory is cheap, this avoids a looping construct. + bufferSize *= 2; + + std::vector<uint8_t> buffer(bufferSize); + + status = GetAdaptersAddresses(AF_INET, flags, nullptr, + reinterpret_cast<PIP_ADAPTER_ADDRESSES>(&buffer[0]), &bufferSize); + + THROW_UNLESS(ERROR_SUCCESS, status, "Retrieve adapter listing"); + + std::set<NetworkAdapter> adapters; + + for (auto it = (PIP_ADAPTER_ADDRESSES)&buffer[0]; nullptr != it; it = it->Next) + { + adapters.emplace(NetworkAdapter(common::string::ToWide(it->AdapterName), + it->Description, it->FriendlyName)); + } + + return adapters; +} + +//static +std::set<InterfaceUtils::NetworkAdapter> +InterfaceUtils::GetTapAdapters(const std::set<InterfaceUtils::NetworkAdapter> &adapters) +{ + std::set<NetworkAdapter> tapAdapters; + + for (const auto &adapter : adapters) + { + static const wchar_t name[] = L"TAP-Windows Adapter V9"; + + // + // Compare partial name, because once you start having more TAP adapters + // they're named "TAP-Windows Adapter V9 #2" and so on. + // + + if (0 == adapter.name.compare(0, _countof(name) - 1, name)) + { + tapAdapters.insert(adapter); + } + } + + return tapAdapters; +} + +//static +std::wstring InterfaceUtils::GetTapInterfaceAlias() +{ + common::sync::ScopeLock<> cacheLock(m_mutex); + + if (false == m_alias.empty()) + { + return m_alias; + } + + // + // Look for TAP adapter with alias "Mullvad". + // + + auto adapters = GetTapAdapters(GetAllAdapters()); + + auto findByAlias = [](const std::set<NetworkAdapter> &adapters, const std::wstring &alias) + { + const auto it = std::find_if(adapters.begin(), adapters.end(), [&alias](const NetworkAdapter &candidate) + { + return 0 == _wcsicmp(candidate.alias.c_str(), alias.c_str()); + }); + + return it != adapters.end(); + }; + + static const wchar_t baseAlias[] = L"Mullvad"; + + if (findByAlias(adapters, baseAlias)) + { + return m_alias = baseAlias; + } + + // + // Look for TAP adapter with alias "Mullvad-1", "Mullvad-2", etc. + // + + for (auto i = 0; i < 10; ++i) + { + std::wstringstream ss; + + ss << baseAlias << L"-" << i; + + const auto alias = ss.str(); + + if (findByAlias(adapters, alias)) + { + return m_alias = alias; + } + } + + throw std::runtime_error("Unable to find TAP adapter"); +} diff --git a/windows/winnet/src/winnet/interfaceutils.h b/windows/winnet/src/winnet/interfaceutils.h new file mode 100644 index 0000000000..308bfa505b --- /dev/null +++ b/windows/winnet/src/winnet/interfaceutils.h @@ -0,0 +1,42 @@ +#pragma once + +#include <string> +#include <set> +#include <mutex> + +class InterfaceUtils +{ + InterfaceUtils() = delete; + + static std::wstring m_alias; + static std::mutex m_mutex; + +public: + + struct NetworkAdapter + { + std::wstring guid; + std::wstring name; + std::wstring alias; + + NetworkAdapter(std::wstring _guid, std::wstring _name, std::wstring _alias) + : guid(_guid) + , name(_name) + , alias(_alias) + { + } + + bool operator<(const NetworkAdapter &rhs) const + { + return _wcsicmp(guid.c_str(), rhs.guid.c_str()) < 0; + } + }; + + static std::set<NetworkAdapter> GetAllAdapters(); + static std::set<NetworkAdapter> GetTapAdapters(const std::set<NetworkAdapter> &adapters); + + // + // Determines alias of primary TAP adapter. + // + static std::wstring GetTapInterfaceAlias(); +}; diff --git a/windows/winroute/src/winroute/stdafx.cpp b/windows/winnet/src/winnet/stdafx.cpp index b29c52afc9..b29c52afc9 100644 --- a/windows/winroute/src/winroute/stdafx.cpp +++ b/windows/winnet/src/winnet/stdafx.cpp diff --git a/windows/winroute/src/winroute/stdafx.h b/windows/winnet/src/winnet/stdafx.h index 677e68a9fa..254cb49b0d 100644 --- a/windows/winroute/src/winroute/stdafx.h +++ b/windows/winnet/src/winnet/stdafx.h @@ -5,6 +5,9 @@ #pragma once
+// wcscpy
+#define _CRT_SECURE_NO_WARNINGS 1
+
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
diff --git a/windows/winroute/src/winroute/targetver.h b/windows/winnet/src/winnet/targetver.h index b8b7263c9e..b8b7263c9e 100644 --- a/windows/winroute/src/winroute/targetver.h +++ b/windows/winnet/src/winnet/targetver.h diff --git a/windows/winnet/src/winnet/winnet.cpp b/windows/winnet/src/winnet/winnet.cpp new file mode 100644 index 0000000000..ba14c737da --- /dev/null +++ b/windows/winnet/src/winnet/winnet.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h"
+#include "winnet.h"
+#include "NetworkInterfaces.h"
+#include "interfaceutils.h"
+#include "libcommon/error.h"
+#include <cstdint>
+#include <stdexcept>
+
+extern "C"
+WINNET_LINKAGE
+WINNET_ETM_STATUS
+WINNET_API
+WinNet_EnsureTopMetric(
+ const wchar_t *deviceAlias,
+ WinNetErrorSink errorSink,
+ void* errorSinkContext
+)
+{
+ try
+ {
+ NetworkInterfaces interfaces;
+ bool metrics_set = interfaces.SetTopMetricForInterfacesByAlias(deviceAlias);
+ return metrics_set ? WINNET_ETM_STATUS::METRIC_SET : WINNET_ETM_STATUS::METRIC_NO_CHANGE;
+ }
+ catch (std::exception &err)
+ {
+ if (nullptr != errorSink)
+ {
+ errorSink(err.what(), errorSinkContext);
+ }
+
+ return WINNET_ETM_STATUS::FAILURE;
+ }
+ catch (...)
+ {
+ return WINNET_ETM_STATUS::FAILURE;
+ }
+};
+
+extern "C"
+WINNET_LINKAGE
+WINNET_GTII_STATUS
+WINNET_API
+WinNet_GetTapInterfaceIpv6Status(
+ WinNetErrorSink errorSink,
+ void* errorSinkContext
+)
+{
+ try
+ {
+ MIB_IPINTERFACE_ROW interface = { 0 };
+
+ interface.InterfaceLuid = NetworkInterfaces::GetInterfaceLuid(InterfaceUtils::GetTapInterfaceAlias());
+ interface.Family = AF_INET6;
+
+ const auto status = GetIpInterfaceEntry(&interface);
+
+ if (NO_ERROR == status)
+ {
+ return WINNET_GTII_STATUS::ENABLED;
+ }
+
+ if (ERROR_NOT_FOUND == status)
+ {
+ return WINNET_GTII_STATUS::DISABLED;
+ }
+
+ common::error::Throw("Resolve TAP IPv6 interface", status);
+ }
+ catch (std::exception &err)
+ {
+ if (nullptr != errorSink)
+ {
+ errorSink(err.what(), errorSinkContext);
+ }
+
+ return WINNET_GTII_STATUS::FAILURE;
+ }
+ catch (...)
+ {
+ return WINNET_GTII_STATUS::FAILURE;
+ }
+}
+
+extern "C"
+WINNET_LINKAGE
+WINNET_GTIA_STATUS
+WINNET_API
+WinNet_GetTapInterfaceAlias(
+ wchar_t **alias,
+ WinNetErrorSink errorSink,
+ void* errorSinkContext
+)
+{
+ try
+ {
+ const auto currentAlias = InterfaceUtils::GetTapInterfaceAlias();
+
+ auto stringBuffer = new wchar_t[currentAlias.size() + 1];
+ wcscpy(stringBuffer, currentAlias.c_str());
+
+ *alias = stringBuffer;
+
+ return WINNET_GTIA_STATUS::SUCCESS;
+ }
+ catch (std::exception &err)
+ {
+ if (nullptr != errorSink)
+ {
+ errorSink(err.what(), errorSinkContext);
+ }
+
+ return WINNET_GTIA_STATUS::FAILURE;
+ }
+ catch (...)
+ {
+ return WINNET_GTIA_STATUS::FAILURE;
+ }
+}
+
+extern "C"
+WINNET_LINKAGE
+void
+WINNET_API
+WinNet_ReleaseString(
+ wchar_t *str
+)
+{
+ try
+ {
+ delete[] str;
+ }
+ catch (...)
+ {
+ }
+}
diff --git a/windows/winnet/src/winnet/winnet.def b/windows/winnet/src/winnet/winnet.def new file mode 100644 index 0000000000..267a797538 --- /dev/null +++ b/windows/winnet/src/winnet/winnet.def @@ -0,0 +1,6 @@ +LIBRARY winnet +EXPORTS + WinNet_EnsureTopMetric + WinNet_GetTapInterfaceIpv6Status + WinNet_GetTapInterfaceAlias + WinNet_ReleaseString diff --git a/windows/winnet/src/winnet/winnet.h b/windows/winnet/src/winnet/winnet.h new file mode 100644 index 0000000000..b5771f5b5a --- /dev/null +++ b/windows/winnet/src/winnet/winnet.h @@ -0,0 +1,73 @@ +#pragma once +#include <cstdint> + +#ifdef WINNET_EXPORTS +#define WINNET_LINKAGE __declspec(dllexport) +#else +#define WINNET_LINKAGE __declspec(dllimport) +#endif + +#define WINNET_API __stdcall + +typedef void (WINNET_API *WinNetErrorSink)(const char *errorMessage, void *context); + +enum class WINNET_ETM_STATUS : uint32_t +{ + METRIC_NO_CHANGE = 0, + METRIC_SET = 1, + FAILURE = 2, +}; + +extern "C" +WINNET_LINKAGE +WINNET_ETM_STATUS +WINNET_API +WinNet_EnsureTopMetric( + const wchar_t *deviceAlias, + WinNetErrorSink errorSink, + void* errorSinkContext +); + +enum class WINNET_GTII_STATUS : uint32_t +{ + ENABLED = 0, + DISABLED = 1, + FAILURE = 2, +}; + +extern "C" +WINNET_LINKAGE +WINNET_GTII_STATUS +WINNET_API +WinNet_GetTapInterfaceIpv6Status( + WinNetErrorSink errorSink, + void* errorSinkContext +); + +enum class WINNET_GTIA_STATUS : uint32_t +{ + SUCCESS = 0, + FAILURE = 1, +}; + +extern "C" +WINNET_LINKAGE +WINNET_GTIA_STATUS +WINNET_API +WinNet_GetTapInterfaceAlias( + wchar_t **alias, + WinNetErrorSink errorSink, + void* errorSinkContext +); + +// +// This is a companion function to the above function. +// Generically named in case we need other functions here that return strings. +// +extern "C" +WINNET_LINKAGE +void +WINNET_API +WinNet_ReleaseString( + wchar_t *str +); diff --git a/windows/winroute/src/winroute/winroute.rc b/windows/winnet/src/winnet/winnet.rc index 2da7924287..2da7924287 100644 --- a/windows/winroute/src/winroute/winroute.rc +++ b/windows/winnet/src/winnet/winnet.rc diff --git a/windows/winroute/src/winroute/winroute.vcxproj b/windows/winnet/src/winnet/winnet.vcxproj index 09efb76938..e43b928d6c 100644 --- a/windows/winroute/src/winroute/winroute.vcxproj +++ b/windows/winnet/src/winnet/winnet.vcxproj @@ -21,28 +21,30 @@ <ItemGroup> <ClCompile Include="dllmain.cpp" /> <ClCompile Include="InterfacePair.cpp" /> + <ClCompile Include="interfaceutils.cpp" /> <ClCompile Include="NetworkInterfaces.cpp" /> <ClCompile Include="stdafx.cpp" /> - <ClCompile Include="winroute.cpp" /> + <ClCompile Include="winnet.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="InterfacePair.h" /> + <ClInclude Include="interfaceutils.h" /> <ClInclude Include="NetworkInterfaces.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> - <ClInclude Include="winroute.h" /> + <ClInclude Include="winnet.h" /> </ItemGroup> <ItemGroup> - <None Include="winroute.def" /> + <None Include="winnet.def" /> </ItemGroup> <ItemGroup> - <ResourceCompile Include="winroute.rc" /> + <ResourceCompile Include="winnet.rc" /> </ItemGroup> <PropertyGroup Label="Globals"> <VCProjectVersion>15.0</VCProjectVersion> <ProjectGuid>{89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4}</ProjectGuid> <Keyword>Win32Proj</Keyword> - <RootNamespace>winroute</RootNamespace> + <RootNamespace>winnet</RootNamespace> <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> @@ -116,7 +118,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <SDLCheck>true</SDLCheck> - <PreprocessorDefinitions>WIN32;_DEBUG;WINROUTE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;_DEBUG;WINNET_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> @@ -125,7 +127,7 @@ <Link> <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> - <ModuleDefinitionFile>winroute.def</ModuleDefinitionFile> + <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> @@ -136,7 +138,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <SDLCheck>true</SDLCheck> - <PreprocessorDefinitions>_DEBUG;WINROUTE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_DEBUG;WINNET_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> @@ -147,7 +149,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <ModuleDefinitionFile>winroute.def</ModuleDefinitionFile> + <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -158,7 +160,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <SDLCheck>true</SDLCheck> - <PreprocessorDefinitions>WIN32;NDEBUG;WINROUTE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>WIN32;NDEBUG;WINNET_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> @@ -169,7 +171,7 @@ <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> - <ModuleDefinitionFile>winroute.def</ModuleDefinitionFile> + <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> @@ -182,7 +184,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <SDLCheck>true</SDLCheck> - <PreprocessorDefinitions>NDEBUG;WINROUTE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>NDEBUG;WINNET_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <ConformanceMode>true</ConformanceMode> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> @@ -193,7 +195,7 @@ <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> - <ModuleDefinitionFile>winroute.def</ModuleDefinitionFile> + <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> diff --git a/windows/winroute/src/winroute/winroute.vcxproj.filters b/windows/winnet/src/winnet/winnet.vcxproj.filters index 216502d069..2d320e7908 100644 --- a/windows/winroute/src/winroute/winroute.vcxproj.filters +++ b/windows/winnet/src/winnet/winnet.vcxproj.filters @@ -3,21 +3,23 @@ <ItemGroup> <ClCompile Include="dllmain.cpp" /> <ClCompile Include="stdafx.cpp" /> - <ClCompile Include="winroute.cpp" /> + <ClCompile Include="winnet.cpp" /> <ClCompile Include="NetworkInterfaces.cpp" /> <ClCompile Include="InterfacePair.cpp" /> + <ClCompile Include="interfaceutils.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> - <ClInclude Include="winroute.h" /> + <ClInclude Include="winnet.h" /> <ClInclude Include="NetworkInterfaces.h" /> <ClInclude Include="InterfacePair.h" /> + <ClInclude Include="interfaceutils.h" /> </ItemGroup> <ItemGroup> - <None Include="winroute.def" /> + <None Include="winnet.def" /> </ItemGroup> <ItemGroup> - <ResourceCompile Include="winroute.rc" /> + <ResourceCompile Include="winnet.rc" /> </ItemGroup> </Project>
\ No newline at end of file diff --git a/windows/winroute/winroute.sln b/windows/winnet/winnet.sln index 28b21fc2f1..8d95777b4b 100644 --- a/windows/winroute/winroute.sln +++ b/windows/winnet/winnet.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27130.2027 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winroute", "src\winroute\winroute.vcxproj", "{89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winnet", "src\winnet\winnet.vcxproj", "{89C5CDE8-04DB-4D9C-A8D8-7F786DAFB6D4}" ProjectSection(ProjectDependencies) = postProject {B52E2D10-A94A-4605-914A-2DCEF6A757EF} = {B52E2D10-A94A-4605-914A-2DCEF6A757EF} EndProjectSection diff --git a/windows/winroute/src/extras/loader/loader.cpp b/windows/winroute/src/extras/loader/loader.cpp deleted file mode 100644 index cb775538f9..0000000000 --- a/windows/winroute/src/extras/loader/loader.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "stdafx.h" -#include "../../winroute/winroute.h" - -int main() -{ - const auto status = GetTapInterfaceIpv6Status(nullptr, nullptr); - - return 0; -} - diff --git a/windows/winroute/src/winroute/winroute.cpp b/windows/winroute/src/winroute/winroute.cpp deleted file mode 100644 index b9f10e3786..0000000000 --- a/windows/winroute/src/winroute/winroute.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include "stdafx.h"
-#include "winroute.h"
-#include "NetworkInterfaces.h"
-#include "libcommon/error.h"
-#include <cstdint>
-#include <stdexcept>
-
-
-extern "C"
-WINROUTE_LINKAGE
-WINROUTE_STATUS
-WINROUTE_API
-WinRoute_EnsureTopMetric(
- const wchar_t *deviceAlias,
- WinRouteErrorSink errorSink,
- void* errorSinkContext
-) {
- try
- {
- NetworkInterfaces interfaces;
- bool metrics_set = interfaces.SetTopMetricForInterfacesByAlias(deviceAlias);
- return metrics_set ? WINROUTE_STATUS::METRIC_SET : WINROUTE_STATUS::METRIC_NO_CHANGE;
- }
- catch (std::exception &err)
- {
- if (nullptr != errorSink)
- {
- errorSink(err.what(), errorSinkContext);
- }
- return WINROUTE_STATUS::FAILURE;
-
- }
- catch (...)
- {
- return WINROUTE_STATUS::FAILURE;
- }
-};
-
-extern "C"
-WINROUTE_LINKAGE
-TAP_IPV6_STATUS
-WINROUTE_API
-GetTapInterfaceIpv6Status(
- WinRouteErrorSink errorSink,
- void* errorSinkContext
-)
-{
- try
- {
- MIB_IPINTERFACE_ROW interface = { 0 };
-
- interface.InterfaceLuid = NetworkInterfaces::GetInterfaceLuid(L"Mullvad");
- interface.Family = AF_INET6;
-
- const auto status = GetIpInterfaceEntry(&interface);
-
- if (NO_ERROR == status)
- {
- return TAP_IPV6_STATUS::ENABLED;
- }
-
- if (ERROR_NOT_FOUND == status)
- {
- return TAP_IPV6_STATUS::DISABLED;
- }
-
- common::error::Throw("Resolve TAP IPv6 interface", status);
- }
- catch (std::exception &err)
- {
- if (nullptr != errorSink)
- {
- errorSink(err.what(), errorSinkContext);
- }
-
- return TAP_IPV6_STATUS::FAILURE;
- }
- catch (...)
- {
- return TAP_IPV6_STATUS::FAILURE;
- }
-}
diff --git a/windows/winroute/src/winroute/winroute.def b/windows/winroute/src/winroute/winroute.def deleted file mode 100644 index 2ea9222482..0000000000 --- a/windows/winroute/src/winroute/winroute.def +++ /dev/null @@ -1,4 +0,0 @@ -LIBRARY winroute -EXPORTS - WinRoute_EnsureTopMetric - GetTapInterfaceIpv6Status diff --git a/windows/winroute/src/winroute/winroute.h b/windows/winroute/src/winroute/winroute.h deleted file mode 100644 index 6b500cee7e..0000000000 --- a/windows/winroute/src/winroute/winroute.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once -#include <cstdint> - -#ifdef WINROUTE_EXPORTS -#define WINROUTE_LINKAGE __declspec(dllexport) -#else -#define WINROUTE_LINKAGE __declspec(dllimport) -#endif - -#define WINROUTE_API __stdcall - -typedef void (WINROUTE_API *WinRouteErrorSink)(const char *errorMessage, void *context); - -enum class WINROUTE_STATUS : uint32_t -{ - METRIC_NO_CHANGE = 0, - METRIC_SET = 1, - FAILURE = 2, -}; - - -extern "C" -WINROUTE_LINKAGE -WINROUTE_STATUS -WINROUTE_API -WinRoute_EnsureTopMetric( - const wchar_t *deviceAlias, - WinRouteErrorSink errorSink, - void* errorSinkContext -); - -enum class TAP_IPV6_STATUS : uint32_t -{ - ENABLED = 0, - DISABLED = 1, - FAILURE = 2, -}; - -// -// This has nothing to do with routing. -// We should probably rename this module and use it to gather one-off network functions. -// -extern "C" -WINROUTE_LINKAGE -TAP_IPV6_STATUS -WINROUTE_API -GetTapInterfaceIpv6Status( - WinRouteErrorSink errorSink, - void* errorSinkContext -); |
