diff --git a/UEFIExtract/ffsdumper.cpp b/UEFIExtract/ffsdumper.cpp index 1888954..893b16f 100644 --- a/UEFIExtract/ffsdumper.cpp +++ b/UEFIExtract/ffsdumper.cpp @@ -24,10 +24,13 @@ USTATUS FfsDumper::dump(const UModelIndex & root, const UString & path, const Du return U_DIR_ALREADY_EXIST; USTATUS result = recursiveDump(root, path, dumpMode, sectionType, guid); - if (result) + if (result) { return result; - else if (!dumped) + } else if (!dumped) { + removeDirectory(path); return U_ITEM_NOT_FOUND; + } + return U_SUCCESS; } @@ -61,6 +64,8 @@ USTATUS FfsDumper::recursiveDump(const UModelIndex & index, const UString & path return U_FILE_OPEN; const UByteArray &data = model->header(index); file.write(data.constData(), data.size()); + + dumped = true; } } @@ -77,6 +82,8 @@ USTATUS FfsDumper::recursiveDump(const UModelIndex & index, const UString & path return U_FILE_OPEN; const UByteArray &data = model->body(index); file.write(data.constData(), data.size()); + + dumped = true; } } @@ -99,6 +106,8 @@ USTATUS FfsDumper::recursiveDump(const UModelIndex & index, const UString & path file.write(headerData.constData(), headerData.size()); file.write(bodyData.constData(), bodyData.size()); file.write(tailData.constData(), tailData.size()); + + dumped = true; } } @@ -121,9 +130,9 @@ USTATUS FfsDumper::recursiveDump(const UModelIndex & index, const UString & path if (!file) return U_FILE_OPEN; file << info.toLocal8Bit(); - } - dumped = true; + dumped = true; + } } USTATUS result; diff --git a/common/ffsparser.cpp b/common/ffsparser.cpp index 5522524..7401839 100644 --- a/common/ffsparser.cpp +++ b/common/ffsparser.cpp @@ -2516,7 +2516,7 @@ USTATUS FfsParser::parseGuidedSectionBody(const UModelIndex & index) if (model->hasEmptyParsingData(index) == false) { UByteArray data = model->parsingData(index); const GUIDED_SECTION_PARSING_DATA* pdata = (const GUIDED_SECTION_PARSING_DATA*)data.constData(); - guid = pdata->guid; + guid = readMisaligned(pdata).guid; } // Check if section requires processing @@ -3008,8 +3008,8 @@ USTATUS FfsParser::addMemoryAddressesRecursive(const UModelIndex & index) if (model->hasEmptyParsingData(index) == false) { UByteArray data = model->parsingData(index); const TE_IMAGE_SECTION_PARSING_DATA* pdata = (const TE_IMAGE_SECTION_PARSING_DATA*)data.constData(); - originalImageBase = pdata->imageBase; - adjustedImageBase = pdata->adjustedImageBase; + originalImageBase = readMisaligned(pdata).imageBase; + adjustedImageBase = readMisaligned(pdata).adjustedImageBase; } if (imageBase != 0) { diff --git a/common/filesystem.h b/common/filesystem.h index 00c1743..ca33421 100644 --- a/common/filesystem.h +++ b/common/filesystem.h @@ -36,6 +36,10 @@ static inline bool changeDirectory(const UString & dir) { return (_chdir(dir.toLocal8Bit()) == 0); } +static inline void removeDirectory(const UString & dir) { + _rmdir(dir.toLocal8Bit()); +} + static inline UString getAbsPath(const UString & path) { char abs[1024] = {}; if (_fullpath(abs, path.toLocal8Bit(), sizeof(abs))) @@ -54,6 +58,10 @@ static inline bool makeDirectory(const UString & dir) { return (mkdir(dir.toLocal8Bit(), ACCESSPERMS) == 0); } +static inline void removeDirectory(const UString & dir) { + rmdir(dir.toLocal8Bit()); +} + static inline bool changeDirectory(const UString & dir) { return (chdir(dir.toLocal8Bit()) == 0); }