summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/driverlogic.cpp
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-02-04 10:26:19 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-02-04 14:52:42 +0100
commitb9eb60830d2356aef557de14a5be085383f30edc (patch)
tree797df97d3dad29f2f4ffd96c6e0be1ac7d7a8c63 /windows/driverlogic/src/driverlogic.cpp
parent94849a26faa34223e61282d0b9595bd26c70c4e2 (diff)
downloadmullvadvpn-b9eb60830d2356aef557de14a5be085383f30edc.tar.xz
mullvadvpn-b9eb60830d2356aef557de14a5be085383f30edc.zip
Update driverlogic
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
-rw-r--r--windows/driverlogic/src/driverlogic.cpp164
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