void BootloaderInstallMi4::installStage2(void) { emit logItem(tr("Installing Rockbox bootloader"), LOGINFO); QCoreApplication::processEvents(); // move old bootloader out of the way QString fwfile(resolvePathCase(m_blfile)); QFile oldbl(fwfile); QString moved = QFileInfo(resolvePathCase(m_blfile)).absolutePath() + "/OF.mi4"; if(!QFileInfo(moved).exists()) { qDebug() << "[BootloaderInstallMi4] renaming" << fwfile << "to" << moved; oldbl.rename(moved); } else { qDebug() << "[BootloaderInstallMi4] OF.mi4 already present, not renaming again."; oldbl.remove(); } // place new bootloader m_tempfile.open(); qDebug() << "[BootloaderInstallMi4] renaming" << m_tempfile.fileName() << "to" << fwfile; m_tempfile.close(); m_tempfile.rename(fwfile); emit logItem(tr("Bootloader successful installed"), LOGOK); logInstall(LogAdd); emit done(false); }
bool BootloaderInstallMi4::uninstall(void) { qDebug() << "[BootloaderInstallMi4] Uninstalling bootloader"; // check if it's actually a Rockbox bootloader emit logItem(tr("Checking for Rockbox bootloader"), LOGINFO); if(installed() != BootloaderRockbox) { emit logItem(tr("No Rockbox bootloader found"), LOGERROR); return false; } // check if OF file present emit logItem(tr("Checking for original firmware file"), LOGINFO); QString original = QFileInfo(Utils::resolvePathCase(m_blfile)).absolutePath() + "/OF.mi4"; if(Utils::resolvePathCase(original).isEmpty()) { emit logItem(tr("Error finding original firmware file"), LOGERROR); return false; } // finally remove RB bootloader QString resolved = Utils::resolvePathCase(m_blfile); QFile blfile(resolved); blfile.remove(); QFile::rename(Utils::resolvePathCase(original), m_blfile); emit logItem(tr("Rockbox bootloader successful removed"), LOGINFO); logInstall(LogRemove); emit done(false); return true; }
bool BootloaderInstallHex::uninstall(void) { emit logItem(tr("Uninstallation not possible, only installation info removed"), LOGINFO); logInstall(LogRemove); emit done(true); return false; }
bool BootloaderInstallAms::uninstall(void) { emit logItem(tr("To uninstall, perform a normal upgrade with an unmodified " "original firmware"), LOGINFO); logInstall(LogRemove); return false; }
bool BootloaderInstallFile::uninstall(void) { qDebug() << "[BootloaderInstallFile] Uninstalling bootloader"; emit logItem(tr("Removing Rockbox bootloader"), LOGINFO); // check if a .ORIG file is present, and allow moving it back. QString origbl = Utils::resolvePathCase(m_blfile + ".ORIG"); if(origbl.isEmpty()) { emit logItem(tr("No original firmware file found."), LOGERROR); emit done(true); return false; } QString fwfile = Utils::resolvePathCase(m_blfile); if(!QFile::remove(fwfile)) { emit logItem(tr("Can't remove Rockbox bootloader file."), LOGERROR); emit done(true); return false; } if(!QFile::rename(origbl, fwfile)) { emit logItem(tr("Can't restore bootloader file."), LOGERROR); emit done(true); return false; } emit logItem(tr("Original bootloader restored successfully."), LOGOK); logInstall(LogRemove); emit done(false); return true; }
void BootloaderInstallFile::installStage2(void) { emit logItem(tr("Installing Rockbox bootloader"), LOGINFO); QCoreApplication::processEvents(); // if an old bootloader is present (Gigabeat) move it out of the way. QString fwfile(Utils::resolvePathCase(m_blfile)); if(!fwfile.isEmpty()) { QString moved = Utils::resolvePathCase(m_blfile) + ".ORIG"; qDebug() << "[BootloaderInstallFile] renaming" << fwfile << "to" << moved; QFile::rename(fwfile, moved); } // if no old file found resolve path without basename QFileInfo fi(m_blfile); QString absPath = Utils::resolvePathCase(fi.absolutePath()); // if it's not possible to locate the base path try to create it if(absPath.isEmpty()) { QStringList pathElements = m_blfile.split("/"); // remove filename from list and save last path element pathElements.removeLast(); QString lastElement = pathElements.last(); // remove last path element for base pathElements.removeLast(); QString basePath = pathElements.join("/"); // check for base and bail out if not found. Otherwise create folder. absPath = Utils::resolvePathCase(basePath); QDir d(absPath); d.mkpath(lastElement); absPath = Utils::resolvePathCase(fi.absolutePath()); if(absPath.isEmpty()) { emit logItem(tr("Error accessing output folder"), LOGERROR); emit done(true); return; } } fwfile = absPath + "/" + fi.fileName(); // place (new) bootloader m_tempfile.open(); qDebug() << "[BootloaderInstallFile] renaming" << m_tempfile.fileName() << "to" << fwfile; m_tempfile.close(); m_tempfile.copy(fwfile); emit logItem(tr("Bootloader successful installed"), LOGOK); logInstall(LogAdd); emit done(false); }
void BootloaderInstallMi4::installStage2(void) { emit logItem(tr("Installing Rockbox bootloader"), LOGINFO); QCoreApplication::processEvents(); // move old bootloader out of the way QString fwfile(Utils::resolvePathCase(m_blfile)); QFile oldbl(fwfile); QString moved = QFileInfo(Utils::resolvePathCase(m_blfile)).absolutePath() + "/OF.mi4"; if(!QFileInfo(moved).exists()) { LOG_INFO() << "renaming" << fwfile << "to" << moved; oldbl.rename(moved); } else { LOG_INFO() << "OF.mi4 already present, not renaming again."; oldbl.remove(); } // place new bootloader m_tempfile.open(); LOG_INFO() << "renaming" << m_tempfile.fileName() << "to" << fwfile; m_tempfile.close(); if(!Utils::resolvePathCase(fwfile).isEmpty()) { emit logItem(tr("A firmware file is already present on player"), LOGERROR); emit done(true); return; } if(m_tempfile.copy(fwfile)) { emit logItem(tr("Bootloader successful installed"), LOGOK); } else { emit logItem(tr("Copying modified firmware file failed"), LOGERROR); emit done(true); return; } emit logItem(tr("Bootloader successful installed"), LOGOK); logInstall(LogAdd); emit done(false); }
void BootloaderInstallHex::installStage2(void) { emit logItem(tr("Adding bootloader to firmware file"), LOGINFO); QCoreApplication::processEvents(); // local temp file QTemporaryFile tempbin; tempbin.open(); QString tempbinName = tempbin.fileName(); tempbin.close(); // get temporary files filenames -- external tools need this. m_descrambled.open(); QString descrambledName = m_descrambled.fileName(); m_descrambled.close(); m_tempfile.open(); QString tempfileName = m_tempfile.fileName(); m_tempfile.close(); int origin = 0; switch(m_model) { case 3: origin = 0x3f0000; break; case 2: case 1: origin = 0x1f0000; break; default: origin = 0; break; } // iriver decode already done in stage 1 int result; if((result = mkboot_iriver(descrambledName.toLocal8Bit().constData(), tempfileName.toLocal8Bit().constData(), tempbinName.toLocal8Bit().constData(), origin)) < 0) { QString error; switch(result) { case -1: error = tr("could not open input file"); break; case -2: error = tr("reading header failed"); break; case -3: error = tr("reading firmware failed"); break; case -4: error = tr("can't open bootloader file"); break; case -5: error = tr("reading bootloader file failed"); break; case -6: error = tr("can't open output file"); break; case -7: error = tr("writing output file failed"); break; } emit logItem(tr("Error in patching: %1").arg(error), LOGERROR); emit done(true); return; } QTemporaryFile targethex; targethex.open(); QString targethexName = targethex.fileName(); if((result = iriver_encode(tempbinName.toLocal8Bit().constData(), targethexName.toLocal8Bit().constData(), FALSE)) < 0) { emit logItem(tr("Error in scramble: %1").arg(scrambleError(result)), LOGERROR); targethex.close(); emit done(true); return; } // finally check the md5sum of the created file QByteArray filedata; filedata = targethex.readAll(); targethex.close(); QString hash = QCryptographicHash::hash(filedata, QCryptographicHash::Md5).toHex(); qDebug() << "[BootloaderInstallHex] created hexfile hash:" << hash; emit logItem(tr("Checking modified firmware file"), LOGINFO); if(hash != QString(md5sums[m_hashindex].patched)) { emit logItem(tr("Error: modified file checksum wrong"), LOGERROR); targethex.remove(); emit done(true); return; } // finally copy file to player targethex.copy(m_blfile); emit logItem(tr("Success: modified firmware file created"), LOGINFO); logInstall(LogAdd); emit done(false); return; }
void BootloaderInstallAms::installStage2(void) { qDebug() << "[BootloaderInstallAms] installStage2"; unsigned char* buf; unsigned char* of_packed; int of_packedsize; unsigned char* rb_packed; int rb_packedsize; off_t len; struct md5sums sum; char md5sum[33]; /* 32 hex digits, plus terminating zero */ int n; int firmware_size; int bootloader_size; int patchable; int totalsize; char errstr[200]; sum.md5 = md5sum; m_tempfile.open(); QString bootfile = m_tempfile.fileName(); m_tempfile.close(); /* Load original firmware file */ buf = load_of_file(m_offile.toLocal8Bit().data(), &len,&sum,&firmware_size, &of_packed,&of_packedsize,errstr,sizeof(errstr)); if (buf == NULL) { qDebug() << "[BootloaderInstallAms] could not load OF: " << m_offile; emit logItem(errstr, LOGERROR); emit logItem(tr("Could not load %1").arg(m_offile), LOGERROR); emit done(true); return; } /* Load bootloader file */ rb_packed = load_rockbox_file(bootfile.toLocal8Bit().data(), sum.model, &bootloader_size,&rb_packedsize, errstr,sizeof(errstr)); if (rb_packed == NULL) { qDebug() << "[BootloaderInstallAms] could not load bootloader: " << bootfile; emit logItem(errstr, LOGERROR); emit logItem(tr("Could not load %1").arg(bootfile), LOGERROR); free(buf); free(of_packed); emit done(true); return; } /* check total size */ patchable = check_sizes(sum.model, rb_packedsize, bootloader_size, of_packedsize, firmware_size, &totalsize, errstr, sizeof(errstr)); if (!patchable) { qDebug() << "[BootloaderInstallAms] No room to insert bootloader"; emit logItem(errstr, LOGERROR); emit logItem(tr("No room to insert bootloader, try another firmware version"), LOGERROR); free(buf); free(of_packed); free(rb_packed); emit done(true); return; } /* patch the firmware */ emit logItem(tr("Patching Firmware..."), LOGINFO); patch_firmware(sum.model,firmware_revision(sum.model),firmware_size,buf, len,of_packed,of_packedsize,rb_packed,rb_packedsize); /* write out file */ QFile out(m_blfile); if(!out.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug() << "[BootloaderInstallAms] Could not open" << m_blfile << "for writing"; emit logItem(tr("Could not open %1 for writing").arg(m_blfile),LOGERROR); free(buf); free(of_packed); free(rb_packed); emit done(true); return; } n = out.write((char*)buf, len); if (n != len) { qDebug() << "[BootloaderInstallAms] Could not write firmware file"; emit logItem(tr("Could not write firmware file"),LOGERROR); free(buf); free(of_packed); free(rb_packed); emit done(true); return; } out.close(); free(buf); free(of_packed); free(rb_packed); //end of install qDebug() << "[BootloaderInstallAms] install successfull"; emit logItem(tr("Success: modified firmware file created"), LOGINFO); logInstall(LogAdd); emit done(false); return; }
void BootloaderInstallTcc::installStage2(void) { unsigned char *of_buf, *boot_buf = NULL, *patched_buf = NULL; int n, of_size, boot_size, patched_size; char errstr[200]; bool ret = false; m_tempfile.open(); QString bootfile = m_tempfile.fileName(); m_tempfile.close(); /* Construct path for write out. * Combine path of m_blfile with filename from OF */ QString outfilename = QFileInfo(m_blfile).absolutePath() + "/" + QFileInfo(m_offile).fileName(); /* Write out file */ QFile out(outfilename); /* Load original firmware file */ of_buf = file_read(m_offile.toLocal8Bit().data(), &of_size); if (of_buf == NULL) { emit logItem(errstr, LOGERROR); emit logItem(tr("Could not load %1").arg(m_offile), LOGERROR); goto exit; } /* A CRC test in order to reject non OF file */ if (test_firmware_tcc(of_buf, of_size)) { emit logItem(errstr, LOGERROR); emit logItem(tr("Unknown OF file used: %1").arg(m_offile), LOGERROR); goto exit; } /* Load bootloader file */ boot_buf = file_read(bootfile.toLocal8Bit().data(), &boot_size); if (boot_buf == NULL) { emit logItem(errstr, LOGERROR); emit logItem(tr("Could not load %1").arg(bootfile), LOGERROR); goto exit; } /* Patch the firmware */ emit logItem(tr("Patching Firmware..."), LOGINFO); patched_buf = patch_firmware_tcc(of_buf, of_size, boot_buf, boot_size, &patched_size); if (patched_buf == NULL) { emit logItem(errstr, LOGERROR); emit logItem(tr("Could not patch firmware"), LOGERROR); goto exit; } if(!out.open(QIODevice::WriteOnly | QIODevice::Truncate)) { emit logItem(tr("Could not open %1 for writing").arg(m_blfile), LOGERROR); goto exit; } n = out.write((char*)patched_buf, patched_size); out.close(); if (n != patched_size) { emit logItem(tr("Could not write firmware file"), LOGERROR); goto exit; } /* End of install */ emit logItem(tr("Success: modified firmware file created"), LOGINFO); logInstall(LogAdd); ret = true; exit: if (of_buf) free(of_buf); if (boot_buf) free(boot_buf); if (patched_buf) free(patched_buf); emit done(ret); }