diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-09-28 19:56:58 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-11-24 18:50:03 +0100 |
| commit | 82e12793f17d88744870c41d9df52c8be667479e (patch) | |
| tree | 16e93e0b127126c2061e7895456ca136591a4ec9 /windows/driverlogic/src/driverlogic.cpp | |
| parent | e6ee7e1f991f4a8811f4e08e4f726a124764d64e (diff) | |
| download | mullvadvpn-82e12793f17d88744870c41d9df52c8be667479e.tar.xz mullvadvpn-82e12793f17d88744870c41d9df52c8be667479e.zip | |
Generalize driverlogic
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 96 |
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 { |
