typedef struct errorcode_to_id { unsigned int error; const char* id; } errorcode_to_id_t; typedef struct error_id_to_message { const char* id; const char* message; } error_id_to_message_t; // Taken from https://github.com/samdmarshall/SDMMobileDevice/blob/master/Framework/MobileDevice/Error/SDMMD_Error.h static errorcode_to_id_t errorcode_to_id[] = { { 0xe8000001, "kAMDUndefinedError" }, { 0xe8000002, "kAMDBadHeaderError" }, { 0xe8000003, "kAMDNoResourcesError" }, { 0xe8000004, "kAMDReadError" }, { 0xe8000005, "kAMDWriteError" }, { 0xe8000006, "kAMDUnknownPacketError" }, { 0xe8000007, "kAMDInvalidArgumentError" }, { 0xe8000008, "kAMDNotFoundError" }, { 0xe8000009, "kAMDIsDirectoryError" }, { 0xe800000a, "kAMDPermissionError" }, { 0xe800000b, "kAMDNotConnectedError" }, { 0xe800000c, "kAMDTimeOutError" }, { 0xe800000d, "kAMDOverrunError" }, { 0xe800000e, "kAMDEOFError" }, { 0xe800000f, "kAMDUnsupportedError" }, { 0xe8000010, "kAMDFileExistsError" }, { 0xe8000011, "kAMDBusyError" }, { 0xe8000012, "kAMDCryptoError" }, { 0xe8000013, "kAMDInvalidResponseError" }, { 0xe8000014, "kAMDMissingKeyError" }, { 0xe8000015, "kAMDMissingValueError" }, { 0xe8000016, "kAMDGetProhibitedError" }, { 0xe8000017, "kAMDSetProhibitedError" }, { 0xe8000018, "kAMDRemoveProhibitedError" }, { 0xe8000019, "kAMDImmutableValueError" }, { 0xe800001a, "kAMDPasswordProtectedError" }, { 0xe800001b, "kAMDMissingHostIDError" }, { 0xe800001c, "kAMDInvalidHostIDError" }, { 0xe800001d, "kAMDSessionActiveError" }, { 0xe800001e, "kAMDSessionInactiveError" }, { 0xe800001f, "kAMDMissingSessionIDError" }, { 0xe8000020, "kAMDInvalidSessionIDError" }, { 0xe8000021, "kAMDMissingServiceError" }, { 0xe8000022, "kAMDInvalidServiceError" }, { 0xe8000023, "kAMDInvalidCheckinError" }, { 0xe8000024, "kAMDCheckinTimeoutError" }, { 0xe8000025, "kAMDMissingPairRecordError" }, { 0xe8000026, "kAMDInvalidActivationRecordError" }, { 0xe8000027, "kAMDMissingActivationRecordError" }, { 0xe8000028, "kAMDWrongDroidError" }, { 0xe8000029, "kAMDSUVerificationError" }, { 0xe800002a, "kAMDSUPatchError" }, { 0xe800002b, "kAMDSUFirmwareError" }, { 0xe800002c, "kAMDProvisioningProfileNotValid" }, { 0xe800002d, "kAMDSendMessageError" }, { 0xe800002e, "kAMDReceiveMessageError" }, { 0xe800002f, "kAMDMissingOptionsError" }, { 0xe8000030, "kAMDMissingImageTypeError" }, { 0xe8000031, "kAMDDigestFailedError" }, { 0xe8000032, "kAMDStartServiceError" }, { 0xe8000033, "kAMDInvalidDiskImageError" }, { 0xe8000034, "kAMDMissingDigestError" }, { 0xe8000035, "kAMDMuxError" }, { 0xe8000036, "kAMDApplicationAlreadyInstalledError" }, { 0xe8000037, "kAMDApplicationMoveFailedError" }, { 0xe8000038, "kAMDApplicationSINFCaptureFailedError" }, { 0xe8000039, "kAMDApplicationSandboxFailedError" }, { 0xe800003a, "kAMDApplicationVerificationFailedError" }, { 0xe800003b, "kAMDArchiveDestructionFailedError" }, { 0xe800003c, "kAMDBundleVerificationFailedError" }, { 0xe800003d, "kAMDCarrierBundleCopyFailedError" }, { 0xe800003e, "kAMDCarrierBundleDirectoryCreationFailedError" }, { 0xe800003f, "kAMDCarrierBundleMissingSupportedSIMsError" }, { 0xe8000040, "kAMDCommCenterNotificationFailedError" }, { 0xe8000041, "kAMDContainerCreationFailedError" }, { 0xe8000042, "kAMDContainerP0wnFailedError" }, { 0xe8000043, "kAMDContainerRemovalFailedError" }, { 0xe8000044, "kAMDEmbeddedProfileInstallFailedError" }, { 0xe8000045, "kAMDErrorError" }, { 0xe8000046, "kAMDExecutableTwiddleFailedError" }, { 0xe8000047, "kAMDExistenceCheckFailedError" }, { 0xe8000048, "kAMDInstallMapUpdateFailedError" }, { 0xe8000049, "kAMDManifestCaptureFailedError" }, { 0xe800004a, "kAMDMapGenerationFailedError" }, { 0xe800004b, "kAMDMissingBundleExecutableError" }, { 0xe800004c, "kAMDMissingBundleIdentifierError" }, { 0xe800004d, "kAMDMissingBundlePathError" }, { 0xe800004e, "kAMDMissingContainerError" }, { 0xe800004f, "kAMDNotificationFailedError" }, { 0xe8000050, "kAMDPackageExtractionFailedError" }, { 0xe8000051, "kAMDPackageInspectionFailedError" }, { 0xe8000052, "kAMDPackageMoveFailedError" }, { 0xe8000053, "kAMDPathConversionFailedError" }, { 0xe8000054, "kAMDRestoreContainerFailedError" }, { 0xe8000055, "kAMDSeatbeltProfileRemovalFailedError" }, { 0xe8000056, "kAMDStageCreationFailedError" }, { 0xe8000057, "kAMDSymlinkFailedError" }, { 0xe8000058, "kAMDiTunesArtworkCaptureFailedError" }, { 0xe8000059, "kAMDiTunesMetadataCaptureFailedError" }, { 0xe800005a, "kAMDAlreadyArchivedError" }, { 0xe800005b, "kAMDServiceLimitError" }, { 0xe800005c, "kAMDInvalidPairRecordError" }, { 0xe800005d, "kAMDServiceProhibitedError" }, { 0xe800005e, "kAMDCheckinSetupFailedError" }, { 0xe800005f, "kAMDCheckinConnectionFailedError" }, { 0xe8000060, "kAMDCheckinReceiveFailedError" }, { 0xe8000061, "kAMDCheckinResponseFailedError" }, { 0xe8000062, "kAMDCheckinSendFailedError" }, { 0xe8000063, "kAMDMuxCreateListenerError" }, { 0xe8000064, "kAMDMuxGetListenerError" }, { 0xe8000065, "kAMDMuxConnectError" }, { 0xe8000066, "kAMDUnknownCommandError" }, { 0xe8000067, "kAMDAPIInternalError" }, { 0xe8000068, "kAMDSavePairRecordFailedError" }, { 0xe8000069, "kAMDCheckinOutOfMemoryError" }, { 0xe800006a, "kAMDDeviceTooNewError" }, { 0xe800006b, "kAMDDeviceRefNoGood" }, { 0xe800006c, "kAMDCannotTranslateError" }, { 0xe800006d, "kAMDMobileImageMounterMissingImageSignature" }, { 0xe800006e, "kAMDMobileImageMounterResponseCreationFailed" }, { 0xe800006f, "kAMDMobileImageMounterMissingImageType" }, { 0xe8000070, "kAMDMobileImageMounterMissingImagePath" }, { 0xe8000071, "kAMDMobileImageMounterImageMapLoadFailed" }, { 0xe8000072, "kAMDMobileImageMounterAlreadyMounted" }, { 0xe8000073, "kAMDMobileImageMounterImageMoveFailed" }, { 0xe8000074, "kAMDMobileImageMounterMountPathMissing" }, { 0xe8000075, "kAMDMobileImageMounterMountPathNotEmpty" }, { 0xe8000076, "kAMDMobileImageMounterImageMountFailed" }, { 0xe8000077, "kAMDMobileImageMounterTrustCacheLoadFailed" }, { 0xe8000078, "kAMDMobileImageMounterDigestFailed" }, { 0xe8000079, "kAMDMobileImageMounterDigestCreationFailed" }, { 0xe800007a, "kAMDMobileImageMounterImageVerificationFailed" }, { 0xe800007b, "kAMDMobileImageMounterImageInfoCreationFailed" }, { 0xe800007c, "kAMDMobileImageMounterImageMapStoreFailed" }, { 0xe800007d, "kAMDBonjourSetupError" }, { 0xe800007e, "kAMDDeviceOSVersionTooLow" }, { 0xe800007f, "kAMDNoWifiSyncSupportError" }, { 0xe8000080, "kAMDDeviceFamilyNotSupported" }, { 0xe8000081, "kAMDEscrowLockedError" }, { 0xe8000082, "kAMDPairingProhibitedError" }, { 0xe8000083, "kAMDProhibitedBySupervision" }, { 0xe8000084, "kAMDDeviceDisconnectedError" }, { 0xe8000085, "kAMDTooBigError" }, { 0xe8000086, "kAMDPackagePatchFailedError" }, { 0xe8000087, "kAMDIncorrectArchitectureError" }, { 0xe8000088, "kAMDPluginCopyFailedError" }, { 0xe8000089, "kAMDBreadcrumbFailedError" }, { 0xe800008a, "kAMDBreadcrumbUnlockError" }, { 0xe800008b, "kAMDGeoJSONCaptureFailedError" }, { 0xe800008c, "kAMDNewsstandArtworkCaptureFailedError" }, { 0xe800008d, "kAMDMissingCommandError" }, { 0xe800008e, "kAMDNotEntitledError" }, { 0xe800008f, "kAMDMissingPackagePathError" }, { 0xe8000090, "kAMDMissingContainerPathError" }, { 0xe8000091, "kAMDMissingApplicationIdentifierError" }, { 0xe8000092, "kAMDMissingAttributeValueError" }, { 0xe8000093, "kAMDLookupFailedError" }, { 0xe8000094, "kAMDDictCreationFailedError" }, { 0xe8000095, "kAMDUserDeniedPairingError" }, { 0xe8000096, "kAMDPairingDialogResponsePendingError" }, { 0xe8000097, "kAMDInstallProhibitedError" }, { 0xe8000098, "kAMDUninstallProhibitedError" }, { 0xe8000099, "kAMDFMiPProtectedError" }, { 0xe800009a, "kAMDMCProtected" }, { 0xe800009b, "kAMDMCChallengeRequired" }, { 0xe800009c, "kAMDMissingBundleVersionError" }, { 0xe8008015, "A valid provisioning profile for this executable was not found."}, }; const int errorcode_to_id_count = sizeof(errorcode_to_id) / sizeof(errorcode_to_id_t); // Taken from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/en_GB.lproj/Localizable.strings error_id_to_message_t error_id_to_message[] = { { "kAMDAPIInternalError", "There was an internal API error." }, { "kAMDAlreadyArchivedError", "The application is already archived." }, { "kAMDAppBlacklistedError", "This app is not allowed to be installed on this device." }, { "kAMDApplicationAlreadyInstalledError", "A system application with the given bundle identifier is already installed on the device and cannot be replaced." }, { "kAMDApplicationMoveFailedError", "The application could not be moved into place on the device." }, { "kAMDApplicationSandboxFailedError", "The application could not be sandboxed." }, { "kAMDApplicationVerificationFailedError", "The application could not be verified." }, { "kAMDArchiveDestructionFailedError", "Could not remove the application archive." }, { "kAMDBadHeaderError", "Could not transfer file." }, { "kAMDBreadcrumbFailedError", "Could not write installation breadcrumb." }, { "kAMDBreadcrumbUnlockError", "Could not update installation breadcrumb." }, { "kAMDBundleVerificationFailedError", "The carrier bundle could not be verified." }, { "kAMDBusyError", "The device is busy." }, { "kAMDCannotTranslateError", "Could not translate messages from device" }, { "kAMDCarrierBundleCopyFailedError", "Could not install the carrier bundle." }, { "kAMDCarrierBundleDirectoryCreationFailedError", "Could not create the carrier bundle directory." }, { "kAMDCarrierBundleMissingSupportedSIMsError", "There are no supported SIMs for this carrier bundle." }, { "kAMDCheckinConnectionFailedError", "The service did not start properly on the device." }, { "kAMDCheckinOutOfMemoryError", "The service did not start properly on the device." }, { "kAMDCheckinReceiveFailedError", "The service did not start properly on the device." }, { "kAMDCheckinResponseFailedError", "The service did not start properly on the device." }, { "kAMDCheckinSendFailedError", "The service did not start properly on the device." }, { "kAMDCheckinSetupFailedError", "Could not start service on device" }, { "kAMDCheckinTimeoutError", "The service did not start properly on the device." }, { "kAMDCommCenterNotificationFailedError", "Could not listen for notification from the baseband." }, { "kAMDContainerCreationFailedError", "Could not create application container." }, { "kAMDContainerP0wnFailedError", "Could not repair permissions on application container." }, { "kAMDContainerRemovalFailedError", "Could not remove the application container." }, { "kAMDCryptoError", "Could not establish a secure connection to the device." }, { "kAMDDeviceDisconnectedError", "This device is no longer connected." }, { "kAMDDeviceFamilyNotSupported", "This application does not support this kind of device." }, { "kAMDDeviceOSVersionTooLow", "The device OS version is too low." }, { "kAMDDeviceRefNoGood", "This device is no longer connected." }, { "kAMDDeviceTooNewError", "This application needs to be updated." }, { "kAMDDictCreationFailedError", "Could not extract capabilities from the request." }, { "kAMDDigestFailedError", "Could not read disk image." }, { "kAMDEOFError", "End of file." }, { "kAMDEmbeddedProfileInstallFailedError", "Could not install the embedded provisioning profile." }, { "kAMDErrorError", "An error occurred." }, { "kAMDEscrowLockedError", "Device is not available until first unlock after boot." }, { "kAMDExecutableTwiddleFailedError", "Could not change executable permissions on the application." }, { "kAMDExistenceCheckFailedError", "Could not check to see if the application already exists." }, { "kAMDFMiPProtectedError", "The device is in lost mode." }, { "kAMDFileExistsError", "The file already exists." }, { "kAMDGeoJSONCaptureFailedError", "Could not save the GeoJSON data." }, { "kAMDGetProhibitedError", "Cannot retrieve value from the passcode-locked device." }, { "kAMDImmutableValueError", "This value cannot be changed." }, { "kAMDIncorrectArchitectureError", "This application does not support this device's CPU type." }, { "kAMDInstallMapUpdateFailedError", "Could not update the installed applications list." }, { "kAMDInstallProhibitedError", "Installation of apps is prohibited by a policy on the device." }, { "kAMDInvalidActivationRecordError", "The activation record is not valid." }, { "kAMDInvalidArgumentError", "The argument is invalid." }, { "kAMDInvalidCheckinError", "Could not start service on device" }, { "kAMDInvalidDiskImageError", "The disk image is invalid." }, { "kAMDInvalidHostIDError", "The device does not recognise this host." }, { "kAMDInvalidPairRecordError", "The host is no longer paired with the device." }, { "kAMDInvalidResponseError", "Received an unexpected response from the device." }, { "kAMDInvalidServiceError", "The service is invalid." }, { "kAMDInvalidSessionIDError", "The session ID is invalid." }, { "kAMDIsDirectoryError", "The path is a directory." }, { "kAMDLookupFailedError", "Could not list installed applications." }, { "kAMDMCChallengeRequired", "A policy on the device requires secure pairing." }, { "kAMDMCProtected", "Pairing is prohibited by a policy on the device." }, { "kAMDManifestCaptureFailedError", "Could not save the application manifest." }, { "kAMDMapGenerationFailedError", "Could not generate the map." }, { "kAMDMissingActivationRecordError", "The activation record could not be found." }, { "kAMDMissingApplicationIdentifierError", "Request was missing the application identifier." }, { "kAMDMissingAttributeValueError", "Request was missing a required value." }, { "kAMDMissingBundleExecutableError", "The application bundle does not contain an executable." }, { "kAMDMissingBundleIdentifierError", "The application bundle does not contain a valid identifier." }, { "kAMDMissingBundlePathError", "Could not determine the application bundle path." }, { "kAMDMissingBundleVersionError", "The bundle's Info.plist does not contain a CFBundleVersion key or its value is not a string." }, { "kAMDMissingCommandError", "The request did not contain a command." }, { "kAMDMissingContainerError", "Could not find the container for the installed application." }, { "kAMDMissingContainerPathError", "Request was missing the container path." }, { "kAMDMissingDigestError", "The digest is missing." }, { "kAMDMissingHostIDError", "The device does not recognise this host." }, { "kAMDMissingImageTypeError", "The image is missing." }, { "kAMDMissingKeyError", "The key is missing." }, { "kAMDMissingOptionsError", "The options are missing." }, { "kAMDMissingPackagePathError", "Request was missing the package path." }, { "kAMDMissingPairRecordError", "The host is not paired with the device." }, { "kAMDMissingServiceError", "The service is missing." }, { "kAMDMissingSessionIDError", "The session ID is missing." }, { "kAMDMissingValueError", "The value is missing." }, { "kAMDMobileImageMounterAlreadyMounted", "Could not support development." }, { "kAMDMobileImageMounterDigestCreationFailed", "Could not support development." }, { "kAMDMobileImageMounterDigestFailed", "Could not support development." }, { "kAMDMobileImageMounterImageInfoCreationFailed", "Could not support development." }, { "kAMDMobileImageMounterImageMapLoadFailed", "Could not support development." }, { "kAMDMobileImageMounterImageMapStoreFailed", "Could not support development." }, { "kAMDMobileImageMounterImageMountFailed", "Could not support development." }, { "kAMDMobileImageMounterImageMoveFailed", "Could not support development." }, { "kAMDMobileImageMounterImageVerificationFailed", "Could not support development." }, { "kAMDMobileImageMounterMissingImagePath", "Could not support development." }, { "kAMDMobileImageMounterMissingImageSignature", "Could not support development." }, { "kAMDMobileImageMounterMissingImageType", "Could not support development." }, { "kAMDMobileImageMounterMountPathMissing", "Could not support development." }, { "kAMDMobileImageMounterMountPathNotEmpty", "Could not support development." }, { "kAMDMobileImageMounterResponseCreationFailed", "Could not support development." }, { "kAMDMobileImageMounterTrustCacheLoadFailed", "Could not support development." }, { "kAMDMuxConnectError", "Could not connect to the device." }, { "kAMDMuxCreateListenerError", "Could not listen for USB devices." }, { "kAMDMuxError", "There was an error with the USB device multiplexor." }, { "kAMDMuxGetListenerError", "Could not get the USB listener." }, { "kAMDNewsstandArtworkCaptureFailedError", "Could not save the Newsstand artwork." }, { "kAMDNoResourcesError", "Could not allocate a resource." }, { "kAMDNoWifiSyncSupportError", "Device doesn't support wireless sync." }, { "kAMDNotConnectedError", "Not connected to the device." }, { "kAMDNotEntitledError", "The requesting application is not allowed to make this request." }, { "kAMDNotFoundError", "The file could not be found." }, { "kAMDNotificationFailedError", "Could not post a notification." }, { "kAMDOverrunError", "There was a buffer overrun." }, { "kAMDPackageExtractionFailedError", "Could not open the application package." }, { "kAMDPackageInspectionFailedError", "Could not inspect the application package." }, { "kAMDPackageMoveFailedError", "Could not move the application package into the staging location." }, { "kAMDPackagePatchFailedError", "Could not apply patch update to application." }, { "kAMDPairingDialogResponsePendingError", "The user has not yet responded to the pairing request." }, { "kAMDPairingProhibitedError", "Pairing only allowed over USB." }, { "kAMDPasswordProtectedError", "The device is passcode protected." }, { "kAMDPathConversionFailedError", "Could not convert the path." }, { "kAMDPermissionError", "You do not have permission." }, { "kAMDPluginCopyFailedError", "Could not copy VPN Plug-in into app container." }, { "kAMDProhibitedBySupervision", "Operation prohibited on supervised devices." }, { "kAMDProvisioningProfileNotValid", "The provisioning profile is not valid." }, { "kAMDReadError", "Could not read from the device." }, { "kAMDReceiveMessageError", "Could not receive a message from the device." }, { "kAMDRemoveProhibitedError", "Cannot remove value on device." }, { "kAMDRestoreContainerFailedError", "Could not restore the application container." }, { "kAMDSUFirmwareError", "Could not flash the firmware." }, { "kAMDSUPatchError", "Could not patch the file." }, { "kAMDSUVerificationError", "The software update package could not be verified." }, { "kAMDSavePairRecordFailedError", "Could not save the pairing record." }, { "kAMDSeatbeltProfileRemovalFailedError", "Could not remove the application seatbelt profile." }, { "kAMDSendMessageError", "Could not send a message to the device." }, { "kAMDServiceLimitError", "Too many instances of this service are already running." }, { "kAMDServiceProhibitedError", "The service could not be started on the device." }, { "kAMDSessionActiveError", "The session is active." }, { "kAMDSessionInactiveError", "The session is inactive." }, { "kAMDSetProhibitedError", "Cannot set value on device." }, { "kAMDStageCreationFailedError", "Could not create the staging directory." }, { "kAMDStartServiceError", "The service could not be started." }, { "kAMDSuccess", "There was no error." }, { "kAMDSymlinkFailedError", "Could not create the symlink." }, { "kAMDTimeOutError", "The operation timed out." }, { "kAMDTooBigError", "The message is too big." }, { "kAMDUndefinedError", "An unknown error occurred." }, { "kAMDUninstallProhibitedError", "Uninstallation of apps is prohibited by a policy on the device." }, { "kAMDUnknownCommandError", "The device does not recognise the command." }, { "kAMDUnknownPacketError", "The packet is unknown." }, { "kAMDUnsupportedError", "This operation is unsupported." }, { "kAMDUserDeniedPairingError", "The device rejected the pairing attempt." }, { "kAMDWriteError", "Could not write to the device." }, { "kAMDWrongDroidError", "The device is in recovery mode." }, { "kAMDiTunesArtworkCaptureFailedError", "Could not save the iTunes artwork." }, { "kAMDiTunesMetadataCaptureFailedError", "Could not save the iTunes metadata." }, }; const int error_id_to_message_count = sizeof(error_id_to_message) / sizeof(error_id_to_message_t); const char* get_error_message(unsigned int error) { const char* id = NULL; // Lookup error localization id for (int i = 0; i < errorcode_to_id_count; i++) { if (errorcode_to_id[i].error == error) { id = errorcode_to_id[i].id; break; } } // Lookup error message if (id) { for (int i = 0; i < error_id_to_message_count; i++) if (strcmp(error_id_to_message[i].id, id) == 0) return error_id_to_message[i].message; } // If message is not found, then at least return id if it was found, otherwise NULL return id; };