diff --git a/UEFIExtract/ffsdumper.cpp b/UEFIExtract/ffsdumper.cpp index 0048fb2..05db4a8 100644 --- a/UEFIExtract/ffsdumper.cpp +++ b/UEFIExtract/ffsdumper.cpp @@ -22,10 +22,10 @@ FfsDumper::~FfsDumper() { } -STATUS FfsDumper::dump(const QModelIndex & root, const QString & path, const QString & guid) +STATUS FfsDumper::dump(const QModelIndex & root, const QString & path, const bool dumpAll, const QString & guid) { dumped = false; - UINT8 result = recursiveDump(root, path, guid); + UINT8 result = recursiveDump(root, path, dumpAll, guid); if (result) return result; else if (!dumped) @@ -33,7 +33,7 @@ STATUS FfsDumper::dump(const QModelIndex & root, const QString & path, const QSt return ERR_SUCCESS; } -STATUS FfsDumper::recursiveDump(const QModelIndex & index, const QString & path, const QString & guid) +STATUS FfsDumper::recursiveDump(const QModelIndex & index, const QString & path, const bool dumpAll, const QString & guid) { if (!index.isValid()) return ERR_INVALID_PARAMETER; @@ -50,29 +50,32 @@ STATUS FfsDumper::recursiveDump(const QModelIndex & index, const QString & path, return ERR_DIR_CREATE; QFile file; - if (!model->header(index).isEmpty()) { - file.setFileName(QObject::tr("%1/header.bin").arg(path)); - if (!file.open(QFile::WriteOnly)) - return ERR_FILE_OPEN; + if (dumpAll || model->rowCount(index) == 0) { // Dump if leaf item or dumpAll is true + if (!model->header(index).isEmpty()) { + file.setFileName(QObject::tr("%1/header.bin").arg(path)); + if (!file.open(QFile::WriteOnly)) + return ERR_FILE_OPEN; - file.write(model->header(index)); - file.close(); + file.write(model->header(index)); + file.close(); + } + + if (!model->body(index).isEmpty()) { + file.setFileName(QObject::tr("%1/body.bin").arg(path)); + if (!file.open(QFile::WriteOnly)) + return ERR_FILE_OPEN; + + file.write(model->body(index)); + file.close(); + } } - - if (!model->body(index).isEmpty()) { - file.setFileName(QObject::tr("%1/body.bin").arg(path)); - if (!file.open(QFile::WriteOnly)) - return ERR_FILE_OPEN; - - file.write(model->body(index)); - file.close(); - } - + + // Always dump info QString info = QObject::tr("Type: %1\nSubtype: %2\n%3%4\n") - .arg(itemTypeToQString(model->type(index))) - .arg(itemSubtypeToQString(model->type(index), model->subtype(index))) - .arg(model->text(index).isEmpty() ? QObject::tr("") : QObject::tr("Text: %1\n").arg(model->text(index))) - .arg(model->info(index)); + .arg(itemTypeToQString(model->type(index))) + .arg(itemSubtypeToQString(model->type(index), model->subtype(index))) + .arg(model->text(index).isEmpty() ? QObject::tr("") : QObject::tr("Text: %1\n").arg(model->text(index))) + .arg(model->info(index)); file.setFileName(QObject::tr("%1/info.txt").arg(path)); if (!file.open(QFile::Text | QFile::WriteOnly)) return ERR_FILE_OPEN; @@ -90,7 +93,7 @@ STATUS FfsDumper::recursiveDump(const QModelIndex & index, const QString & path, useText = !model->text(childIndex).isEmpty(); QString childPath = QString("%1/%2 %3").arg(path).arg(i).arg(useText ? model->text(childIndex) : model->name(childIndex)); - result = recursiveDump(childIndex, childPath, guid); + result = recursiveDump(childIndex, childPath, dumpAll, guid); if (result) return result; } diff --git a/UEFIExtract/ffsdumper.h b/UEFIExtract/ffsdumper.h index 2d485b8..11ef4e8 100644 --- a/UEFIExtract/ffsdumper.h +++ b/UEFIExtract/ffsdumper.h @@ -30,10 +30,10 @@ public: explicit FfsDumper(TreeModel * treeModel); ~FfsDumper(); - STATUS dump(const QModelIndex & root, const QString & path, const QString & guid = QString()); + STATUS dump(const QModelIndex & root, const QString & path, const bool dumpAll = false, const QString & guid = QString()); private: - STATUS recursiveDump(const QModelIndex & root, const QString & path, const QString & guid); + STATUS recursiveDump(const QModelIndex & root, const QString & path, const bool dumpAll, const QString & guid); TreeModel* model; bool dumped; }; diff --git a/UEFIExtract/uefiextract_main.cpp b/UEFIExtract/uefiextract_main.cpp index 300b035..8e8c55d 100644 --- a/UEFIExtract/uefiextract_main.cpp +++ b/UEFIExtract/uefiextract_main.cpp @@ -97,14 +97,17 @@ int main(int argc, char *argv[]) // Create ffsDumper FfsDumper ffsDumper(&model); - // Dump everyting + // Dump all non-leaf elements if (a.arguments().length() == 2) { return (ffsDumper.dump(model.index(0, 0), fileInfo.fileName().append(".dump")) != ERR_SUCCESS); } + else if (a.arguments().length() == 3 && a.arguments().at(2) == QString("all")) { // Dump everything + return (ffsDumper.dump(model.index(0, 0), fileInfo.fileName().append(".dump"), true) != ERR_SUCCESS); + } else { // Dump specific files UINT32 returned = 0; for (int i = 2; i < a.arguments().length(); i++) { - result = ffsDumper.dump(model.index(0, 0), fileInfo.fileName().append(".dump"), a.arguments().at(i)); + result = ffsDumper.dump(model.index(0, 0), fileInfo.fileName().append(".dump"), true, a.arguments().at(i)); if (result) returned |= (1 << (i - 1)); } @@ -112,9 +115,11 @@ int main(int argc, char *argv[]) } } else { // Show version and usage information - std::cout << "UEFIExtract 0.10.9" << std::endl << std::endl - << "Usage: UEFIExtract imagefile [FileGUID_1 FileGUID_2 ... FileGUID_31]" << std::endl - << "Return value is a bit mask where 0 at position N means that file with GUID_N was found and unpacked, 1 otherwise" << std::endl; + std::cout << "UEFIExtract 0.11.0" << std::endl << std::endl + << "Usage: UEFIExtract imagefile - dumps only leaf tree items into .dump folder" << std::endl + << " UEFIExtract imagefile all - dumps all tree items" + << " UIFIExtract imagefile GUID_1 GUID_2 ... GUID_31 - dumps an FFS file(s) with specific GUID(s)" + << "Return value is a bit mask where 0 at position N means that file with GUID_N was found and unpacked, 1 otherwise" << std::endl; return 1; } }