diff --git a/LZMA/x86Convert.h b/LZMA/x86Convert.h new file mode 100644 index 0000000..d90d412 --- /dev/null +++ b/LZMA/x86Convert.h @@ -0,0 +1 @@ +#include "SDK/C/Bra.h" \ No newline at end of file diff --git a/UEFIPatch/uefipatch.pro b/UEFIPatch/uefipatch.pro index 9e53160..2fe5ff5 100644 --- a/UEFIPatch/uefipatch.pro +++ b/UEFIPatch/uefipatch.pro @@ -21,6 +21,7 @@ SOURCES += uefipatch_main.cpp \ ../LZMA/SDK/C/LzFind.c \ ../LZMA/SDK/C/LzmaDec.c \ ../LZMA/SDK/C/LzmaEnc.c \ + ../LZMA/SDK/C/Bra86.c \ ../Tiano/EfiTianoDecompress.c \ ../Tiano/EfiTianoCompress.c \ ../Tiano/EfiTianoCompressLegacy.c @@ -39,6 +40,7 @@ HEADERS += uefipatch.h \ ../version.h \ ../LZMA/LzmaCompress.h \ ../LZMA/LzmaDecompress.h \ + ../LZMA/x86Convert.h \ ../Tiano/EfiTianoDecompress.h \ ../Tiano/EfiTianoCompress.h diff --git a/UEFIReplace/uefireplace.pro b/UEFIReplace/uefireplace.pro index d63072b..cdb7b31 100644 --- a/UEFIReplace/uefireplace.pro +++ b/UEFIReplace/uefireplace.pro @@ -21,6 +21,7 @@ SOURCES += uefireplace_main.cpp \ ../LZMA/SDK/C/LzFind.c \ ../LZMA/SDK/C/LzmaDec.c \ ../LZMA/SDK/C/LzmaEnc.c \ + ../LZMA/SDK/C/Bra86.c \ ../Tiano/EfiTianoDecompress.c \ ../Tiano/EfiTianoCompress.c \ ../Tiano/EfiTianoCompressLegacy.c @@ -39,5 +40,6 @@ HEADERS += uefireplace.h \ ../version.h \ ../LZMA/LzmaCompress.h \ ../LZMA/LzmaDecompress.h \ + ../LZMA/x86Convert.h \ ../Tiano/EfiTianoDecompress.h \ ../Tiano/EfiTianoCompress.h \ No newline at end of file diff --git a/ffs.h b/ffs.h index d9aca9a..a7c6ab1 100644 --- a/ffs.h +++ b/ffs.h @@ -468,6 +468,9 @@ const QByteArray EFI_GUIDED_SECTION_TIANO // A31280AD-481E-41B6-95E8-127F4C98477 const QByteArray EFI_GUIDED_SECTION_LZMA // EE4E5898-3914-4259-9D6E-DC7BD79403CF ("\x98\x58\x4E\xEE\x14\x39\x59\x42\x9D\x6E\xDC\x7B\xD7\x94\x03\xCF", 16); +const QByteArray EFI_GUIDED_SECTION_LZMAF86 //D42AE6BD-1352-4BFB-909A-CA72A6EAE889 +("\xbd\xe6\x2a\xd4\x52\x13\xfb\x4b\x90\x9a\xca\x72\xa6\xea\xe8\x89", 16); + const QByteArray EFI_FIRMWARE_CONTENTS_SIGNED_GUID //0F9D89E8-9259-4F76-A5AF-0C89E34023DF ("\xE8\x89\x9D\x0F\x59\x92\x76\x4F\xA5\xAF\x0C\x89\xE3\x40\x23\xDF", 16); diff --git a/ffsengine.cpp b/ffsengine.cpp index 72e0201..230b922 100644 --- a/ffsengine.cpp +++ b/ffsengine.cpp @@ -23,6 +23,7 @@ WITHWARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Tiano/EfiTianoDecompress.h" #include "LZMA/LzmaCompress.h" #include "LZMA/LzmaDecompress.h" +#include "LZMA/x86Convert.h" #ifdef _CONSOLE #include @@ -1555,6 +1556,22 @@ UINT8 FfsEngine::parseDepexSection(const QByteArray & body, QString & parsed) return ERR_SUCCESS; } +UINT8 x86Convert(QByteArray & input, int mode) { + unsigned char* source = (unsigned char*)input.data(); + UINT32 sourceSize = input.size(); + + UINT32 state; + x86_Convert_Init(state); + UINT32 converted = x86_Convert(source, sourceSize, 0, &state, mode); + + const UINT8 x86LookAhead = 4; + if (converted + x86LookAhead != sourceSize) { + return ERR_INVALID_VOLUME; + } + + return ERR_SUCCESS; +} + UINT8 FfsEngine::parseSection(const QByteArray & section, QModelIndex & index, const QModelIndex & parent, const UINT8 mode) { const EFI_COMMON_SECTION_HEADER* sectionHeader = (const EFI_COMMON_SECTION_HEADER*)(section.constData()); @@ -1643,9 +1660,10 @@ UINT8 FfsEngine::parseSection(const QByteArray & section, QModelIndex & index, c UINT32 dictionarySize = DEFAULT_LZMA_DICTIONARY_SIZE; // Check if section requires processing + QByteArray parsedGuid = QByteArray((const char*)&guidDefinedSectionHeader->SectionDefinitionGuid, sizeof(EFI_GUID)); if (guidDefinedSectionHeader->Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) { // Tiano compressed section - if (QByteArray((const char*)&guidDefinedSectionHeader->SectionDefinitionGuid, sizeof(EFI_GUID)) == EFI_GUIDED_SECTION_TIANO) { + if (parsedGuid == EFI_GUIDED_SECTION_TIANO) { algorithm = COMPRESSION_ALGORITHM_UNKNOWN; result = decompress(body, EFI_STANDARD_COMPRESSION, processed, &algorithm); @@ -1664,12 +1682,17 @@ UINT8 FfsEngine::parseSection(const QByteArray & section, QModelIndex & index, c info += tr("\nCompression type: unknown"); } // LZMA compressed section - else if (QByteArray((const char*)&guidDefinedSectionHeader->SectionDefinitionGuid, sizeof(EFI_GUID)) == EFI_GUIDED_SECTION_LZMA) { + else if (parsedGuid == EFI_GUIDED_SECTION_LZMA || parsedGuid == EFI_GUIDED_SECTION_LZMAF86) { algorithm = COMPRESSION_ALGORITHM_UNKNOWN; result = decompress(body, EFI_CUSTOMIZED_COMPRESSION, processed, &algorithm); if (result) parseCurrentSection = false; + if (parsedGuid == EFI_GUIDED_SECTION_LZMAF86) { + if (x86Convert(processed, 0) != ERR_SUCCESS) { + msg(tr("parseSection: unable to convert LZMAF86 compressed data")); + } + } if (algorithm == COMPRESSION_ALGORITHM_LZMA) { info += tr("\nCompression type: LZMA"); @@ -1683,7 +1706,7 @@ UINT8 FfsEngine::parseSection(const QByteArray & section, QModelIndex & index, c info += tr("\nCompression type: unknown"); } // Signed section - else if (QByteArray((const char*)&guidDefinedSectionHeader->SectionDefinitionGuid, sizeof(EFI_GUID)) == EFI_FIRMWARE_CONTENTS_SIGNED_GUID) { + else if (parsedGuid == EFI_FIRMWARE_CONTENTS_SIGNED_GUID) { msgSigned = true; const WIN_CERTIFICATE* certificateHeader = (const WIN_CERTIFICATE*)body.constData(); if ((UINT32)body.size() < sizeof(WIN_CERTIFICATE)) { @@ -1738,7 +1761,7 @@ UINT8 FfsEngine::parseSection(const QByteArray & section, QModelIndex & index, c else if (guidDefinedSectionHeader->Attributes & EFI_GUIDED_SECTION_AUTH_STATUS_VALID) { // CRC32 section - if (QByteArray((const char*)&guidDefinedSectionHeader->SectionDefinitionGuid, sizeof(EFI_GUID)) == EFI_GUIDED_SECTION_CRC32) { + if (parsedGuid == EFI_GUIDED_SECTION_CRC32) { info += tr("\nChecksum type: CRC32"); // Calculate CRC32 of section data UINT32 crc = crc32(0, (const UINT8*)body.constData(), body.size()); @@ -3970,6 +3993,12 @@ UINT8 FfsEngine::reconstructSection(const QModelIndex& index, const UINT32 base, } else if (model->subtype(index) == EFI_SECTION_GUID_DEFINED) { EFI_GUID_DEFINED_SECTION* guidDefinedHeader = (EFI_GUID_DEFINED_SECTION*)header.data(); + // Convert x86 + if (QByteArray((const char*)&guidDefinedHeader->SectionDefinitionGuid, sizeof(EFI_GUID)) == EFI_GUIDED_SECTION_LZMAF86) { + result = x86Convert(reconstructed, 1); + if (result) + return result; + } // Compress new section body QByteArray compressed; result = compress(reconstructed, model->compression(index), model->dictionarySize(index), compressed); diff --git a/uefitool.pro b/uefitool.pro index f17f30a..a8cc381 100644 --- a/uefitool.pro +++ b/uefitool.pro @@ -21,6 +21,7 @@ SOURCES += uefitool_main.cpp \ LZMA/SDK/C/LzFind.c \ LZMA/SDK/C/LzmaDec.c \ LZMA/SDK/C/LzmaEnc.c \ + LZMA/SDK/C/Bra86.c \ Tiano/EfiTianoDecompress.c \ Tiano/EfiTianoCompress.c \ Tiano/EfiTianoCompressLegacy.c @@ -42,6 +43,7 @@ HEADERS += uefitool.h \ version.h \ LZMA/LzmaCompress.h \ LZMA/LzmaDecompress.h \ + LZMA/x86Convert.h \ Tiano/EfiTianoDecompress.h \ Tiano/EfiTianoCompress.h