summaryrefslogtreecommitdiffhomepage
path: root/windows
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2019-04-18 14:46:39 +0200
committerOdd Stranne <odd@mullvad.net>2019-04-18 14:46:39 +0200
commit7fdc2f84a24ee25ab74dbfdfa000600034c78525 (patch)
tree12340daab96f74ac64cd733b3c3252d623d19f72 /windows
parenta0fe634b812e84a69a481c07da01381ab7f02622 (diff)
parentf11d1e7c18647707d42056d7dec91c6b730f9e26 (diff)
downloadmullvadvpn-7fdc2f84a24ee25ab74dbfdfa000600034c78525.tar.xz
mullvadvpn-7fdc2f84a24ee25ab74dbfdfa000600034c78525.zip
Merge branch 'tap-renaming'
Diffstat (limited to 'windows')
-rw-r--r--windows/nsis-plugins/src/driverlogic/context.cpp37
m---------windows/windows-libraries0
-rw-r--r--windows/winnet/extras.sln (renamed from windows/winroute/extras.sln)2
-rw-r--r--windows/winnet/src/extras/loader/loader.cpp27
-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.cpp127
-rw-r--r--windows/winnet/src/winnet/interfaceutils.h42
-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.cpp136
-rw-r--r--windows/winnet/src/winnet/winnet.def6
-rw-r--r--windows/winnet/src/winnet/winnet.h73
-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.cpp10
-rw-r--r--windows/winroute/src/winroute/winroute.cpp82
-rw-r--r--windows/winroute/src/winroute/winroute.def4
-rw-r--r--windows/winroute/src/winroute/winroute.h50
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
-);