More user friendly error messages.
This commit is contained in:
		
							
								
								
									
										358
									
								
								errors.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								errors.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,358 @@ | |||||||
|  |  | ||||||
|  | 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; | ||||||
|  | }; | ||||||
							
								
								
									
										91
									
								
								ios-deploy.c
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								ios-deploy.c
									
									
									
									
									
								
							| @@ -14,7 +14,9 @@ | |||||||
| #include <pwd.h> | #include <pwd.h> | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <netinet/tcp.h> | #include <netinet/tcp.h> | ||||||
|  |  | ||||||
| #include "MobileDevice.h" | #include "MobileDevice.h" | ||||||
|  | #include "errors.h" | ||||||
|  |  | ||||||
| #define APP_VERSION    "1.6.1" | #define APP_VERSION    "1.6.1" | ||||||
| #define PREP_CMDS_PATH "/tmp/fruitstrap-lldb-prep-cmds-" | #define PREP_CMDS_PATH "/tmp/fruitstrap-lldb-prep-cmds-" | ||||||
| @@ -183,6 +185,17 @@ AMDeviceRef best_device_match = NULL; | |||||||
| const int exitcode_error = 253; | const int exitcode_error = 253; | ||||||
| const int exitcode_app_crash = 254; | const int exitcode_app_crash = 254; | ||||||
|  |  | ||||||
|  | // Checks for MobileDevice.framework errors, tries to print them and exits. | ||||||
|  | #define check_error(call)                                                       \ | ||||||
|  |     do {                                                                        \ | ||||||
|  |         unsigned int err = (unsigned int)call;                                  \ | ||||||
|  |         if (err != 0)                                                           \ | ||||||
|  |         {                                                                       \ | ||||||
|  |             const char* msg = get_error_message(err);                           \ | ||||||
|  |             on_error("Error 0x%x: %s " #call, err, msg ? msg : "unknown.");     \ | ||||||
|  |         }                                                                       \ | ||||||
|  |     } while (false); | ||||||
|  |  | ||||||
| // Print error message and exit | // Print error message and exit | ||||||
| void on_error(const char* fmt, ...) { | void on_error(const char* fmt, ...) { | ||||||
|     char buf[256]; |     char buf[256]; | ||||||
| @@ -674,8 +687,7 @@ CFURLRef copy_device_app_url(AMDeviceRef device, CFStringRef identifier) { | |||||||
|     NSDictionary *optionsDict = [NSDictionary dictionaryWithObject:a forKey:@"ReturnAttributes"]; |     NSDictionary *optionsDict = [NSDictionary dictionaryWithObject:a forKey:@"ReturnAttributes"]; | ||||||
| 	CFDictionaryRef options = (CFDictionaryRef)optionsDict; | 	CFDictionaryRef options = (CFDictionaryRef)optionsDict; | ||||||
|  |  | ||||||
|     afc_error_t resultStatus = AMDeviceLookupApplications(device, options, &result); |     check_error(AMDeviceLookupApplications(device, options, &result)); | ||||||
|     assert(resultStatus == 0); |  | ||||||
|  |  | ||||||
|     CFDictionaryRef app_dict = CFDictionaryGetValue(result, identifier); |     CFDictionaryRef app_dict = CFDictionaryGetValue(result, identifier); | ||||||
|     assert(app_dict != NULL); |     assert(app_dict != NULL); | ||||||
| @@ -877,8 +889,7 @@ void fdvendor_callback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataR | |||||||
|  |  | ||||||
| void start_remote_debug_server(AMDeviceRef device) { | void start_remote_debug_server(AMDeviceRef device) { | ||||||
|  |  | ||||||
|     int res = AMDeviceStartService(device, CFSTR("com.apple.debugserver"), &gdbfd, NULL); |     check_error(AMDeviceStartService(device, CFSTR("com.apple.debugserver"), &gdbfd, NULL)); | ||||||
|     assert(res == 0); |  | ||||||
|     assert(gdbfd > 0); |     assert(gdbfd > 0); | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
| @@ -907,7 +918,7 @@ void start_remote_debug_server(AMDeviceRef device) { | |||||||
|     CFSocketSetAddress(fdvendor, address_data); |     CFSocketSetAddress(fdvendor, address_data); | ||||||
|     CFRelease(address_data); |     CFRelease(address_data); | ||||||
|     socklen_t addrlen = sizeof(addr4); |     socklen_t addrlen = sizeof(addr4); | ||||||
|     res = getsockname(CFSocketGetNative(fdvendor),(struct sockaddr *)&addr4,&addrlen); |     int res = getsockname(CFSocketGetNative(fdvendor),(struct sockaddr *)&addr4,&addrlen); | ||||||
|     assert(res == 0); |     assert(res == 0); | ||||||
|     port = ntohs(addr4.sin_port); |     port = ntohs(addr4.sin_port); | ||||||
|  |  | ||||||
| @@ -989,8 +1000,8 @@ void setup_lldb(AMDeviceRef device, CFURLRef url) { | |||||||
|  |  | ||||||
|     AMDeviceConnect(device); |     AMDeviceConnect(device); | ||||||
|     assert(AMDeviceIsPaired(device)); |     assert(AMDeviceIsPaired(device)); | ||||||
|     assert(AMDeviceValidatePairing(device) == 0); |     check_error(AMDeviceValidatePairing(device)); | ||||||
|     assert(AMDeviceStartSession(device) == 0); |     check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|     printf("------ Debug phase ------\n"); |     printf("------ Debug phase ------\n"); | ||||||
|  |  | ||||||
| @@ -1210,8 +1221,8 @@ void read_dir(service_conn_t afcFd, afc_connection* afc_conn_p, const char* dir, | |||||||
| service_conn_t start_house_arrest_service(AMDeviceRef device) { | service_conn_t start_house_arrest_service(AMDeviceRef device) { | ||||||
|     AMDeviceConnect(device); |     AMDeviceConnect(device); | ||||||
|     assert(AMDeviceIsPaired(device)); |     assert(AMDeviceIsPaired(device)); | ||||||
|     assert(AMDeviceValidatePairing(device) == 0); |     check_error(AMDeviceValidatePairing(device)); | ||||||
|     assert(AMDeviceStartSession(device) == 0); |     check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|     service_conn_t houseFd; |     service_conn_t houseFd; | ||||||
|  |  | ||||||
| @@ -1227,8 +1238,8 @@ service_conn_t start_house_arrest_service(AMDeviceRef device) { | |||||||
|         exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     assert(AMDeviceStopSession(device) == 0); |     check_error(AMDeviceStopSession(device)); | ||||||
|     assert(AMDeviceDisconnect(device) == 0); |     check_error(AMDeviceDisconnect(device)); | ||||||
|     CFRelease(cf_bundle_id); |     CFRelease(cf_bundle_id); | ||||||
|  |  | ||||||
|     return houseFd; |     return houseFd; | ||||||
| @@ -1291,8 +1302,8 @@ int app_exists(AMDeviceRef device) | |||||||
|  |  | ||||||
|     AMDeviceConnect(device); |     AMDeviceConnect(device); | ||||||
|     assert(AMDeviceIsPaired(device)); |     assert(AMDeviceIsPaired(device)); | ||||||
|     assert(AMDeviceValidatePairing(device) == 0); |     check_error(AMDeviceValidatePairing(device)); | ||||||
|     assert(AMDeviceStartSession(device) == 0); |     check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|     CFStringRef cf_bundle_id = CFStringCreateWithCString(NULL, bundle_id, kCFStringEncodingASCII); |     CFStringRef cf_bundle_id = CFStringCreateWithCString(NULL, bundle_id, kCFStringEncodingASCII); | ||||||
|  |  | ||||||
| @@ -1301,8 +1312,7 @@ int app_exists(AMDeviceRef device) | |||||||
|     CFDictionaryRef options = (CFDictionaryRef)optionsDict; |     CFDictionaryRef options = (CFDictionaryRef)optionsDict; | ||||||
|  |  | ||||||
|     CFDictionaryRef result = nil; |     CFDictionaryRef result = nil; | ||||||
|     afc_error_t resultStatus = AMDeviceLookupApplications(device, options, &result); |     check_error(AMDeviceLookupApplications(device, options, &result)); | ||||||
|     assert(resultStatus == 0); |  | ||||||
|  |  | ||||||
|     CFDictionaryRef app_dict = CFDictionaryGetValue(result, cf_bundle_id); |     CFDictionaryRef app_dict = CFDictionaryGetValue(result, cf_bundle_id); | ||||||
|  |  | ||||||
| @@ -1310,8 +1320,8 @@ int app_exists(AMDeviceRef device) | |||||||
|  |  | ||||||
|     CFRelease(cf_bundle_id); |     CFRelease(cf_bundle_id); | ||||||
|  |  | ||||||
|     assert(AMDeviceStopSession(device) == 0); |     check_error(AMDeviceStopSession(device)); | ||||||
|     assert(AMDeviceDisconnect(device) == 0); |     check_error(AMDeviceDisconnect(device)); | ||||||
|  |  | ||||||
|     return appExists; |     return appExists; | ||||||
| } | } | ||||||
| @@ -1443,7 +1453,7 @@ void upload_file(AMDeviceRef device) { | |||||||
|             c++; |             c++; | ||||||
|         } |         } | ||||||
|         *lastSlash = '\0'; |         *lastSlash = '\0'; | ||||||
|         assert(AFCDirectoryCreate(afc_conn_p, dirpath) == 0); |         check_error(AFCDirectoryCreate(afc_conn_p, dirpath)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1511,8 +1521,8 @@ void uninstall_app(AMDeviceRef device) { | |||||||
|     } else { |     } else { | ||||||
|         AMDeviceConnect(device); |         AMDeviceConnect(device); | ||||||
|         assert(AMDeviceIsPaired(device)); |         assert(AMDeviceIsPaired(device)); | ||||||
|         assert(AMDeviceValidatePairing(device) == 0); |         check_error(AMDeviceValidatePairing(device)); | ||||||
|         assert(AMDeviceStartSession(device) == 0); |         check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|         int code = AMDeviceSecureUninstallApplication(0, device, cf_uninstall_bundle_id, 0, NULL, 0); |         int code = AMDeviceSecureUninstallApplication(0, device, cf_uninstall_bundle_id, 0, NULL, 0); | ||||||
|         if (code == 0) { |         if (code == 0) { | ||||||
| @@ -1520,8 +1530,8 @@ void uninstall_app(AMDeviceRef device) { | |||||||
|         } else { |         } else { | ||||||
|             printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(cf_uninstall_bundle_id, CFStringGetSystemEncoding())); |             printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(cf_uninstall_bundle_id, CFStringGetSystemEncoding())); | ||||||
|         } |         } | ||||||
|         assert(AMDeviceStopSession(device) == 0); |         check_error(AMDeviceStopSession(device)); | ||||||
|         assert(AMDeviceDisconnect(device) == 0); |         check_error(AMDeviceDisconnect(device)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1597,8 +1607,8 @@ void handle_device(AMDeviceRef device) { | |||||||
|         } else { |         } else { | ||||||
|             AMDeviceConnect(device); |             AMDeviceConnect(device); | ||||||
|             assert(AMDeviceIsPaired(device)); |             assert(AMDeviceIsPaired(device)); | ||||||
|             assert(AMDeviceValidatePairing(device) == 0); |             check_error(AMDeviceValidatePairing(device)); | ||||||
|             assert(AMDeviceStartSession(device) == 0); |             check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|             int code = AMDeviceSecureUninstallApplication(0, device, cf_uninstall_bundle_id, 0, NULL, 0); |             int code = AMDeviceSecureUninstallApplication(0, device, cf_uninstall_bundle_id, 0, NULL, 0); | ||||||
|             if (code == 0) { |             if (code == 0) { | ||||||
| @@ -1606,8 +1616,8 @@ void handle_device(AMDeviceRef device) { | |||||||
|             } else { |             } else { | ||||||
|                 printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(cf_uninstall_bundle_id, CFStringGetSystemEncoding())); |                 printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(cf_uninstall_bundle_id, CFStringGetSystemEncoding())); | ||||||
|             } |             } | ||||||
|             assert(AMDeviceStopSession(device) == 0); |             check_error(AMDeviceStopSession(device)); | ||||||
|             assert(AMDeviceDisconnect(device) == 0); |             check_error(AMDeviceDisconnect(device)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1617,22 +1627,22 @@ void handle_device(AMDeviceRef device) { | |||||||
|  |  | ||||||
|         AMDeviceConnect(device); |         AMDeviceConnect(device); | ||||||
|         assert(AMDeviceIsPaired(device)); |         assert(AMDeviceIsPaired(device)); | ||||||
|         assert(AMDeviceValidatePairing(device) == 0); |         check_error(AMDeviceValidatePairing(device)); | ||||||
|         assert(AMDeviceStartSession(device) == 0); |         check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|  |  | ||||||
|         // NOTE: the secure version doesn't seem to require us to start the AFC service |         // NOTE: the secure version doesn't seem to require us to start the AFC service | ||||||
|         service_conn_t afcFd; |         service_conn_t afcFd; | ||||||
|         assert(AMDeviceSecureStartService(device, CFSTR("com.apple.afc"), NULL, &afcFd) == 0); |         check_error(AMDeviceSecureStartService(device, CFSTR("com.apple.afc"), NULL, &afcFd)); | ||||||
|         assert(AMDeviceStopSession(device) == 0); |         check_error(AMDeviceStopSession(device)); | ||||||
|         assert(AMDeviceDisconnect(device) == 0); |         check_error(AMDeviceDisconnect(device)); | ||||||
|  |  | ||||||
|         CFStringRef keys[] = { CFSTR("PackageType") }; |         CFStringRef keys[] = { CFSTR("PackageType") }; | ||||||
|         CFStringRef values[] = { CFSTR("Developer") }; |         CFStringRef values[] = { CFSTR("Developer") }; | ||||||
|         CFDictionaryRef options = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); |         CFDictionaryRef options = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); | ||||||
|  |  | ||||||
|         //assert(AMDeviceTransferApplication(afcFd, path, NULL, transfer_callback, NULL) == 0); |         //assert(AMDeviceTransferApplication(afcFd, path, NULL, transfer_callback, NULL) == 0); | ||||||
|         assert(AMDeviceSecureTransferPath(0, device, url, options, transfer_callback, 0)==0); |         check_error(AMDeviceSecureTransferPath(0, device, url, options, transfer_callback, 0)); | ||||||
|  |  | ||||||
|         close(afcFd); |         close(afcFd); | ||||||
|  |  | ||||||
| @@ -1640,8 +1650,8 @@ void handle_device(AMDeviceRef device) { | |||||||
|  |  | ||||||
|         AMDeviceConnect(device); |         AMDeviceConnect(device); | ||||||
|         assert(AMDeviceIsPaired(device)); |         assert(AMDeviceIsPaired(device)); | ||||||
|         assert(AMDeviceValidatePairing(device) == 0); |         check_error(AMDeviceValidatePairing(device)); | ||||||
|         assert(AMDeviceStartSession(device) == 0); |         check_error(AMDeviceStartSession(device)); | ||||||
|  |  | ||||||
|         // // NOTE: the secure version doesn't seem to require us to start the installation_proxy service |         // // NOTE: the secure version doesn't seem to require us to start the installation_proxy service | ||||||
|         // // Although I can't find it right now, I in some code that the first param of AMDeviceSecureInstallApplication was a "dontStartInstallProxy" |         // // Although I can't find it right now, I in some code that the first param of AMDeviceSecureInstallApplication was a "dontStartInstallProxy" | ||||||
| @@ -1651,19 +1661,12 @@ void handle_device(AMDeviceRef device) { | |||||||
|         //assert(AMDeviceSecureStartService(device, CFSTR("com.apple.mobile.installation_proxy"), NULL, &installFd) == 0); |         //assert(AMDeviceSecureStartService(device, CFSTR("com.apple.mobile.installation_proxy"), NULL, &installFd) == 0); | ||||||
|  |  | ||||||
|         //mach_error_t result = AMDeviceInstallApplication(installFd, path, options, install_callback, NULL); |         //mach_error_t result = AMDeviceInstallApplication(installFd, path, options, install_callback, NULL); | ||||||
|         mach_error_t result = AMDeviceSecureInstallApplication(0, device, url, options, install_callback, 0); |         check_error(AMDeviceSecureInstallApplication(0, device, url, options, install_callback, 0)); | ||||||
|         if (result != 0) |  | ||||||
|         { |  | ||||||
|             char* error = "Unknown error."; |  | ||||||
|             if (result == 0xe8008015) |  | ||||||
|                 error = "Your application failed code-signing checks. Check your certificates, provisioning profiles, and bundle ids."; |  | ||||||
|             on_error("AMDeviceInstallApplication failed: 0x%X: %s", result, error); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // close(installFd); |         // close(installFd); | ||||||
|  |  | ||||||
|         assert(AMDeviceStopSession(device) == 0); |         check_error(AMDeviceStopSession(device)); | ||||||
|         assert(AMDeviceDisconnect(device) == 0); |         check_error(AMDeviceDisconnect(device)); | ||||||
|  |  | ||||||
|         CFRelease(path); |         CFRelease(path); | ||||||
|         CFRelease(options); |         CFRelease(options); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Julius Trinkunas
					Julius Trinkunas