#include "stdafx.h" #include "error.h" #include #include #include #include #include #include #define SETUPAPI_ERROR_TABLE_ENTRY(constant) { constant, #constant } namespace { const std::map 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); }