summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/driverlogic.cpp
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-02-25 12:21:59 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-02-25 12:21:59 +0100
commit943f4154568ce6892eadcf1b57a9deb436d27e5f (patch)
treef651795fede6c02b8734719754cb1729eaaf8bc8 /windows/driverlogic/src/driverlogic.cpp
parent807de13a4577db8d97b8718f43fe9aef6be84b6d (diff)
parent687a2f7bad4aafc55515def59b1ec07a43f1fa50 (diff)
downloadmullvadvpn-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.cpp69
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()));