diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-02-25 12:21:59 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-02-25 12:21:59 +0100 |
| commit | 943f4154568ce6892eadcf1b57a9deb436d27e5f (patch) | |
| tree | f651795fede6c02b8734719754cb1729eaaf8bc8 /windows/driverlogic/src/driverlogic.cpp | |
| parent | 807de13a4577db8d97b8718f43fe9aef6be84b6d (diff) | |
| parent | 687a2f7bad4aafc55515def59b1ec07a43f1fa50 (diff) | |
| download | mullvadvpn-943f4154568ce6892eadcf1b57a9deb436d27e5f.tar.xz mullvadvpn-943f4154568ce6892eadcf1b57a9deb436d27e5f.zip | |
Merge branch 'improve-device-error-msg'
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp index c92ad51ed6..3e482c196f 100644 --- a/windows/driverlogic/src/driverlogic.cpp +++ b/windows/driverlogic/src/driverlogic.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "error.h" #include <iostream> #include <sstream> #include <string> @@ -8,6 +9,7 @@ #include <libcommon/guid.h> #include <libcommon/memory.h> #include <libcommon/network/nci.h> +#include <libcommon/registry/registry.h> #include <libcommon/string.h> #include <setupapi.h> #include <initguid.h> @@ -28,8 +30,8 @@ constexpr wchar_t TAP_BASE_ALIAS[] = L"Mullvad"; enum ReturnCodes { - GENERAL_ERROR, - GENERAL_SUCCESS + GENERAL_SUCCESS = 0, + GENERAL_ERROR = -1 }; struct NetworkAdapter @@ -107,7 +109,7 @@ std::optional<std::wstring> GetDeviceRegistryStringProperty( // TODO: Check if there may be other causes. if (ERROR_INVALID_DATA != lastError) { - THROW_WINDOWS_ERROR(lastError, "SetupDiGetDeviceRegistryPropertyW"); + THROW_SETUPAPI_ERROR(lastError, "SetupDiGetDeviceRegistryPropertyW"); } return std::nullopt; @@ -131,7 +133,7 @@ std::optional<std::wstring> GetDeviceRegistryStringProperty( if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "Failed to read device property"); + THROW_SETUPAPI_ERROR(GetLastError(), "Failed to read device property"); } return std::make_optional(buffer.data()); @@ -167,7 +169,7 @@ std::wstring GetDeviceStringProperty( if (ERROR_INSUFFICIENT_BUFFER != lastError) { - THROW_WINDOWS_ERROR(lastError, "SetupDiGetDevicePropertyW"); + THROW_SETUPAPI_ERROR(lastError, "SetupDiGetDevicePropertyW"); } } @@ -190,7 +192,7 @@ std::wstring GetDeviceStringProperty( if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "Failed to read device property"); + THROW_SETUPAPI_ERROR(GetLastError(), "Failed to read device property"); } return buffer.data(); @@ -223,7 +225,7 @@ std::wstring GetDeviceInstanceId( if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetDeviceInstanceIdW"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiGetDeviceInstanceIdW"); } return deviceInstanceId.data(); @@ -242,7 +244,7 @@ std::wstring GetNetCfgInstanceId(HDEVINFO devInfo, const SP_DEVINFO_DATA &devInf if (hNet == INVALID_HANDLE_VALUE) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiOpenDevRegKey"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiOpenDevRegKey"); } std::vector<wchar_t> instanceId(MAX_PATH + 1); @@ -288,13 +290,13 @@ bool DeleteDevice(HDEVINFO devInfo, const SP_DEVINFO_DATA &devInfoData) auto status = SetupDiSetClassInstallParamsW(devInfo, data, &rmdParams.ClassInstallHeader, sizeof(rmdParams)); if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiSetClassInstallParamsW"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiSetClassInstallParamsW"); } status = SetupDiCallClassInstaller(DIF_REMOVE, devInfo, data); if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiCallClassInstaller"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiCallClassInstaller"); } return true; @@ -311,7 +313,7 @@ void ForEachNetworkDevice(const std::optional<std::wstring> hwId, std::function< if (INVALID_HANDLE_VALUE == devInfo) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetClassDevsW"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiGetClassDevsW"); } common::memory::ScopeDestructor cleanupDevList; @@ -334,7 +336,7 @@ void ForEachNetworkDevice(const std::optional<std::wstring> hwId, std::function< break; } - THROW_WINDOWS_ERROR(lastError, "Enumerating network adapters"); + THROW_SETUPAPI_ERROR(lastError, "Enumerating network adapters"); } if (hwId.has_value()) @@ -416,7 +418,7 @@ void CreateTapDevice() const auto deviceInfoSet = SetupDiCreateDeviceInfoList(&classGuid, 0); if (INVALID_HANDLE_VALUE == deviceInfoSet) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiCreateDeviceInfoList"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiCreateDeviceInfoList"); } common::memory::ScopeDestructor scopeDestructor; @@ -440,7 +442,7 @@ void CreateTapDevice() if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiCreateDeviceInfoW"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiCreateDeviceInfoW"); } status = SetupDiSetDeviceRegistryPropertyW( @@ -453,7 +455,7 @@ void CreateTapDevice() if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiSetDeviceRegistryPropertyW"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiSetDeviceRegistryPropertyW"); } // @@ -467,7 +469,7 @@ void CreateTapDevice() if (FALSE == status) { - THROW_WINDOWS_ERROR(GetLastError(), "SetupDiCallClassInstaller"); + THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiCallClassInstaller"); } Log(L"Created new TAP adapter successfully"); @@ -503,7 +505,35 @@ ATTEMPT_UPDATE: goto ATTEMPT_UPDATE; } - THROW_WINDOWS_ERROR(lastError, "UpdateDriverForPlugAndPlayDevicesW"); + if (ERROR_DEVICE_INSTALLER_NOT_READY == lastError) + { + bool deviceInstallDisabled = false; + + try + { + const auto key = common::registry::Registry::OpenKey( + HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Services\\DeviceInstall\\Parameters" + ); + deviceInstallDisabled = (0 != key->readUint32(L"DeviceInstallDisabled")); + } + catch (...) + { + } + + if (deviceInstallDisabled) + { + throw common::error::WindowsException( + "Device installs must be enabled to continue. " + "Enable them in the Local Group Policy editor, or " + "update the registry value DeviceInstallDisabled in " + "[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\DeviceInstall\\Parameters]", + lastError + ); + } + } + + THROW_SETUPAPI_ERROR(lastError, "UpdateDriverForPlugAndPlayDevicesW"); } // @@ -745,6 +775,11 @@ int wmain(int argc, const wchar_t * argv[], const wchar_t * []) goto INVALID_ARGUMENTS; } } + catch (const common::error::WindowsException &e) + { + LogError(common::string::ToWide(e.what())); + return e.errorCode(); + } catch (const std::exception &e) { LogError(common::string::ToWide(e.what())); |
