summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/driverlogic.cpp
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-09-28 19:56:58 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-11-24 18:50:03 +0100
commit82e12793f17d88744870c41d9df52c8be667479e (patch)
tree16e93e0b127126c2061e7895456ca136591a4ec9 /windows/driverlogic/src/driverlogic.cpp
parente6ee7e1f991f4a8811f4e08e4f726a124764d64e (diff)
downloadmullvadvpn-82e12793f17d88744870c41d9df52c8be667479e.tar.xz
mullvadvpn-82e12793f17d88744870c41d9df52c8be667479e.zip
Generalize driverlogic
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
-rw-r--r--windows/driverlogic/src/driverlogic.cpp96
1 files changed, 56 insertions, 40 deletions
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp
index ece931b208..4b9c24b1e7 100644
--- a/windows/driverlogic/src/driverlogic.cpp
+++ b/windows/driverlogic/src/driverlogic.cpp
@@ -537,7 +537,9 @@ void throwUpdateException(DWORD lastError, const char *operation)
THROW_SETUPAPI_ERROR(lastError, operation);
}
-void CreateNetDevice(const std::wstring &hardwareId, bool installDeviceDriver)
+void RenameAdapter(const std::wstring &guid, const std::wstring &baseName);
+
+void CreateNetDevice(const std::wstring &hardwareId, const std::optional<std::wstring> alias, bool installDeviceDriver)
{
GUID classGuid = GUID_DEVCLASS_NET;
@@ -576,7 +578,7 @@ void CreateNetDevice(const std::wstring &hardwareId, bool installDeviceDriver)
&devInfoData,
SPDRP_HARDWAREID,
reinterpret_cast<const BYTE *>(hardwareId.c_str()),
- sizeof(wchar_t) * hardwareId.size()
+ static_cast<DWORD>(sizeof(wchar_t) * hardwareId.size())
);
if (FALSE == status)
@@ -621,6 +623,14 @@ void CreateNetDevice(const std::wstring &hardwareId, bool installDeviceDriver)
<< rebootRequired;
Log(ss.str());
}
+
+ if (alias.has_value())
+ {
+ RenameAdapter(
+ GetNetCfgInstanceId(deviceInfoSet, devInfoData),
+ alias.value()
+ );
+ }
}
void UpdateTapDriver(const std::wstring &infPath)
@@ -671,13 +681,13 @@ ATTEMPT_UPDATE:
// NOTE: Enumerating adapters first and picking the next free name is not sufficient,
// because the broken TAP may not be included.
//
-void RenameAdapter(const NetworkAdapter &adapter, const std::wstring &baseName)
+void RenameAdapter(const std::wstring &guid, const std::wstring &baseName)
{
common::network::Nci nci;
try
{
- nci.setConnectionName(common::Guid::FromString(adapter.guid), baseName.c_str());
+ nci.setConnectionName(common::Guid::FromString(guid), baseName.c_str());
return;
}
catch (...)
@@ -691,7 +701,7 @@ void RenameAdapter(const NetworkAdapter &adapter, const std::wstring &baseName)
try
{
- nci.setConnectionName(common::Guid::FromString(adapter.guid), ss.str().c_str());
+ nci.setConnectionName(common::Guid::FromString(guid), ss.str().c_str());
return;
}
catch (...)
@@ -702,7 +712,7 @@ void RenameAdapter(const NetworkAdapter &adapter, const std::wstring &baseName)
THROW_ERROR("Unable to rename network adapter");
}
-std::optional<NetworkAdapter> FindMullvadAdapter(const std::set<NetworkAdapter> &tapAdapters)
+std::optional<NetworkAdapter> FindAdapterByAlias(const std::set<NetworkAdapter> &tapAdapters, const std::wstring &baseName)
{
if (tapAdapters.empty())
{
@@ -723,7 +733,7 @@ std::optional<NetworkAdapter> FindMullvadAdapter(const std::set<NetworkAdapter>
return it;
};
- const auto firstMullvadAdapter = findByAlias(tapAdapters, TAP_BASE_ALIAS);
+ const auto firstMullvadAdapter = findByAlias(tapAdapters, baseName);
if (tapAdapters.end() != firstMullvadAdapter)
{
@@ -738,7 +748,7 @@ std::optional<NetworkAdapter> FindMullvadAdapter(const std::set<NetworkAdapter>
{
std::wstringstream ss;
- ss << TAP_BASE_ALIAS << L"-" << i;
+ ss << baseName << L"-" << i;
const auto alias = ss.str();
@@ -771,12 +781,18 @@ NetworkAdapter FindNetAdapter(const std::wstring &hardwareId)
return *added.begin();
}
-void RemoveTapDriver(const std::wstring &tapHardwareId)
+bool RemoveNetDevice(const std::wstring &tapHardwareId, const std::wstring &guid)
{
- ForEachNetworkDevice(tapHardwareId, [](HDEVINFO devInfo, const SP_DEVINFO_DATA &devInfoData) {
+ bool deletedAdapter = false;
+
+ ForEachNetworkDevice(tapHardwareId, [&](HDEVINFO devInfo, const SP_DEVINFO_DATA &devInfoData) {
try
{
- DeleteDevice(devInfo, devInfoData);
+ if (0 == GetNetCfgInstanceId(devInfo, devInfoData).compare(guid))
+ {
+ deletedAdapter = DeleteDevice(devInfo, devInfoData);
+ return false;
+ }
}
catch (const std::exception & e)
{
@@ -785,40 +801,22 @@ void RemoveTapDriver(const std::wstring &tapHardwareId)
//
std::wstringstream ss;
- ss << L"Skipping TAP adapter due to exception caught while iterating: "
+ ss << L"Skipping virtual adapter due to exception caught while iterating: "
<< common::string::ToWide(e.what());
LogError(ss.str());
}
return true;
});
+
+ return deletedAdapter;
}
-void DeleteVanillaMullvadAdapter()
+void RemoveTapDriver(const std::wstring &tapHardwareId)
{
- auto tapAdapters = GetNetworkAdapters(DEPRECATED_TAP_HARDWARE_ID);
- std::optional<NetworkAdapter> mullvadAdapter = FindMullvadAdapter(tapAdapters);
-
- if (!mullvadAdapter.has_value())
- {
- return;
- }
-
- const auto mullvadGuid = mullvadAdapter.value().guid;
- bool deletedAdapter = false;
-
- //
- // Enumerate over all network devices with the hardware ID DEPRECATED_TAP_HARDWARE_ID,
- // and delete any adapter whose GUID matches that of the "Mullvad" adapter.
- //
-
- ForEachNetworkDevice(DEPRECATED_TAP_HARDWARE_ID, [&](HDEVINFO devInfo, const SP_DEVINFO_DATA &devInfoData) {
+ ForEachNetworkDevice(tapHardwareId, [](HDEVINFO devInfo, const SP_DEVINFO_DATA &devInfoData) {
try
{
- if (0 == GetNetCfgInstanceId(devInfo, devInfoData).compare(mullvadGuid))
- {
- deletedAdapter = DeleteDevice(devInfo, devInfoData);
- return false;
- }
+ DeleteDevice(devInfo, devInfoData);
}
catch (const std::exception & e)
{
@@ -833,10 +831,28 @@ void DeleteVanillaMullvadAdapter()
}
return true;
});
+}
+
+void RemoveNetAdapterByAlias(const std::wstring &hardwareId, const std::wstring &baseName)
+{
+ auto tapAdapters = GetNetworkAdapters(hardwareId);
+ std::optional<NetworkAdapter> adapter = FindAdapterByAlias(tapAdapters, baseName);
+
+ if (!adapter.has_value())
+ {
+ return;
+ }
+
+ const auto guid = adapter.value().guid;
+
+ //
+ // Enumerate over all network devices with the hardware ID,
+ // and delete any adapter whose GUID matches that of the "Mullvad" adapter.
+ //
- if (!deletedAdapter)
+ if (!RemoveNetDevice(hardwareId, guid))
{
- THROW_ERROR("The TAP adapter could not be removed");
+ THROW_ERROR("The virtual adapter could not be removed");
}
}
@@ -864,9 +880,9 @@ int wmain(int argc, const wchar_t * argv[], const wchar_t * [])
goto INVALID_ARGUMENTS;
}
- CreateNetDevice(TAP_HARDWARE_ID, false);
+ CreateNetDevice(TAP_HARDWARE_ID, std::nullopt, false);
UpdateTapDriver(argv[2]);
- RenameAdapter(FindNetAdapter(TAP_HARDWARE_ID), TAP_BASE_ALIAS);
+ RenameAdapter(FindNetAdapter(TAP_HARDWARE_ID).guid, TAP_BASE_ALIAS);
}
else if (0 == _wcsicmp(argv[1], L"update"))
{
@@ -888,7 +904,7 @@ int wmain(int argc, const wchar_t * argv[], const wchar_t * [])
}
else if (0 == _wcsicmp(argv[1], L"remove-vanilla-tap"))
{
- DeleteVanillaMullvadAdapter();
+ RemoveNetAdapterByAlias(DEPRECATED_TAP_HARDWARE_ID, TAP_BASE_ALIAS);
}
else
{