diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-02-21 11:44:29 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-02-25 11:32:09 +0100 |
| commit | 35f7a3a3430f7285839d8b90439d6de9cdba025c (patch) | |
| tree | 0a5958daf5cee3acbfa2c5df57a11d1f568fead4 /windows/driverlogic/src/error.cpp | |
| parent | b7a2e7e67d09dd1ac3190b3812c855372ca84cc8 (diff) | |
| download | mullvadvpn-35f7a3a3430f7285839d8b90439d6de9cdba025c.tar.xz mullvadvpn-35f7a3a3430f7285839d8b90439d6de9cdba025c.zip | |
Slightly improve SetupAPI-specific error messages
Diffstat (limited to 'windows/driverlogic/src/error.cpp')
| -rw-r--r-- | windows/driverlogic/src/error.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/windows/driverlogic/src/error.cpp b/windows/driverlogic/src/error.cpp new file mode 100644 index 0000000000..bdbc8e050d --- /dev/null +++ b/windows/driverlogic/src/error.cpp @@ -0,0 +1,163 @@ +#include "stdafx.h" +#include "error.h" +#include <string> +#include <iomanip> +#include <sstream> +#include <map> +#include <setupapi.h> +#include <libcommon/error.h> + + +#define SETUPAPI_ERROR_TABLE_ENTRY(constant) { constant, #constant } + +namespace +{ + +const std::map<uint32_t, const char *> setupApiCodeToString = +{ + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_EXPECTED_SECTION_NAME), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_BAD_SECTION_NAME_LINE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_SECTION_NAME_TOO_LONG), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_GENERAL_SYNTAX), + // + // Inf runtime errors + // + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_WRONG_INF_STYLE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_SECTION_NOT_FOUND), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_LINE_NOT_FOUND), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_BACKUP), + // + // Device Installer/other errors + // + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_ASSOCIATED_CLASS), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_CLASS_MISMATCH), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DUPLICATE_FOUND), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_DRIVER_SELECTED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_KEY_DOES_NOT_EXIST), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_DEVINST_NAME), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_CLASS), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVINST_ALREADY_EXISTS), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVINFO_NOT_REGISTERED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_REG_PROPERTY), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_INF), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_SUCH_DEVINST), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_CANT_LOAD_CLASS_ICON), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_CLASS_INSTALLER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DI_DO_DEFAULT), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DI_NOFILECOPY), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_HWPROFILE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_DEVICE_SELECTED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVINFO_LIST_LOCKED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVINFO_DATA_LOCKED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DI_BAD_PATH), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_CLASSINSTALL_PARAMS), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_FILEQUEUE_LOCKED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_BAD_SERVICE_INSTALLSECT), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_CLASS_DRIVER_LIST), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_ASSOCIATED_SERVICE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_DEFAULT_DEVICE_INTERFACE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVICE_INTERFACE_ACTIVE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVICE_INTERFACE_REMOVED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_BAD_INTERFACE_INSTALLSECT), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_SUCH_INTERFACE_CLASS), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_REFERENCE_STRING), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_MACHINENAME), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_REMOTE_COMM_FAILURE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_MACHINE_UNAVAILABLE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_CONFIGMGR_SERVICES), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_PROPPAGE_PROVIDER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_SUCH_DEVICE_INTERFACE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DI_POSTPROCESSING_REQUIRED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_COINSTALLER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_COMPAT_DRIVERS), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_DEVICE_ICON), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_INF_LOGCONFIG), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DI_DONT_INSTALL), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_FILTER_DRIVER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NON_WINDOWS_NT_DRIVER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NON_WINDOWS_DRIVER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_CATALOG_FOR_OEM_INF), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVINSTALL_QUEUE_NONNATIVE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NOT_DISABLEABLE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_CANT_REMOVE_DEVINST), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INVALID_TARGET), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DRIVER_NONNATIVE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_IN_WOW64), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_SET_SYSTEM_RESTORE_POINT), + + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_SCE_DISABLED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_UNKNOWN_EXCEPTION), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_PNP_REGISTRY_ERROR), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_REMOTE_REQUEST_UNSUPPORTED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NOT_AN_INSTALLED_OEM_INF), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_INF_IN_USE_BY_DEVICES), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DI_FUNCTION_OBSOLETE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_NO_AUTHENTICODE_CATALOG), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_AUTHENTICODE_DISALLOWED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_AUTHENTICODE_TRUSTED_PUBLISHER), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVICE_INSTALLER_NOT_READY), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DRIVER_STORE_ADD_FAILED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DEVICE_INSTALL_BLOCKED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DRIVER_INSTALL_BLOCKED), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_WRONG_INF_TYPE), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_FILE_HASH_NOT_IN_CATALOG), + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_DRIVER_STORE_DELETE_FAILED), + + // + // Setupapi exception codes + // + SETUPAPI_ERROR_TABLE_ENTRY(ERROR_UNRECOVERABLE_STACK_OVERFLOW), +}; + +const char *IsolateFilename(const char *filepath) +{ + const auto slash = strrchr(filepath, '/'); + const auto backslash = strrchr(filepath, '\\'); + + if (nullptr == slash && nullptr == backslash) + { + return filepath; + } + + return max(slash, backslash) + 1; +} + +} // anonymous namespace + +bool IsSetupApiError(uint32_t code) +{ + const auto it = setupApiCodeToString.find(code); + return (setupApiCodeToString.end() != it); +} + +const char * FormatSetupApiError(uint32_t code) +{ + const auto it = setupApiCodeToString.find(code); + + if (setupApiCodeToString.end() == it) + { + return nullptr; + } + + return it->second; +} + +void ThrowSetupApiError(const char *operation, uint32_t code, const char *file, size_t line) +{ + const auto message = FormatSetupApiError(code); + + if (nullptr != message) + { + std::stringstream ss; + ss << operation << ": " << message + << " (0x" << std::setw(8) << std::setfill('0') << std::hex << code << ")"; + common::error::Throw(ss.str().c_str(), file, line); + } + + // Fallback: Treat as a regular Windows error + common::error::Throw(operation, code, file, line); +} |
