void recovery_progress_callback(unsigned int progress_number, unsigned int opcode) { fprintf(stderr, "Recovery progress callback...\n"); if (opcode == 9) { sendCommandToDevice(g_recoveryDevice, CFSTR("setenv boot-args rd=md0 -v")); } }
int recovery_serial(string *args, struct shell_state *sh) { ifNotQuiet cout << "Restarting in serial mode." << endl; D("bgcolor 255 255 0"); sendCommandToDevice(sh->recovery_dev, CFSTR("bgcolor 255 255 0")); D("setenv debug-uarts 1"); sendCommandToDevice(sh->recovery_dev, CFSTR("setenv debug-uarts 1")); D("saveenv"); sendCommandToDevice(sh->recovery_dev, CFSTR("saveenv")); D("reboot"); sendCommandToDevice(sh->recovery_dev, CFSTR("reboot")); //im ASSUMING we dont want to kill the app here, but that we want to // at least exit recovery mode (?) ifNotQuiet cout << "Please restart iPHUC or reconnect in order to issue serial commands." << endl; return SHELL_CONTINUE; }
void recovery_connect_callback(am_recovery_device *rdev) { Status = RecoveryConnected; XLOG(3, "device connected in recovery mode"); if(Stage == 2) { fprintf(stdout, "Sorry, but you did not follow the instructions correctly. Please try again.\n"); cleanup_and_exit(); } else if(Stage != 3) { return; } XLOG(3, "sendCommandToDevice(setenv auto-boot) returned: %d", sendCommandToDevice(rdev, CFSTR("setenv auto-boot true"), 0)); XLOG(3, "sendCommandToDevice(saveenv) returned: %d", sendCommandToDevice(rdev, CFSTR("saveenv"), 0)); XLOG(3, "sendCommandToDevice(setenv idle-off) returned: %d", sendCommandToDevice(rdev, CFSTR("setenv idle-off false"), 0)); XLOG(3, "sendFileToDevice(bootimage) returned: %d", sendFileToDevice(rdev, CFStringCreateWithCString(NULL, bootImagePath, kCFStringEncodingASCII))); XLOG(3, "sendCommandToDevice(setpicture) returned: %d", sendCommandToDevice(rdev, CFSTR("setpicture 0"), 0)); XLOG(3, "sendCommandToDevice(bgcolor) returned: %d", sendCommandToDevice(rdev, CFSTR("bgcolor 0 0 0"), 0)); fprintf(stdout, "Please use iTunes to restore your iPhone/iPod with a custom IPSW now. You may now let go of the home button.\n"); fflush(stdout); cleanup_and_exit(); }
void serverCommand(char *str) { char *header = strtok(str, ":"); char *content = strtok(NULL, ":"); for (int i = 0; i < SIZE_OF_ARRY2(IdDevice); ++i) { if(IdDevice[i][0]) // check if IdDevice[i][0] is not NULL if(strcmp(header, IdDevice[i][0])==0) { // printf("header: %s, IdDevice: %s, content: %s\n", header, IdDevice[i][1], content); if(IdDevice[i][2]!=NULL) // check if has device sendCommandToDevice(i, content); else printf("- There is no device: \"%s\"\n", IdDevice[i][0]); // break; // break when u just wanna send to one device } } }
int recovery_cmd(string *args, struct shell_state *sh) { if ( args[1] == "" ) { ifNotQuiet cout << "Please provide a command to send to the phone." << endl; return SHELL_CONTINUE; } mach_error_t retval = sendCommandToDevice( sh->recovery_dev, CFStringCreateWithCString(NULL, args[1].c_str(), kCFStringEncodingASCII) ); ifVerbose cout << "cmd: " << args[1] << ": " << retval << endl; return SHELL_CONTINUE; }
int recovery_grestore(string *args, struct shell_state *sh) { int ret; if (args[1] == "") { ifNotQuiet cout << "args[1] must be RestoreBundlePath" << endl; return SHELL_CONTINUE; } // check for trailing / if ( args[1].at(args[1].length() - 1) != '/' ) args[1] = args[1] + '/'; // firmware 1.0 // string temp = args[1] + "694-5259-38.dmg"; // firmware 1.0.1 // string temp = args[1] + "009-7662-6.dmg"; // firmware 1.0.2 string temp = args[1] + "009-7698-4.dmg"; // firmware 1.1.1? // string temp = args[1] + "022-3629-9.dmg"; ifNotQuiet cout << "Entering G-Restore ... " << endl; // Send ramdisk to the phone ifVerbose cout << "Sending ramdisk '"<< temp << "'" << endl; CFStringRef ramdisk = CFStringCreateWithCString(kCFAllocatorDefault, temp.c_str(), kCFStringEncodingMacRoman); ret = sendFileToDevice(sh->recovery_dev, ramdisk); CFRelease(ramdisk); ifVerbose cout << "sendFileToDevice: " << ret << endl; if (ret != 0) { ifNotQuiet cout << "Send ramdisk failed. Aborting." << endl; return SHELL_CONTINUE; } // load ramdisk on the phone ifVerbose cout << "Loading ramdisk." << endl; ret = sendCommandToDevice(sh->recovery_dev, CFSTR("ramdisk")); ifVerbose cout << "sendCommandToDevice 'ramdisk': " << ret << endl; if (ret != 0) { ifNotQuiet cout << "Load ramdisk failed. Aborting." << endl; return SHELL_CONTINUE; } // firmware 1.0 // temp = args[1] + "kernelcache.restore.release.s5l8900xrb"; // firmware 1.0.1, 1.0.2, 1.1.1 temp = args[1]+ "kernelcache.release.s5l8900xrb"; // Send the kernelcache ifVerbose cout << "Sending kernelcache '"<< temp << "'" << endl; CFStringRef kerncache = CFStringCreateWithCString(kCFAllocatorDefault, temp.c_str(), kCFStringEncodingMacRoman); ret = sendFileToDevice(sh->recovery_dev, kerncache); CFRelease(kerncache); ifVerbose cout << "sendFileToDevice: " << ret << endl; if (ret != 0) { ifNotQuiet cout << "Send kernelcache failed. Aborting." << endl; return SHELL_CONTINUE; } //check for custom bootargs if( args[2] != "" ) D("grestore does not yet except custom bootargs."); ifVerbose cout << "Setting bootargs: setenv boot-args rd=md0 -v" << endl; ret = sendCommandToDevice(sh->recovery_dev, CFSTR("setenv boot-args rd=md0 -v")); ifVerbose cout << "sendCommandToDevice: " << ret << endl; if (ret != 0) { ifNotQuiet cout << "Setevn command failed. Aborting." << endl; return SHELL_CONTINUE; } ifVerbose cout << "Loading kernelcache (command: bootx)" << endl; ret = sendCommandToDevice(sh->recovery_dev, CFSTR("bootx")); ifVerbose cout << "sendCommandToDevice: " << ret << endl; if (ret != 0) { ifNotQuiet cout << "failed (" << ret << ") Aborting." << endl; return SHELL_CONTINUE; } ifNotQuiet cout << "G-Restore Completed. \nExit iPHUC or reconnect in order to continue in restore mode." << endl; return SHELL_CONTINUE; }
QVariantMap ServerCore::prepareDataForDevice(const QJsonObject& cmdObj) { QString command = cmdObj[JSON_KEY_COMMAND].toString(); QVariantMap retMap; bool isFail = false; if (command == SERVER_CMD_LIST_DEVICES) { QJsonArray devArray; for (QString uid : DeviceManagerModule()->GetDeviceUIDs()) { QJsonObject devObj; devObj.insert(JSON_KEY_UID, uid); QString dispName = DeviceManagerModule()->GetDeviceInfo(uid).getName(); QString ip = DeviceManagerModule()->GetDeviceInfo(uid).getIP(); devObj.insert(JSON_KEY_DISPLAYNAME, dispName); devObj.insert(JSON_KEY_IP, ip); devArray.append(devObj); } retMap.insert(JSON_KEY_RETURN_TYPE, (int)TCP_REPLY_TYPE::QUERY_DEVICES); retMap.insert(JSON_KEY_DEVICES, devArray); } else if (command == SERVER_CMD_LIST_COMMANDS) { QJsonArray devArray; QString uid = cmdObj[JSON_KEY_UID].toString(); if (!DeviceManagerModule()->HasDevice(uid)) { isFail = true; } for (QString devCommand : DeviceManagerModule()->GetDeviceInfo(uid).getSupportCommands()) { QJsonObject devObj; devObj.insert(JSON_KEY_DEVICECMD, devCommand); QString dispName = DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getCommandDisplayName(); int paramType = (int)DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getParamType(); QString paramMin = DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getParamMin(); QString paramMax = DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCommand).getParamMax(); devObj.insert(JSON_KEY_CMD_DISPLAYNAME, dispName); devObj.insert(JSON_KEY_PARAM_TYPE, paramType); devObj.insert(JSON_KEY_PARAM_MIN, paramMin); devObj.insert(JSON_KEY_PARAM_MAX, paramMax); devArray.append(devObj); } retMap.insert(JSON_KEY_RETURN_TYPE, (int)TCP_REPLY_TYPE::QUERY_COMMANDS); retMap.insert(JSON_KEY_SUPPORTCMDS, devArray); } else if (command == SERVER_CMD_SEND_CMD_TO_DEVICE) { QString uid = cmdObj[JSON_KEY_UID].toString(); QString devCmd = cmdObj[JSON_KEY_DEVICECMD].toString(); retMap.insert(JSON_KEY_RETURN_TYPE, (int)TCP_REPLY_TYPE::FORWARD_COMMAND_TO_DEVICE); if (!DeviceManagerModule()->HasDevice(uid)) { isFail = true; } if (!isFail && !DeviceManagerModule()->GetDeviceInfo(uid).isSupportedCommand(devCmd)) { isFail = true; } QString cmdParam = cmdObj[JSON_KEY_PARAM].toString(); if (!isFail && !DeviceManagerModule()->GetDeviceInfo(uid).getDeviceCommandDetail(devCmd).isValidParam(cmdParam)) { isFail = true; } if (!isFail) { QVariantMap cmdMap; cmdMap.insert(JSON_KEY_COMMAND, devCmd); cmdMap.insert(JSON_KEY_PARAM, cmdParam); cmdMap.insert(JSON_KEY_SEQ, 1234); sendCommandToDevice(uid, cmdMap); } } else { isFail = true; } retMap.insert(JSON_KEY_STATUS, ((isFail) ? STATUS_FAIL : STATUS_SUCCESSFUL)); return retMap; }