summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/error.cpp
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-02-21 11:44:29 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-02-25 11:32:09 +0100
commit35f7a3a3430f7285839d8b90439d6de9cdba025c (patch)
tree0a5958daf5cee3acbfa2c5df57a11d1f568fead4 /windows/driverlogic/src/error.cpp
parentb7a2e7e67d09dd1ac3190b3812c855372ca84cc8 (diff)
downloadmullvadvpn-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.cpp163
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);
+}