diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-02-04 10:26:19 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-02-04 14:52:42 +0100 |
| commit | b9eb60830d2356aef557de14a5be085383f30edc (patch) | |
| tree | 797df97d3dad29f2f4ffd96c6e0be1ac7d7a8c63 /windows/driverlogic/src/driverlogic.cpp | |
| parent | 94849a26faa34223e61282d0b9595bd26c70c4e2 (diff) | |
| download | mullvadvpn-b9eb60830d2356aef557de14a5be085383f30edc.tar.xz mullvadvpn-b9eb60830d2356aef557de14a5be085383f30edc.zip | |
Update driverlogic
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 164 |
1 files changed, 68 insertions, 96 deletions
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp index 16704b6c2b..fc9fc69bc1 100644 --- a/windows/driverlogic/src/driverlogic.cpp +++ b/windows/driverlogic/src/driverlogic.cpp @@ -257,11 +257,30 @@ std::wstring GetNetCfgInstanceId(HDEVINFO devInfo, const SP_DEVINFO_DATA &devInf return instanceId.data(); } -std::set<NetworkAdapter> GetTapAdapters(const std::wstring &tapHardwareId) +void DeleteDevice(HDEVINFO devInfo, SP_DEVINFO_DATA * devInfoData) { - std::set<NetworkAdapter> adapters; + SP_REMOVEDEVICE_PARAMS rmdParams = { 0 }; + rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); + rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE; + rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL; + rmdParams.HwProfile = 0; - HDEVINFO devInfo = SetupDiGetClassDevs( + auto status = SetupDiSetClassInstallParamsW(devInfo, devInfoData, &rmdParams.ClassInstallHeader, sizeof(rmdParams)); + if (FALSE == status) + { + THROW_WINDOWS_ERROR(GetLastError(), "SetupDiSetClassInstallParamsW"); + } + + status = SetupDiCallClassInstaller(DIF_REMOVE, devInfo, devInfoData); + if (FALSE == status) + { + THROW_WINDOWS_ERROR(GetLastError(), "SetupDiCallClassInstaller"); + } +} + +void ForEachDevice(const std::wstring &tapHardwareId, std::function<void(HDEVINFO, SP_DEVINFO_DATA *)> func) +{ + HDEVINFO devInfo = SetupDiGetClassDevsW( &GUID_DEVCLASS_NET, nullptr, nullptr, @@ -270,17 +289,15 @@ std::set<NetworkAdapter> GetTapAdapters(const std::wstring &tapHardwareId) if (INVALID_HANDLE_VALUE == devInfo) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetClassDevs() failed"); + THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetClassDevsW"); } - common::memory::ScopeDestructor scopeDestructor; - scopeDestructor += [devInfo]() + common::memory::ScopeDestructor cleanupDevList; + cleanupDevList += [&devInfo]() { SetupDiDestroyDeviceInfoList(devInfo); }; - common::network::Nci nci; - for (int memberIndex = 0; ; memberIndex++) { SP_DEVINFO_DATA devInfoData = { 0 }; @@ -292,50 +309,69 @@ std::set<NetworkAdapter> GetTapAdapters(const std::wstring &tapHardwareId) if (ERROR_NO_MORE_ITEMS == lastError) { - // Done break; } - THROW_WINDOWS_ERROR(lastError, "SetupDiEnumDeviceInfo() failed while enumerating network adapters"); + THROW_WINDOWS_ERROR(lastError, "Enumerating network adapters"); } try { - // - // Check whether this is a TAP adapter - // - const auto hardwareId = GetDeviceRegistryStringProperty(devInfo, &devInfoData, SPDRP_HARDWAREID); - if (!hardwareId.has_value() - || wcscmp(hardwareId.value().c_str(), tapHardwareId.c_str()) != 0) + + if (!hardwareId.has_value() || + 0 != tapHardwareId.compare(hardwareId.value())) { continue; } + } + catch (const std::exception & e) + { + // + // Skip this adapter + // + + std::cerr << "Skipping TAP adapter due to exception caught while iterating: " + << e.what() << std::endl; + continue; + } + + func(devInfo, &devInfoData); + } +} + +std::set<NetworkAdapter> GetTapAdapters(const std::wstring &tapHardwareId) +{ + std::set<NetworkAdapter> adapters; + common::network::Nci nci; + ForEachDevice(tapHardwareId, [&](HDEVINFO devInfo, SP_DEVINFO_DATA * devInfoData) { + try + { // // Construct NetworkAdapter // - const std::wstring guid = GetNetCfgInstanceId(devInfo, devInfoData); + const std::wstring guid = GetNetCfgInstanceId(devInfo, *devInfoData); GUID guidObj = common::Guid::FromString(guid); adapters.emplace(NetworkAdapter( guid, - GetDeviceStringProperty(devInfo, &devInfoData, &DEVPKEY_Device_DriverDesc), + GetDeviceStringProperty(devInfo, devInfoData, &DEVPKEY_Device_DriverDesc), nci.getConnectionName(guidObj), - GetDeviceInstanceId(devInfo, &devInfoData) + GetDeviceInstanceId(devInfo, devInfoData) )); } catch (const std::exception & e) { // - // Log exception and skip this adapter + // Skip this adapter // std::cerr << "Skipping TAP adapter due to exception caught while iterating: " << e.what() << std::endl; } - } + }); return adapters; } @@ -459,9 +495,9 @@ std::optional<NetworkAdapter> FindMullvadAdapter(const std::set<NetworkAdapter> 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 0 == _wcsicmp(candidate.alias.c_str(), alias.c_str()); + }); return it; }; @@ -531,94 +567,30 @@ DeletionResult DeleteVanillaMullvadAdapter() } const auto mullvadGuid = mullvadAdapter.value().guid; + size_t numRemainingAdapters = 0; - HDEVINFO devInfo = SetupDiGetClassDevsW( - &GUID_DEVCLASS_NET, - nullptr, - nullptr, - DIGCF_PRESENT - ); - - if (INVALID_HANDLE_VALUE == devInfo) - { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetClassDevsW() failed"); - } - - common::memory::ScopeDestructor cleanupDevList; - cleanupDevList += [&devInfo]() - { - SetupDiDestroyDeviceInfoList(devInfo); - }; - - int numRemainingAdapters = 0; - - for (int memberIndex = 0; ; memberIndex++) - { - SP_DEVINFO_DATA devInfoData = { 0 }; - devInfoData.cbSize = sizeof(devInfoData); - - if (FALSE == SetupDiEnumDeviceInfo(devInfo, memberIndex, &devInfoData)) - { - const auto lastError = GetLastError(); - - if (ERROR_NO_MORE_ITEMS == lastError) - { - break; - } - - THROW_WINDOWS_ERROR(lastError, "Error enumerating network adapters"); - } - + ForEachDevice(DEPRECATED_TAP_HARDWARE_ID, [&](HDEVINFO devInfo, SP_DEVINFO_DATA * devInfoData) { try { - const auto hardwareId = GetDeviceRegistryStringProperty(devInfo, &devInfoData, SPDRP_HARDWAREID); - - if (!hardwareId.has_value()) - { - continue; - } - if (0 != wcscmp(DEPRECATED_TAP_HARDWARE_ID, hardwareId.value().data())) - { - continue; - } - if (0 != GetNetCfgInstanceId(devInfo, devInfoData).compare(mullvadGuid)) + if (0 != GetNetCfgInstanceId(devInfo, *devInfoData).compare(mullvadGuid)) { numRemainingAdapters++; - continue; - } - - // - // Delete existing device - // - - SP_REMOVEDEVICE_PARAMS rmdParams; - rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); - rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE; - rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL; - rmdParams.HwProfile = 0; - - auto status = SetupDiSetClassInstallParamsW(devInfo, &devInfoData, &rmdParams.ClassInstallHeader, sizeof(rmdParams)); - if (FALSE == status) - { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiSetClassInstallParamsW"); } - - status = SetupDiCallClassInstaller(DIF_REMOVE, devInfo, &devInfoData); - if (FALSE == status) + else { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiCallClassInstaller"); + DeleteDevice(devInfo, devInfoData); } } catch (const std::exception & e) { // - // Log exception and skip this adapter + // Skip this adapter // std::cerr << "Skipping TAP adapter due to exception caught while iterating: " - << e.what(); + << e.what() << std::endl; } - } + }); return (numRemainingAdapters > 0) ? DeletionResult::SOME_REMAINING_TAP_ADAPTERS |
