diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-02-26 12:53:48 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-02-26 12:53:48 +0100 |
| commit | ca34b00a94888259c076348f469ef03215c27f8d (patch) | |
| tree | 63b8e835bb8818b8f28a898c53c1a912ea605c96 /windows/driverlogic/src/driverlogic.cpp | |
| parent | 492b06e3066faaebc7544980fda09a6b76bfb256 (diff) | |
| parent | 44b86e6c1f485bae6ecc4986813f86c230302a97 (diff) | |
| download | mullvadvpn-ca34b00a94888259c076348f469ef03215c27f8d.tar.xz mullvadvpn-ca34b00a94888259c076348f469ef03215c27f8d.zip | |
Merge branch 'fix-guid-conflict'
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp index acc601811b..f849c828f2 100644 --- a/windows/driverlogic/src/driverlogic.cpp +++ b/windows/driverlogic/src/driverlogic.cpp @@ -759,7 +759,7 @@ std::optional<NetworkAdapter> FindAdapterByAlias(const std::set<NetworkAdapter> return std::nullopt; } -bool RemoveNetDevice(const std::wstring &tapHardwareId, const std::wstring &guid) +bool RemoveNetDevice(const std::optional<std::wstring> tapHardwareId, const std::wstring &guid) { bool deletedAdapter = false; @@ -806,7 +806,7 @@ void RemoveNetAdapterByAlias(const std::wstring &hardwareId, const std::wstring // and delete any adapter whose GUID matches that of the "Mullvad" adapter. // - if (!RemoveNetDevice(hardwareId, guid)) + if (!RemoveNetDevice(std::make_optional(hardwareId), guid)) { THROW_ERROR("The virtual adapter could not be removed"); } @@ -818,24 +818,24 @@ std::filesystem::path GetCurrentModulePath() SetLastError(ERROR_SUCCESS); - size_t nextCapacity = 256; + size_t nextCapacity = MAX_PATH; + DWORD writtenChars = 0; do { - pathBuffer.reserve(nextCapacity); - - const auto writtenChars = GetModuleFileNameW(nullptr, &pathBuffer[0], static_cast<DWORD>(pathBuffer.capacity())); + pathBuffer.resize(nextCapacity); + writtenChars = GetModuleFileNameW(nullptr, &pathBuffer[0], static_cast<DWORD>(pathBuffer.size())); if (0 == writtenChars) { THROW_WINDOWS_ERROR(GetLastError(), "GetModuleFileNameW"); } - pathBuffer.resize(writtenChars); - - nextCapacity = 2 * pathBuffer.capacity(); + nextCapacity = 2 * pathBuffer.size(); } while (ERROR_INSUFFICIENT_BUFFER == GetLastError()); + pathBuffer.resize(writtenChars); + return std::filesystem::path(pathBuffer.begin(), pathBuffer.end()); } @@ -1038,6 +1038,20 @@ int wmain(int argc, const wchar_t * argv[], const wchar_t * []) RemoveNetAdapterByAlias(hardwareId, baseName); } + else if (0 == _wcsicmp(argv[1], L"remove-device-by-guid")) + { + if (3 != argc) + { + goto INVALID_ARGUMENTS; + } + + const wchar_t *guid = argv[2]; + + if (!RemoveNetDevice(std::nullopt, guid)) + { + return ADAPTER_NOT_FOUND; + } + } else if (0 == _wcsicmp(argv[1], L"device-exists")) { if (4 != argc) |
