From 34c8ad8dcc5f4bd76509123626d0f00511d3eb45 Mon Sep 17 00:00:00 2001 From: Vampire Cat <61520067+vampirecat35@users.noreply.github.com> Date: Sun, 4 Apr 2021 11:09:23 +0200 Subject: [PATCH] Updated code to support newer Qt versions (#237) --- .gitignore | 2 + UEFITool/ffsfinder.cpp | 55 ++++++++++++++++- UEFITool/ffsfinder.h | 5 ++ UEFITool/hexspinbox.cpp | 4 ++ UEFITool/hexspinbox.h | 9 +++ UEFITool/icons/uefitool.icns | Bin 99242 -> 35539 bytes UEFITool/qhexedit2/chunks.cpp | 16 ++--- UEFITool/qhexedit2/qhexedit.cpp | 20 +++--- UEFITool/searchdialog.cpp | 7 ++- UEFITool/searchdialog.h | 11 ++++ UEFITool/uefitool.cpp | 23 +++++++ UEFITool/uefitool.entitlements | 20 ++++++ common/bstrlib/bstrwrap.cpp | 6 +- common/ffsbuilder.cpp | 35 ++++++++--- common/ffsops.cpp | 9 ++- common/ffsparser.cpp | 105 +++++++++++++++++++++++--------- common/ffsreport.cpp | 6 +- common/ffsutils.cpp | 5 ++ common/guiddatabase.cpp | 5 ++ common/meparser.cpp | 8 +-- common/nvramparser.cpp | 61 ++++++++++++++----- common/sha256.c | 4 +- common/treemodel.cpp | 9 ++- common/treemodel.h | 1 - common/ubytearray.h | 8 +-- common/ustring.cpp | 6 ++ common/utility.cpp | 10 +-- version.h | 2 +- 28 files changed, 358 insertions(+), 94 deletions(-) create mode 100644 UEFITool/uefitool.entitlements diff --git a/.gitignore b/.gitignore index 0281ad4..1f89459 100644 --- a/.gitignore +++ b/.gitignore @@ -248,3 +248,5 @@ DerivedData compile_commands.json CMakeScripts UEFITool/qrc_uefitool.cpp +XcodeQT5 +XcodeQT6 diff --git a/UEFITool/ffsfinder.cpp b/UEFITool/ffsfinder.cpp index ceb4a06..19b9653 100644 --- a/UEFITool/ffsfinder.cpp +++ b/UEFITool/ffsfinder.cpp @@ -29,7 +29,12 @@ USTATUS FfsFinder::findHexPattern(const UModelIndex & index, const UByteArray & bool hasChildren = (model->rowCount(index) > 0); for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) findHexPattern(index.child(i, index.column()), hexPattern, mode); +#else + findHexPattern(index.model()->index(i, index.column(), index), hexPattern, mode); +#endif + } UByteArray data; @@ -49,9 +54,22 @@ USTATUS FfsFinder::findHexPattern(const UModelIndex & index, const UByteArray & } UString hexBody = UString(data.toHex()); +#if QT_VERSION_MAJOR >= 6 + QRegularExpression regexp = QRegularExpression(UString(hexPattern)); + regexp.setPatternOptions((QRegularExpression::PatternOptions)0x1); + QRegularExpressionMatch regexpmatch; + + INT32 offset = 0; + while ((offset = (INT32)hexBody.indexOf(regexp, (qsizetype)offset, ®expmatch)) != -1) + { +#else QRegExp regexp = QRegExp(UString(hexPattern), Qt::CaseInsensitive); + INT32 offset = regexp.indexIn(hexBody); + while (offset >= 0) { +#endif + if (offset % 2 == 0) { // For patterns that cross header|body boundary, skip patterns entirely located in body, since // children search above has already found them. @@ -64,7 +82,12 @@ USTATUS FfsFinder::findHexPattern(const UModelIndex & index, const UByteArray & index); } } + +#if QT_VERSION_MAJOR >= 6 + offset += 1; +#else offset = regexp.indexIn(hexBody, offset + 1); +#endif } return U_SUCCESS; @@ -80,7 +103,11 @@ USTATUS FfsFinder::findGuidPattern(const UModelIndex & index, const UByteArray & bool hasChildren = (model->rowCount(index) > 0); for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) findGuidPattern(index.child(i, index.column()), guidPattern, mode); +#else + findGuidPattern(index.model()->index(i, index.column(), index), guidPattern, mode); +#endif } UByteArray data; @@ -121,8 +148,19 @@ USTATUS FfsFinder::findGuidPattern(const UModelIndex & index, const UByteArray & if (hexPattern.count('.') == hexPattern.length()) return U_SUCCESS; +#if QT_VERSION_MAJOR >= 6 + QRegularExpression regexp((QString)UString(hexPattern)); + regexp.setPatternOptions((QRegularExpression::PatternOptions)0x1); + QRegularExpressionMatch regexpmatch; + + INT32 offset = 0; + offset = (INT32)hexBody.indexOf(regexp, (qsizetype)offset, ®expmatch); +#else QRegExp regexp(UString(hexPattern), Qt::CaseInsensitive); + INT32 offset = regexp.indexIn(hexBody); +#endif + while (offset >= 0) { if (offset % 2 == 0) { msg(UString("GUID pattern \"") + UString(guidPattern) @@ -132,7 +170,12 @@ USTATUS FfsFinder::findGuidPattern(const UModelIndex & index, const UByteArray & + usprintf(" at %s-offset %02Xh", mode == SEARCH_MODE_BODY ? "body" : "header", offset / 2), index); } + +#if QT_VERSION_MAJOR >= 6 + offset = (INT32)hexBody.indexOf(regexp, (qsizetype)offset + 1, ®expmatch); +#else offset = regexp.indexIn(hexBody, offset + 1); +#endif } return U_SUCCESS; @@ -148,7 +191,11 @@ USTATUS FfsFinder::findTextPattern(const UModelIndex & index, const UString & pa bool hasChildren = (model->rowCount(index) > 0); for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) findTextPattern(index.child(i, index.column()), pattern, mode, unicode, caseSensitive); +#else + findTextPattern(index.model()->index(i, index.column(), index), pattern, mode, unicode, caseSensitive); +#endif } UByteArray body; @@ -167,12 +214,16 @@ USTATUS FfsFinder::findTextPattern(const UModelIndex & index, const UString & pa UString data; if (unicode) - data = UString::fromUtf16((const ushort*)body.constData(), body.length() / 2); +#if QT_VERSION_MAJOR >= 6 + data = UString::fromUtf16((const char16_t*)body.constData(), (int)(body.length() / 2)); +#else + data = UString::fromUtf16((const ushort*)body.constData(), (int)(body.length() / 2)); +#endif else data = UString::fromLatin1((const char*)body.constData(), body.length()); int offset = -1; - while ((offset = data.indexOf(pattern, offset + 1, caseSensitive)) >= 0) { + while ((offset = (int)data.indexOf(pattern, (int)(offset + 1), caseSensitive)) >= 0) { msg((unicode ? UString("Unicode") : UString("ASCII")) + UString(" text \"") + UString(pattern) + UString("\" in ") + model->name(model->parent(index)) diff --git a/UEFITool/ffsfinder.h b/UEFITool/ffsfinder.h index b88866b..652cc76 100644 --- a/UEFITool/ffsfinder.h +++ b/UEFITool/ffsfinder.h @@ -15,7 +15,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define FFSFINDER_H #include + +#if QT_VERSION_MAJOR >= 6 +#include +#else #include +#endif #include "../common/ubytearray.h" #include "../common/ustring.h" diff --git a/UEFITool/hexspinbox.cpp b/UEFITool/hexspinbox.cpp index bb409b8..587ce30 100644 --- a/UEFITool/hexspinbox.cpp +++ b/UEFITool/hexspinbox.cpp @@ -15,7 +15,11 @@ #include HexSpinBox::HexSpinBox(QWidget *parent) : +#if QT_VERSION_MAJOR >= 6 +QSpinBox(parent), validator(QRegularExpression("0x([0-9a-fA-F]){1,8}")) +#else QSpinBox(parent), validator(QRegExp("0x([0-9a-fA-F]){1,8}")) +#endif { this->setRange(INT_MIN, INT_MAX); this->setPrefix("0x"); diff --git a/UEFITool/hexspinbox.h b/UEFITool/hexspinbox.h index 1304e88..51a4180 100644 --- a/UEFITool/hexspinbox.h +++ b/UEFITool/hexspinbox.h @@ -15,7 +15,12 @@ #define HEXSPINBOX_H #include + +#if QT_VERSION_MAJOR >= 6 +#include +#else #include +#endif class HexSpinBox : public QSpinBox { @@ -30,7 +35,11 @@ protected: QString textFromValue(int value) const; private: +#if QT_VERSION_MAJOR >= 6 + QRegularExpressionValidator validator; +#else QRegExpValidator validator; +#endif }; #endif // HEXSPINBOX_H diff --git a/UEFITool/icons/uefitool.icns b/UEFITool/icons/uefitool.icns index a332b7039fc6a091118d25c06fa7295bc9f2bc54..5bd61f4362cf06b751ddc76a15b6fd53bb078d17 100644 GIT binary patch literal 35539 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%0DYXcH)lH!VVDrrM!`tX&CAu*!zB(0xp=s^ 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 Q0Ot2d`LR-!f@RSE0fEyExc~qF diff --git a/UEFITool/qhexedit2/chunks.cpp b/UEFITool/qhexedit2/chunks.cpp index a4e420b..80d3d86 100644 --- a/UEFITool/qhexedit2/chunks.cpp +++ b/UEFITool/qhexedit2/chunks.cpp @@ -95,11 +95,11 @@ QByteArray Chunks::data(qint64 pos, qint64 maxSize, QByteArray *highlighted) count = maxSize; if (count > 0) { - buffer += chunk.data.mid(chunkOfs, (int)count); + buffer += chunk.data.mid((int)chunkOfs, (int)count); maxSize -= count; pos += count; if (highlighted) - *highlighted += chunk.dataChanged.mid(chunkOfs, (int)count); + *highlighted += chunk.dataChanged.mid((int)chunkOfs, (int)count); } } } @@ -176,7 +176,7 @@ qint64 Chunks::indexOf(const QByteArray &ba, qint64 from) for (qint64 pos=from; (pos < _size) && (result < 0); pos += BUFFER_SIZE) { buffer = data(pos, BUFFER_SIZE + ba.size() - 1); - int findPos = buffer.indexOf(ba); + int findPos = (int)buffer.indexOf(ba); if (findPos >= 0) result = pos + (qint64)findPos; } @@ -194,7 +194,7 @@ qint64 Chunks::lastIndexOf(const QByteArray &ba, qint64 from) if (sPos < 0) sPos = 0; buffer = data(sPos, pos - sPos); - int findPos = buffer.lastIndexOf(ba); + int findPos = (int)buffer.lastIndexOf(ba); if (findPos >= 0) result = sPos + (qint64)findPos; } @@ -214,8 +214,8 @@ bool Chunks::insert(qint64 pos, char b) else chunkIdx = getChunkIndex(pos); qint64 posInBa = pos - _chunks[chunkIdx].absPos; - _chunks[chunkIdx].data.insert(posInBa, b); - _chunks[chunkIdx].dataChanged.insert(posInBa, char(1)); + _chunks[chunkIdx].data.insert((int)posInBa, b); + _chunks[chunkIdx].dataChanged.insert((int)posInBa, char(1)); for (int idx=chunkIdx+1; idx < _chunks.size(); idx++) _chunks[idx].absPos += 1; _size += 1; @@ -241,8 +241,8 @@ bool Chunks::removeAt(qint64 pos) return false; int chunkIdx = getChunkIndex(pos); qint64 posInBa = pos - _chunks[chunkIdx].absPos; - _chunks[chunkIdx].data.remove(posInBa, 1); - _chunks[chunkIdx].dataChanged.remove(posInBa, 1); + _chunks[chunkIdx].data.remove((int)posInBa, 1); + _chunks[chunkIdx].dataChanged.remove((int)posInBa, 1); for (int idx=chunkIdx+1; idx < _chunks.size(); idx++) _chunks[idx].absPos -= 1; _size -= 1; diff --git a/UEFITool/qhexedit2/qhexedit.cpp b/UEFITool/qhexedit2/qhexedit.cpp index 9ce21a0..bc1612a 100644 --- a/UEFITool/qhexedit2/qhexedit.cpp +++ b/UEFITool/qhexedit2/qhexedit.cpp @@ -408,7 +408,13 @@ QString QHexEdit::selectionToReadableString() void QHexEdit::setFont(const QFont &font) { QWidget::setFont(font); + +#if ((QT_VERSION_MINOR >= 11) && (QT_VERSION_MAJOR == 5)) || (QT_VERSION_MAJOR >= 6) + _pxCharWidth = fontMetrics().horizontalAdvance('2'); +#else _pxCharWidth = fontMetrics().width(QLatin1Char('2')); +#endif + _pxCharHeight = fontMetrics().height(); _pxGapAdr = _pxCharWidth / 2; _pxGapAdrHex = _pxCharWidth; @@ -573,7 +579,7 @@ void QHexEdit::keyPressEvent(QKeyEvent *event) { QByteArray ba = _chunks->data(getSelectionBegin(), getSelectionEnd() - getSelectionBegin()).toHex(); for (qint64 idx = 32; idx < ba.size(); idx +=33) - ba.insert(idx, "\n"); + ba.insert((int)idx, "\n"); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(ba); if (_overwriteMode) @@ -596,7 +602,7 @@ void QHexEdit::keyPressEvent(QKeyEvent *event) QByteArray ba = QByteArray().fromHex(clipboard->text().toLatin1()); if (_overwriteMode) { - ba = ba.left(std::min(ba.size(), (_chunks->size() - _bPosCurrent))); + ba = ba.left((int)std::min(ba.size(), (_chunks->size() - _bPosCurrent))); replace(_bPosCurrent, ba.size(), ba); } else @@ -746,7 +752,7 @@ void QHexEdit::keyPressEvent(QKeyEvent *event) { QByteArray ba = _chunks->data(getSelectionBegin(), getSelectionEnd() - getSelectionBegin()).toHex(); for (qint64 idx = 32; idx < ba.size(); idx += 33) - ba.insert(idx, "\n"); + ba.insert((int)idx, "\n"); if(_upperCase) ba = ba.toUpper(); QClipboard *clipboard = QApplication::clipboard(); @@ -875,7 +881,7 @@ void QHexEdit::paintEvent(QPaintEvent *event) else r.setRect(pxPosX - _pxCharWidth, pxPosY - _pxCharHeight + _pxSelectionSub, 3*_pxCharWidth, _pxCharHeight); painter.fillRect(r, c); - hex = _hexDataShown.mid((bPosLine + colIdx) * 2, 2); + hex = _hexDataShown.mid((int)((bPosLine + colIdx) * 2), 2); // upper or lower case if (_upperCase) @@ -887,7 +893,7 @@ void QHexEdit::paintEvent(QPaintEvent *event) // render ascii value if (_asciiArea) { - int ch = (uchar)_dataShown.at(bPosLine + colIdx); + int ch = (uchar)_dataShown.at((int)(bPosLine + colIdx)); if ( ch < 0x20 ) ch = '.'; r.setRect(pxPosAsciiX2, pxPosY - _pxCharHeight + _pxSelectionSub, _pxCharWidth, _pxCharHeight); @@ -977,12 +983,12 @@ void QHexEdit::setSelection(qint64 pos) int QHexEdit::getSelectionBegin() { - return _bSelectionBegin; + return (int)_bSelectionBegin; } int QHexEdit::getSelectionEnd() { - return _bSelectionEnd; + return (int)_bSelectionEnd; } // ********************************************************************** Private utility functions diff --git a/UEFITool/searchdialog.cpp b/UEFITool/searchdialog.cpp index 74f37b9..a0f74df 100644 --- a/UEFITool/searchdialog.cpp +++ b/UEFITool/searchdialog.cpp @@ -16,8 +16,13 @@ SearchDialog::SearchDialog(QWidget *parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint), ui(new Ui::SearchDialog), +#if QT_VERSION_MAJOR >= 6 +hexValidator(QRegularExpression("([0-9a-fA-F\\. ])*")), +guidValidator(QRegularExpression("[0-9a-fA-F\\.]{8}-[0-9a-fA-F\\.]{4}-[0-9a-fA-F\\.]{4}-[0-9a-fA-F\\.]{4}-[0-9a-fA-F\\.]{12}")) +#else hexValidator(QRegExp("([0-9a-fA-F\\. ])*")), guidValidator(QRegExp("[0-9a-fA-F\\.]{8}-[0-9a-fA-F\\.]{4}-[0-9a-fA-F\\.]{4}-[0-9a-fA-F\\.]{4}-[0-9a-fA-F\\.]{12}")) +#endif { // Create UI ui->setupUi(this); @@ -46,4 +51,4 @@ void SearchDialog::setEditFocus(int index) } else if (index == 2) // Text ui->textEdit->setFocus(); -} \ No newline at end of file +} diff --git a/UEFITool/searchdialog.h b/UEFITool/searchdialog.h index 56a673c..6698506 100644 --- a/UEFITool/searchdialog.h +++ b/UEFITool/searchdialog.h @@ -15,7 +15,13 @@ #define SEARCHDIALOG_H #include + +#if QT_VERSION_MAJOR >= 6 +#include +#else #include +#endif + #include "ui_searchdialog.h" class SearchDialog : public QDialog @@ -31,8 +37,13 @@ private slots: void setEditFocus(int index); private: +#if QT_VERSION_MAJOR >= 6 + QRegularExpressionValidator hexValidator; + QRegularExpressionValidator guidValidator; +#else QRegExpValidator hexValidator; QRegExpValidator guidValidator; +#endif }; #endif // SEARCHDIALOG_H diff --git a/UEFITool/uefitool.cpp b/UEFITool/uefitool.cpp index ec22558..0f35f56 100644 --- a/UEFITool/uefitool.cpp +++ b/UEFITool/uefitool.cpp @@ -390,7 +390,12 @@ void UEFITool::goToData() } for (int j = i + 1; j < model->rowCount(parent); j++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) QModelIndex currentIndex = parent.child(j, 0); +#else + QModelIndex currentIndex = parent.model()->index(j, 0, parent); +#endif + if (model->hasEmptyParsingData(currentIndex)) continue; @@ -788,8 +793,14 @@ void UEFITool::showParserMessages() return; std::vector > messages = ffsParser->getMessages(); + +#if QT_VERSION_MAJOR < 6 std::pair msg; + foreach (msg, messages) { +#else + for (const auto &msg : messages) { +#endif QListWidgetItem* item = new QListWidgetItem(msg.first, NULL, 0); item->setData(Qt::UserRole, QByteArray((const char*)&msg.second, sizeof(msg.second))); ui->parserMessagesListWidget->addItem(item); @@ -806,8 +817,14 @@ void UEFITool::showFinderMessages() return; std::vector > messages = ffsFinder->getMessages(); + +#if QT_VERSION_MAJOR < 6 std::pair msg; + foreach (msg, messages) { +#else + for (const auto &msg : messages) { +#endif QListWidgetItem* item = new QListWidgetItem(msg.first, NULL, 0); item->setData(Qt::UserRole, QByteArray((const char*)&msg.second, sizeof(msg.second)));; ui->finderMessagesListWidget->addItem(item); @@ -825,8 +842,14 @@ void UEFITool::showBuilderMessages() return; std::vector > messages = ffsBuilder->getMessages(); + +#if QT_VERSION_MAJOR < 6 std::pair msg; + foreach (msg, messages) { +#else + for (const auto &msg : messages) { +#endif QListWidgetItem* item = new QListWidgetItem(msg.first, NULL, 0); item->setData(Qt::UserRole, QByteArray((const char*)&msg.second, sizeof(msg.second))); ui->builderMessagesListWidget->addItem(item); diff --git a/UEFITool/uefitool.entitlements b/UEFITool/uefitool.entitlements new file mode 100644 index 0000000..6b54693 --- /dev/null +++ b/UEFITool/uefitool.entitlements @@ -0,0 +1,20 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.assets.movies.read-write + + com.apple.security.assets.music.read-write + + com.apple.security.assets.pictures.read-write + + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + + com.apple.security.print + + + diff --git a/common/bstrlib/bstrwrap.cpp b/common/bstrlib/bstrwrap.cpp index e1673fd..1f119ce 100644 --- a/common/bstrlib/bstrwrap.cpp +++ b/common/bstrlib/bstrwrap.cpp @@ -697,9 +697,9 @@ int CBString::find (const CBString& b, int pos) const { int CBString::find (const char * b, int pos) const { int ii, j; unsigned char c0; -register int i, l; -register unsigned char cx; -register unsigned char * pdata; +int i, l; +unsigned char cx; +unsigned char * pdata; if (NULL == b) { #ifdef BSTRLIB_THROWS_EXCEPTIONS diff --git a/common/ffsbuilder.cpp b/common/ffsbuilder.cpp index d61fb45..b74e23c 100644 --- a/common/ffsbuilder.cpp +++ b/common/ffsbuilder.cpp @@ -90,9 +90,14 @@ USTATUS FfsBuilder::buildCapsule(const UModelIndex & index, UByteArray & capsule msg(usprintf("buildCapsule: building of capsules with %d items is not yet supported", model->rowCount(index)), index); return U_NOT_IMPLEMENTED; } - + // Build image +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex imageIndex = index.child(0, 0); +#else + UModelIndex imageIndex = index.model()->index(0, 0, index); +#endif + UByteArray imageData; // Check image type @@ -123,8 +128,8 @@ USTATUS FfsBuilder::buildCapsule(const UModelIndex & index, UByteArray & capsule } // Check size of reconstructed capsule body, it must remain the same - UINT32 newSize = capsule.size(); - UINT32 oldSize = model->body(index).size(); + UINT32 newSize = (UINT32)capsule.size(); + UINT32 oldSize = (UINT32)model->body(index).size(); if (newSize > oldSize) { msg(usprintf("buildCapsule: new capsule size %Xh (%u) is bigger than the original %Xh (%u)", newSize, newSize, oldSize, oldSize), index); return U_INVALID_CAPSULE; @@ -165,11 +170,19 @@ USTATUS FfsBuilder::buildIntelImage(const UModelIndex & index, UByteArray & inte // Rebuild else if (model->action(index) == Actions::Rebuild) { // First child will always be descriptor for this type of image, and it's read only for now +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) intelImage = model->header(index.child(0, 0)) + model->body(index.child(0, 0)) + model->tail(index.child(0, 0)); - +#else + intelImage = model->header(index.model()->index(0, 0, index)) + model->body(index.model()->index(0, 0, index)) + model->tail(index.model()->index(0, 0, index)); +#endif + // Process other regions for (int i = 1; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex currentRegion = index.child(i, 0); +#else + UModelIndex currentRegion = index.model()->index(i, 0, index); +#endif // Skip regions with Remove action if (model->action(currentRegion) == Actions::Remove) @@ -222,8 +235,8 @@ USTATUS FfsBuilder::buildIntelImage(const UModelIndex & index, UByteArray & inte } // Check size of new image, it must be same as old one - UINT32 newSize = intelImage.size(); - UINT32 oldSize = model->body(index).size(); + UINT32 newSize = (UINT32)intelImage.size(); + UINT32 oldSize = (UINT32)model->body(index).size(); if (newSize > oldSize) { msg(usprintf("buildIntelImage: new image size %Xh (%u) is bigger than the original %Xh (%u)", newSize, newSize, oldSize, oldSize), index); return U_INVALID_IMAGE; @@ -269,7 +282,13 @@ USTATUS FfsBuilder::buildRawArea(const UModelIndex & index, UByteArray & rawArea // Build children for (int i = 0; i < model->rowCount(index); i++) { USTATUS result = U_SUCCESS; + +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex currentChild = index.child(i, 0); +#else + UModelIndex currentChild = index.model()->index(i, 0, index); +#endif + UByteArray currentData; // Check child type if (model->type(currentChild) == Types::Volume) { @@ -292,8 +311,8 @@ USTATUS FfsBuilder::buildRawArea(const UModelIndex & index, UByteArray & rawArea } // Check size of new raw area, it must be same as original one - UINT32 newSize = rawArea.size(); - UINT32 oldSize = model->body(index).size(); + UINT32 newSize = (UINT32)rawArea.size(); + UINT32 oldSize = (UINT32)model->body(index).size(); if (newSize > oldSize) { msg(usprintf("buildRawArea: new area size %Xh (%u) is bigger than the original %Xh (%u)", newSize, newSize, oldSize, oldSize), index); return U_INVALID_RAW_AREA; diff --git a/common/ffsops.cpp b/common/ffsops.cpp index 160519e..a2eb09f 100644 --- a/common/ffsops.cpp +++ b/common/ffsops.cpp @@ -44,8 +44,13 @@ USTATUS FfsOperations::extract(const UModelIndex & index, UString & name, UByteA extracted.clear(); // There is no need to redo decompression, we can use child items for (int i = 0; i < model->rowCount(index); i++) { - UModelIndex childIndex = index.child(i, 0); - // Ensure 4-byte alignment of current section +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) + UModelIndex childIndex = index.child(i, 0); +#else + UModelIndex childIndex = index.model()->index(i, 0, index); +#endif + + // Ensure 4-byte alignment of current section extracted += UByteArray(ALIGN4((UINT32)extracted.size()) - (UINT32)extracted.size(), '\x00'); // Add current section header, body and tail extracted += model->header(childIndex); diff --git a/common/ffsparser.cpp b/common/ffsparser.cpp index c4a8ac5..6fd690f 100644 --- a/common/ffsparser.cpp +++ b/common/ffsparser.cpp @@ -478,7 +478,7 @@ USTATUS FfsParser::parseIntelImage(const UByteArray & intelImage, const UINT32 l // Check for padding after the last region if ((UINT64)regions.back().offset + (UINT64)regions.back().length < (UINT64)intelImage.size()) { region.offset = regions.back().offset + regions.back().length; - region.length = intelImage.size() - region.offset; + region.length = (UINT32)(intelImage.size() - region.offset); region.data = intelImage.mid(region.offset, region.length); region.type = getPaddingType(region.data); regions.push_back(region); @@ -718,10 +718,10 @@ USTATUS FfsParser::parseMeRegion(const UByteArray & me, const UINT32 localOffset } else { // Search for new signature - INT32 versionOffset = me.indexOf(ME_VERSION_SIGNATURE2); + INT32 versionOffset = (INT32)me.indexOf(ME_VERSION_SIGNATURE2); if (versionOffset < 0){ // New signature not found // Search for old signature - versionOffset = me.indexOf(ME_VERSION_SIGNATURE); + versionOffset = (INT32)me.indexOf(ME_VERSION_SIGNATURE); if (versionOffset < 0){ info += ("\nVersion: unknown"); versionFound = false; @@ -848,7 +848,7 @@ USTATUS FfsParser::parseRawArea(const UModelIndex & index) // Get item data UByteArray data = model->body(index); - UINT32 headerSize = model->header(index).size(); + UINT32 headerSize = (UINT32)model->header(index).size(); USTATUS result; UString name; @@ -919,7 +919,7 @@ USTATUS FfsParser::parseRawArea(const UModelIndex & index) // Update variables prevItemOffset = itemOffset; - prevItemSize = padding.size(); + prevItemSize = (UINT32)padding.size(); break; } @@ -992,7 +992,12 @@ USTATUS FfsParser::parseRawArea(const UModelIndex & index) // Parse bodies for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex current = index.child(i, 0); +#else + UModelIndex current = index.model()->index(i, 0, index); +#endif + switch (model->type(current)) { case Types::Volume: parseVolumeBody(current); @@ -1122,7 +1127,7 @@ USTATUS FfsParser::parseVolumeHeader(const UByteArray & volume, const UINT32 loc // Check for AppleCRC32 and UsedSpace in ZeroVector bool hasAppleCrc32 = false; - UINT32 volumeSize = volume.size(); + UINT32 volumeSize = (UINT32)volume.size(); UINT32 appleCrc32 = *(UINT32*)(volume.constData() + 8); UINT32 usedSpace = *(UINT32*)(volume.constData() + 12); if (appleCrc32 != 0) { @@ -1295,7 +1300,7 @@ BOOLEAN FfsParser::microcodeHeaderValid(const INTEL_MICROCODE_HEADER* ucodeHeade USTATUS FfsParser::findNextRawAreaItem(const UModelIndex & index, const UINT32 localOffset, UINT8 & nextItemType, UINT32 & nextItemOffset, UINT32 & nextItemSize, UINT32 & nextItemAlternativeSize) { UByteArray data = model->body(index); - UINT32 dataSize = data.size(); + UINT32 dataSize = (UINT32)data.size(); if (dataSize < sizeof(UINT32)) return U_STORES_NOT_FOUND; @@ -1435,7 +1440,7 @@ USTATUS FfsParser::parseVolumeBody(const UModelIndex & index) // Get volume header size and body UByteArray volumeBody = model->body(index); - UINT32 volumeHeaderSize = model->header(index).size(); + UINT32 volumeHeaderSize = (UINT32)model->header(index).size(); // Parse VSS NVRAM volumes with a dedicated function if (model->subtype(index) == Subtypes::NvramVolume) { @@ -1466,7 +1471,7 @@ USTATUS FfsParser::parseVolumeBody(const UModelIndex & index) } // Search for and parse all files - UINT32 volumeBodySize = volumeBody.size(); + UINT32 volumeBodySize = (UINT32)volumeBody.size(); UINT32 fileOffset = 0; while (fileOffset < volumeBodySize) { @@ -1496,7 +1501,7 @@ USTATUS FfsParser::parseVolumeBody(const UModelIndex & index) if (freeSpace.count(emptyByte) != freeSpace.size()) { // Search for the first non-empty byte UINT32 i; - UINT32 size = freeSpace.size(); + UINT32 size = (UINT32)freeSpace.size(); const UINT8* current = (UINT8*)freeSpace.constData(); for (i = 0; i < size; i++) { if (*current++ != emptyByte) { @@ -1559,7 +1564,12 @@ USTATUS FfsParser::parseVolumeBody(const UModelIndex & index) // Check for duplicate GUIDs for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex current = index.child(i, 0); +#else + UModelIndex current = index.model()->index(i, 0, index); +#endif + // Skip non-file entries and pad files if (model->type(current) != Types::File || model->subtype(current) == EFI_FV_FILETYPE_PAD) { continue; @@ -1570,7 +1580,11 @@ USTATUS FfsParser::parseVolumeBody(const UModelIndex & index) // Check files after current for having an equal GUID for (int j = i + 1; j < model->rowCount(index); j++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex another = index.child(j, 0); +#else + UModelIndex another = index.model()->index(j, 0, index); +#endif // Skip non-file entries if (model->type(another) != Types::File) { @@ -1589,7 +1603,12 @@ USTATUS FfsParser::parseVolumeBody(const UModelIndex & index) // Parse bodies for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex current = index.child(i, 0); +#else + UModelIndex current = index.model()->index(i, 0, index); +#endif + switch (model->type(current)) { case Types::File: parseFileBody(current); @@ -1704,7 +1723,7 @@ USTATUS FfsParser::parseFileHeader(const UByteArray & file, const UINT32 localOf } // Check header checksum - UINT8 calculatedHeader = 0x100 - (calculateSum8((const UINT8*)header.constData(), header.size()) - fileHeader->IntegrityCheck.Checksum.Header - fileHeader->IntegrityCheck.Checksum.File - fileHeader->State); + UINT8 calculatedHeader = 0x100 - (calculateSum8((const UINT8*)header.constData(), (UINT32)header.size()) - fileHeader->IntegrityCheck.Checksum.Header - fileHeader->IntegrityCheck.Checksum.File - fileHeader->State); bool msgInvalidHeaderChecksum = false; if (fileHeader->IntegrityCheck.Checksum.Header != calculatedHeader) { msgInvalidHeaderChecksum = true; @@ -1715,7 +1734,7 @@ USTATUS FfsParser::parseFileHeader(const UByteArray & file, const UINT32 localOf bool msgInvalidDataChecksum = false; UINT8 calculatedData = 0; if (fileHeader->Attributes & FFS_ATTRIB_CHECKSUM) { - calculatedData = calculateChecksum8((const UINT8*)body.constData(), body.size()); + calculatedData = calculateChecksum8((const UINT8*)body.constData(), (UINT32)body.size()); } // Data checksum must be one of predefined values else if (volumeRevision == 1) { @@ -1907,7 +1926,7 @@ USTATUS FfsParser::parsePadFileBody(const UModelIndex & index) // Search for the first non-empty byte UINT32 nonEmptyByteOffset; - UINT32 size = body.size(); + UINT32 size = (UINT32)body.size(); const UINT8* current = (const UINT8*)body.constData(); for (nonEmptyByteOffset = 0; nonEmptyByteOffset < size; nonEmptyByteOffset++) { if (*current++ != emptyByte) @@ -1915,7 +1934,7 @@ USTATUS FfsParser::parsePadFileBody(const UModelIndex & index) } // Add all bytes before as free space... - UINT32 headerSize = model->header(index).size(); + UINT32 headerSize = (UINT32)model->header(index).size(); if (nonEmptyByteOffset >= 8) { // Align free space to 8 bytes boundary if (nonEmptyByteOffset != ALIGN8(nonEmptyByteOffset)) @@ -1959,8 +1978,8 @@ USTATUS FfsParser::parseSections(const UByteArray & sections, const UModelIndex return U_INVALID_PARAMETER; // Search for and parse all sections - UINT32 bodySize = sections.size(); - UINT32 headerSize = model->header(index).size(); + UINT32 bodySize = (UINT32)sections.size(); + UINT32 headerSize = (UINT32)model->header(index).size(); UINT32 sectionOffset = 0; USTATUS result = U_SUCCESS; @@ -2019,7 +2038,12 @@ USTATUS FfsParser::parseSections(const UByteArray & sections, const UModelIndex // Parse bodies, will be skipped if insertIntoTree is not required for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex current = index.child(i, 0); +#else + UModelIndex current = index.model()->index(i, 0, index); +#endif + switch (model->type(current)) { case Types::Section: parseSectionBody(current); @@ -2278,7 +2302,7 @@ USTATUS FfsParser::parseGuidedSectionHeader(const UByteArray & section, const UI UINT32 crc = *(UINT32*)(section.constData() + headerSize); additionalInfo += UString("\nChecksum type: CRC32"); // Calculate CRC32 of section data - UINT32 calculated = (UINT32)crc32(0, (const UINT8*)section.constData() + dataOffset, section.size() - dataOffset); + UINT32 calculated = (UINT32)crc32(0, (const UINT8*)section.constData() + dataOffset, (uInt)(section.size() - dataOffset)); if (crc == calculated) { additionalInfo += usprintf("\nChecksum: %08Xh, valid", crc); } @@ -2656,7 +2680,7 @@ USTATUS FfsParser::parseCompressedSectionBody(const UModelIndex & index) // Obtain required information from parsing data UINT8 compressionType = EFI_NOT_COMPRESSED; - UINT32 uncompressedSize = model->body(index).size(); + UINT32 uncompressedSize = (UINT32)model->body(index).size(); if (model->hasEmptyParsingData(index) == false) { UByteArray data = model->parsingData(index); const COMPRESSED_SECTION_PARSING_DATA* pdata = (const COMPRESSED_SECTION_PARSING_DATA*)data.constData(); @@ -2846,7 +2870,11 @@ USTATUS FfsParser::parseVersionSectionBody(const UModelIndex & index) return U_INVALID_PARAMETER; // Add info +#if QT_VERSION_MAJOR >= 6 + model->addInfo(index, UString("\nVersion string: ") + UString::fromUtf16((const char16_t*)model->body(index).constData())); +#else model->addInfo(index, UString("\nVersion string: ") + UString::fromUtf16((const CHAR16*)model->body(index).constData())); +#endif return U_SUCCESS; } @@ -2981,7 +3009,11 @@ USTATUS FfsParser::parseUiSectionBody(const UModelIndex & index) if (!index.isValid()) return U_INVALID_PARAMETER; +#if QT_VERSION_MAJOR >= 6 + UString text = UString::fromUtf16((const char16_t*)model->body(index).constData()); +#else UString text = UString::fromUtf16((const CHAR16*)model->body(index).constData()); +#endif // Add info model->addInfo(index, UString("\nText: ") + text); @@ -2999,7 +3031,7 @@ USTATUS FfsParser::parseAprioriRawSection(const UByteArray & body, UString & par msg(usprintf("%s: apriori file has size is not a multiple of 16", __FUNCTION__)); } parsed.clear(); - UINT32 count = body.size() / sizeof(EFI_GUID); + UINT32 count = (UINT32)(body.size() / sizeof(EFI_GUID)); if (count > 0) { for (UINT32 i = 0; i < count; i++) { const EFI_GUID* guid = (const EFI_GUID*)body.constData() + i; @@ -3207,7 +3239,7 @@ USTATUS FfsParser::performSecondPass(const UModelIndex & index) } // Calculate address difference - const UINT32 vtfSize = model->header(lastVtf).size() + model->body(lastVtf).size() + model->tail(lastVtf).size(); + const UINT32 vtfSize = (const UINT32)(model->header(lastVtf).size() + model->body(lastVtf).size() + model->tail(lastVtf).size()); addressDiff = 0xFFFFFFFFULL - model->base(lastVtf) - vtfSize + 1; // Parse reset vector data @@ -3280,7 +3312,7 @@ USTATUS FfsParser::checkTeImageBase(const UModelIndex & index) if (originalImageBase != 0 || adjustedImageBase != 0) { // Check data memory address to be equal to either OriginalImageBase or AdjustedImageBase UINT64 address = addressDiff + model->base(index); - UINT32 base = (UINT32)address + model->header(index).size(); + UINT32 base = (UINT32)(address + model->header(index).size()); if (originalImageBase == base) { imageBaseType = EFI_IMAGE_TE_BASE_ORIGINAL; @@ -3318,7 +3350,11 @@ USTATUS FfsParser::checkTeImageBase(const UModelIndex & index) // Process child items for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) checkTeImageBase(index.child(i, 0)); +#else + checkTeImageBase(index.model()->index(i, 0, index)); +#endif } return U_SUCCESS; @@ -3339,7 +3375,7 @@ USTATUS FfsParser::addInfoRecursive(const UModelIndex & index) // Add physical address of the whole item or it's header and data portions separately UINT64 address = addressDiff + model->base(index); if (address <= 0xFFFFFFFFUL) { - UINT32 headerSize = model->header(index).size(); + UINT32 headerSize = (UINT32)model->header(index).size(); if (headerSize) { model->addInfo(index, usprintf("Data address: %08Xh\n", address + headerSize),false); model->addInfo(index, usprintf("Header address: %08Xh\n", address), false); @@ -3355,7 +3391,11 @@ USTATUS FfsParser::addInfoRecursive(const UModelIndex & index) // Process child items for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) addInfoRecursive(index.child(i, 0)); +#else + addInfoRecursive(index.model()->index(i, 0, index)); +#endif } return U_SUCCESS; @@ -3443,7 +3483,7 @@ USTATUS FfsParser::checkProtectedRanges(const UModelIndex & index) else { bgProtectedRanges[i].Offset = model->base(dxeRootVolumeIndex); - bgProtectedRanges[i].Size = model->header(dxeRootVolumeIndex).size() + model->body(dxeRootVolumeIndex).size() + model->tail(dxeRootVolumeIndex).size(); + bgProtectedRanges[i].Size = (UINT32)(model->header(dxeRootVolumeIndex).size() + model->body(dxeRootVolumeIndex).size() + model->tail(dxeRootVolumeIndex).size()); protectedParts = openedImage.mid(bgProtectedRanges[i].Offset, bgProtectedRanges[i].Size); UByteArray digest(SHA256_DIGEST_SIZE, '\x00'); @@ -3534,7 +3574,7 @@ USTATUS FfsParser::markProtectedRangeRecursive(const UModelIndex & index, const // Mark normal items else { UINT32 currentOffset = model->base(index); - UINT32 currentSize = model->header(index).size() + model->body(index).size() + model->tail(index).size(); + UINT32 currentSize = (UINT32)(model->header(index).size() + model->body(index).size() + model->tail(index).size()); if (std::min(currentOffset + currentSize, range.Offset + range.Size) > std::max(currentOffset, range.Offset)) { if (range.Offset <= currentOffset && currentOffset + currentSize <= range.Offset + range.Size) { // Mark as fully in range @@ -3552,7 +3592,11 @@ USTATUS FfsParser::markProtectedRangeRecursive(const UModelIndex & index, const } for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) markProtectedRangeRecursive(index.child(i, 0), range); +#else + markProtectedRangeRecursive(index.model()->index(i, 0, index), range); +#endif } return U_SUCCESS; @@ -3856,7 +3900,12 @@ void FfsParser::findFitRecursive(const UModelIndex & index, UModelIndex & found, // Process child items for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) findFitRecursive(index.child(i, 0), found, fitOffset); +#else + findFitRecursive(index.model()->index(i, 0, index), found, fitOffset); +#endif + if (found.isValid()) return; } @@ -3864,11 +3913,11 @@ void FfsParser::findFitRecursive(const UModelIndex & index, UModelIndex & found, // Check for all FIT signatures in item's body UByteArray lastVtfBody = model->body(lastVtf); UINT32 storedFitAddress = *(const UINT32*)(lastVtfBody.constData() + lastVtfBody.size() - FIT_POINTER_OFFSET); - for (INT32 offset = model->body(index).indexOf(FIT_SIGNATURE); + for (INT32 offset = (INT32)model->body(index).indexOf(FIT_SIGNATURE); offset >= 0; - offset = model->body(index).indexOf(FIT_SIGNATURE, offset + 1)) { + offset = (INT32)model->body(index).indexOf(FIT_SIGNATURE, offset + 1)) { // FIT candidate found, calculate it's physical address - UINT32 fitAddress = model->base(index) + (UINT32)addressDiff + model->header(index).size() + (UINT32)offset; + UINT32 fitAddress = (UINT32)(model->base(index) + (UINT32)addressDiff + model->header(index).size() + (UINT32)offset); // Check FIT address to be stored in the last VTF if (fitAddress == storedFitAddress) { @@ -4062,7 +4111,7 @@ USTATUS FfsParser::parseFitEntryBootGuardKeyManifest(const UByteArray & keyManif USTATUS FfsParser::findNextBootGuardBootPolicyElement(const UByteArray & bootPolicy, const UINT32 elementOffset, UINT32 & nextElementOffset, UINT32 & nextElementSize) { - UINT32 dataSize = bootPolicy.size(); + UINT32 dataSize = (UINT32)bootPolicy.size(); if (dataSize < sizeof(UINT64)) { return U_ELEMENTS_NOT_FOUND; } diff --git a/common/ffsreport.cpp b/common/ffsreport.cpp index 6f06745..8685352 100644 --- a/common/ffsreport.cpp +++ b/common/ffsreport.cpp @@ -49,7 +49,7 @@ USTATUS FfsReport::generateRecursive(std::vector & report, const UModel // Calculate item CRC32 UByteArray data = model->header(index) + model->body(index) + model->tail(index); - UINT32 crc = (UINT32)crc32(0, (const UINT8*)data.constData(), data.size()); + UINT32 crc = (UINT32)crc32(0, (const UINT8*)data.constData(), (uInt)data.size()); // Information on current item UString text = model->text(index); @@ -68,7 +68,11 @@ USTATUS FfsReport::generateRecursive(std::vector & report, const UModel // Information on child items for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) generateRecursive(report, index.child(i,0), level + 1); +#else + generateRecursive(report, index.model()->index(i,0,index), level + 1); +#endif } return U_SUCCESS; diff --git a/common/ffsutils.cpp b/common/ffsutils.cpp index 45315f2..c9c67a7 100644 --- a/common/ffsutils.cpp +++ b/common/ffsutils.cpp @@ -40,7 +40,12 @@ USTATUS findFileRecursive(TreeModel *model, const UModelIndex index, const UStri bool hasChildren = (model->rowCount(index) > 0); for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) findFileRecursive(model, index.child(i, index.column()), hexPattern, mode, files); +#else + findFileRecursive(model, index.model()->index(i, index.column(), index), hexPattern, mode, files); +#endif + } UByteArray data; diff --git a/common/guiddatabase.cpp b/common/guiddatabase.cpp index a914821..ee56bc6 100644 --- a/common/guiddatabase.cpp +++ b/common/guiddatabase.cpp @@ -116,7 +116,12 @@ GuidDatabase guidDatabaseFromTreeRecursive(TreeModel * model, const UModelIndex return db; for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) GuidDatabase tmpDb = guidDatabaseFromTreeRecursive(model, index.child(i, index.column())); +#else + GuidDatabase tmpDb = guidDatabaseFromTreeRecursive(model, index.model()->index(i, index.column(), index)); +#endif + db.insert(tmpDb.begin(), tmpDb.end()); } diff --git a/common/meparser.cpp b/common/meparser.cpp index 7ce0153..a42de39 100755 --- a/common/meparser.cpp +++ b/common/meparser.cpp @@ -165,7 +165,7 @@ USTATUS MeParser::parseFptRegion(const UByteArray & region, const UModelIndex & // Add partition table entries std::vector partitions; - UINT32 offset = header.size(); + UINT32 offset = (UINT32)header.size(); const FPT_HEADER_ENTRY* firstPtEntry = (const FPT_HEADER_ENTRY*)(region.constData() + offset); for (UINT8 i = 0; i < ptHeader->NumEntries; i++) { // Populate entry header @@ -265,7 +265,7 @@ make_partition_table_consistent: // Check for padding after the last region if ((UINT32)partitions.back().ptEntry.Offset + (UINT32)partitions.back().ptEntry.Size < (UINT32)region.size()) { padding.ptEntry.Offset = partitions.back().ptEntry.Offset + partitions.back().ptEntry.Size; - padding.ptEntry.Size = region.size() - padding.ptEntry.Offset; + padding.ptEntry.Size = (UINT32)(region.size() - padding.ptEntry.Offset); padding.type = Types::Padding; partitions.push_back(padding); } @@ -422,7 +422,7 @@ make_partition_table_consistent: // Check for padding after the last region if ((UINT32)partitions.back().ptEntry.Offset + (UINT32)partitions.back().ptEntry.Size < (UINT32)region.size()) { padding.ptEntry.Offset = partitions.back().ptEntry.Offset + partitions.back().ptEntry.Size; - padding.ptEntry.Size = region.size() - padding.ptEntry.Offset; + padding.ptEntry.Size = (UINT32)(region.size() - padding.ptEntry.Offset); padding.type = Types::Padding; partitions.push_back(padding); } @@ -604,7 +604,7 @@ make_partition_table_consistent: // Check for padding after the last region if ((UINT32)partitions.back().ptEntry.Offset + (UINT32)partitions.back().ptEntry.Size < (UINT32)region.size()) { padding.ptEntry.Offset = partitions.back().ptEntry.Offset + partitions.back().ptEntry.Size; - padding.ptEntry.Size = region.size() - padding.ptEntry.Offset; + padding.ptEntry.Size = (UINT32)(region.size() - padding.ptEntry.Offset); padding.type = Types::Padding; partitions.push_back(padding); } diff --git a/common/nvramparser.cpp b/common/nvramparser.cpp index 7fd684e..275b790 100755 --- a/common/nvramparser.cpp +++ b/common/nvramparser.cpp @@ -45,7 +45,7 @@ USTATUS NvramParser::parseNvarStore(const UModelIndex & index) } // Get local offset - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); // Get item data const UByteArray data = model->body(index); @@ -121,7 +121,7 @@ USTATUS NvramParser::parseNvarStore(const UModelIndex & index) guidArea.size(), guidArea.size(), guidsInStore); // Add tree item - model->addItem(localOffset + offset + padding.size(), Types::Padding, getPaddingType(guidArea), name, UString(), info, UByteArray(), guidArea, UByteArray(), Fixed, index); + model->addItem((UINT32)(localOffset + offset + padding.size()), Types::Padding, getPaddingType(guidArea), name, UString(), info, UByteArray(), guidArea, UByteArray(), Fixed, index); return U_SUCCESS; } @@ -230,7 +230,12 @@ USTATUS NvramParser::parseNvarStore(const UModelIndex & index) // Search previously added entries for a link to this variable // WARNING: O(n^2), may be very slow for (int i = model->rowCount(index) - 1; i >= 0; i--) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) nvarIndex = index.child(i, 0); +#else + nvarIndex = index.model()->index(i, 0, index); +#endif + if (model->hasEmptyParsingData(nvarIndex) == false) { UByteArray nvarData = model->parsingData(nvarIndex); const NVAR_ENTRY_PARSING_DATA nvarPdata = readUnaligned((const NVAR_ENTRY_PARSING_DATA*)nvarData.constData()); @@ -261,11 +266,16 @@ USTATUS NvramParser::parseNvarStore(const UModelIndex & index) UINT32 nameSize = 0; if (entryHeader->Attributes & NVRAM_NVAR_ENTRY_ASCII_NAME) { // Name is stored as ASCII string of CHAR8s text = UString(namePtr); - nameSize = text.length() + 1; + nameSize = (UINT32)(text.length() + 1); } else { // Name is stored as UCS2 string of CHAR16s +#if QT_VERSION_MAJOR >= 6 + text = UString::fromUtf16((char16_t*)namePtr); +#else text = UString::fromUtf16((CHAR16*)namePtr); - nameSize = (text.length() + 1) * 2; +#endif + + nameSize = (UINT32)((text.length() + 1) * 2); } // Get entry GUID @@ -388,7 +398,7 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index) } // Get local offset - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); // Get item data UByteArray data = model->body(index); @@ -455,7 +465,7 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index) // Update variables prevStoreOffset = storeOffset; - prevStoreSize = padding.size(); + prevStoreSize = (UINT32)padding.size(); break; } @@ -497,7 +507,12 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index) // Parse bodies for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex current = index.child(i, 0); +#else + UModelIndex current = index.model()->index(i, 0, index); +#endif + switch (model->type(current)) { case Types::FdcStore: parseFdcStoreBody(current); @@ -528,7 +543,7 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index) USTATUS NvramParser::findNextStore(const UModelIndex & index, const UByteArray & volume, const UINT32 localOffset, const UINT32 storeOffset, UINT32 & nextStoreOffset) { - UINT32 dataSize = volume.size(); + UINT32 dataSize = (UINT32)volume.size(); if (dataSize < sizeof(UINT32)) return U_STORES_NOT_FOUND; @@ -1286,7 +1301,7 @@ USTATUS NvramParser::parseFdcStoreBody(const UModelIndex & index) const UByteArray data = model->body(index); // Get local offset - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); // The body is a firmware volume with either a VSS or VSS2 store UModelIndex volumeIndex; @@ -1300,14 +1315,14 @@ USTATUS NvramParser::parseFdcStoreBody(const UModelIndex & index) UByteArray store = model->body(volumeIndex); if ((UINT32)store.size() >= sizeof(UINT32) && *(const UINT32*)store.constData() == NVRAM_VSS_STORE_SIGNATURE) { UModelIndex vssIndex; - status = parseVssStoreHeader(store, localOffset + model->header(volumeIndex).size(), true, volumeIndex, vssIndex); + status = parseVssStoreHeader(store, (UINT32)(localOffset + model->header(volumeIndex).size()), true, volumeIndex, vssIndex); if (status) return status; return parseVssStoreBody(vssIndex, 0); } else if ((UINT32)store.size() >= sizeof(EFI_GUID) && store.left(sizeof(EFI_GUID)) == NVRAM_FDC_STORE_GUID) { UModelIndex vss2Index; - status = parseVss2StoreHeader(store, localOffset + model->header(volumeIndex).size(), true, volumeIndex, vss2Index); + status = parseVss2StoreHeader(store, (UINT32)(localOffset + model->header(volumeIndex).size()), true, volumeIndex, vss2Index); if (status) return status; return parseVssStoreBody(vss2Index, 0); @@ -1335,7 +1350,7 @@ USTATUS NvramParser::parseVssStoreBody(const UModelIndex & index, UINT8 alignmen } // Get local offset - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); // Get item data const UByteArray data = model->body(index); @@ -1396,7 +1411,7 @@ USTATUS NvramParser::parseVssStoreBody(const UModelIndex & index, UINT8 alignmen // Calculate CRC32 of the variable data storedCrc32 = appleVariableHeader->DataCrc32; - calculatedCrc32 = (UINT32)crc32(0, (const UINT8*)body.constData(), body.size()); + calculatedCrc32 = (UINT32)crc32(0, (const UINT8*)body.constData(), (uInt)body.size()); } } @@ -1501,7 +1516,12 @@ USTATUS NvramParser::parseVssStoreBody(const UModelIndex & index, UINT8 alignmen else { // Add GUID and text for valid variables name = guidToUString(readUnaligned(variableGuid)); info += UString("Variable GUID: ") + guidToUString(readUnaligned(variableGuid), false) + UString("\n"); + +#if QT_VERSION_MAJOR >= 6 + text = UString::fromUtf16((char16_t *)variableName); +#else text = UString::fromUtf16(variableName); +#endif } // Add info @@ -1555,7 +1575,7 @@ USTATUS NvramParser::parseFsysStoreBody(const UModelIndex & index) return U_INVALID_PARAMETER; // Get local offset - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); // Get item data const UByteArray data = model->body(index); @@ -1658,7 +1678,7 @@ USTATUS NvramParser::parseEvsaStoreBody(const UModelIndex & index) } // Get local offset - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); // Get item data const UByteArray data = model->body(index); @@ -1732,7 +1752,13 @@ USTATUS NvramParser::parseEvsaStoreBody(const UModelIndex & index) const EVSA_NAME_ENTRY* nameHeader = (const EVSA_NAME_ENTRY*)entryHeader; header = data.mid(offset, sizeof(EVSA_NAME_ENTRY)); body = data.mid(offset + sizeof(EVSA_NAME_ENTRY), nameHeader->Header.Size - sizeof(EVSA_NAME_ENTRY)); + +#if QT_VERSION_MAJOR >= 6 + name = UString::fromUtf16((const char16_t *)body.constData()); +#else name = UString::fromUtf16((const CHAR16*)body.constData()); +#endif + info = UString("Name: ") + name + usprintf("\nFull size: %Xh (%u)\nHeader size %Xh (%u)\nBody size: %Xh (%u)\nType: %02Xh\nChecksum: %02Xh", variableSize, variableSize, header.size(), header.size(), @@ -1805,7 +1831,12 @@ USTATUS NvramParser::parseEvsaStoreBody(const UModelIndex & index) // Reparse all data variables to detect invalid ones and assign name and test to valid ones for (int i = 0; i < model->rowCount(index); i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex current = index.child(i, 0); +#else + UModelIndex current = index.model()->index(i, 0, index); +#endif + if (model->subtype(current) == Subtypes::DataEvsaEntry) { UByteArray header = model->header(current); const EVSA_DATA_ENTRY* dataHeader = (const EVSA_DATA_ENTRY*)header.constData(); @@ -1857,7 +1888,7 @@ USTATUS NvramParser::parseFlashMapBody(const UModelIndex & index) return U_INVALID_PARAMETER; // Get parsing data for the current item - UINT32 localOffset = model->header(index).size(); + UINT32 localOffset = (UINT32)model->header(index).size(); const UByteArray data = model->body(index); diff --git a/common/sha256.c b/common/sha256.c index 9177f45..cd269b1 100644 --- a/common/sha256.c +++ b/common/sha256.c @@ -109,8 +109,8 @@ static void sha256_compress(struct sha256_state *md, unsigned char *buf) } /* Compress */ #define RND(a,b,c,d,e,f,g,h,i) \ -t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ -t1 = Sigma0(a) + Maj(a, b, c); \ +t0 = (uint32_t)(h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]); \ +t1 = (uint32_t)(Sigma0(a) + Maj(a, b, c)); \ d += t0; \ h = t0 + t1; for (i = 0; i < 64; ++i) { diff --git a/common/treemodel.cpp b/common/treemodel.cpp index 60b29b1..99b0442 100644 --- a/common/treemodel.cpp +++ b/common/treemodel.cpp @@ -43,7 +43,7 @@ QVariant TreeModel::data(const UModelIndex &index, int role) const Qt::ItemFlags TreeModel::flags(const UModelIndex &index) const { if (!index.isValid()) - return 0; + return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } @@ -559,9 +559,14 @@ UModelIndex TreeModel::findByBase(UINT32 base) const goDeeper: int n = rowCount(parentIndex); for (int i = 0; i < n; i++) { +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) UModelIndex currentIndex = parentIndex.child(i, 0); +#else + UModelIndex currentIndex = parentIndex.model()->index(i, 0, parentIndex); +#endif + UINT32 currentBase = this->base(currentIndex); - UINT32 fullSize = header(currentIndex).size() + body(currentIndex).size() + tail(currentIndex).size(); + UINT32 fullSize = (UINT32)(header(currentIndex).size() + body(currentIndex).size() + tail(currentIndex).size()); if ((compressed(currentIndex) == false || (compressed(currentIndex) == true && compressed(currentIndex.parent()) == false)) // Base is meaningful only for true uncompressed items && currentBase <= base && base < currentBase + fullSize) { // Base must be in range [currentBase, currentBase + fullSize) // Found a better candidate diff --git a/common/treemodel.h b/common/treemodel.h index b1ef19e..5e90dd9 100644 --- a/common/treemodel.h +++ b/common/treemodel.h @@ -86,7 +86,6 @@ private: #if defined(QT_CORE_LIB) class TreeModel : public QAbstractItemModel { - Q_OBJECT private: TreeItem *rootItem; bool markingEnabledFlag; diff --git a/common/ubytearray.h b/common/ubytearray.h index 6cf2710..143b850 100644 --- a/common/ubytearray.h +++ b/common/ubytearray.h @@ -45,14 +45,14 @@ public: UByteArray toUpper() { std::basic_string s = d; std::transform(s.begin(), s.end(), s.begin(), ::toupper); return UByteArray(s); } uint32_t toUInt(bool* ok = NULL, const uint8_t base = 10) { return (uint32_t)strtoul(d.c_str(), NULL, base); } - int32_t size() const { return d.size(); } - int32_t count(char ch) const { return std::count(d.begin(), d.end(), ch); } + int32_t size() const { return (int32_t)d.size(); } + int32_t count(char ch) const { return (int32_t)std::count(d.begin(), d.end(), ch); } char at(uint32_t i) const { return d.at(i); } char operator[](uint32_t i) const { return d[i]; } char& operator[](uint32_t i) { return d[i]; } bool startsWith(const UByteArray & ba) const { return 0 == d.find(ba.d, 0); } - int indexOf(const UByteArray & ba, int from = 0) const { return d.find(ba.d, from); } + int indexOf(const UByteArray & ba, int from = 0) const { return (int)d.find(ba.d, from); } int lastIndexOf(const UByteArray & ba, int from = 0) const { size_t old_index = d.npos; size_t index = d.find(ba.d, from); @@ -60,7 +60,7 @@ public: old_index = index; index = d.find(ba.d, index + 1); } - return old_index; + return (int)old_index; } UByteArray left(int32_t len) const { return d.substr(0, len); } diff --git a/common/ustring.cpp b/common/ustring.cpp index 89cfe36..d9d7bd4 100644 --- a/common/ustring.cpp +++ b/common/ustring.cpp @@ -19,7 +19,13 @@ UString usprintf(const char* fmt, ...) UString msg; va_list vl; va_start(vl, fmt); + +#if ((QT_VERSION_MAJOR == 5) && (QT_VERSION_MINOR < 6)) || (QT_VERSION_MAJOR < 5) msg.vsprintf(fmt, vl); +#else + msg = msg.vasprintf(fmt, vl); +#endif + va_end(vl); return msg; }; diff --git a/common/utility.cpp b/common/utility.cpp index 3e9f418..0cfd203 100755 --- a/common/utility.cpp +++ b/common/utility.cpp @@ -102,7 +102,7 @@ UString uniqueItemName(const UModelIndex & index) '<', '>', ':', '\"', '\\', '|', '?', '*', // Banned in Windows ' ' // Provides better readability }; - int nameLength = name.length(); // Note: Qt uses int for whatever reason. + int nameLength = (int)name.length(); // Note: Qt uses int for whatever reason. for (int i = 0; i < nameLength; i++) { for (size_t j = 0; j < sizeof(table); j++) { if (name[i] == table[j]) { @@ -200,7 +200,7 @@ USTATUS decompress(const UByteArray & compressedData, const UINT8 compressionTyp // Get buffer sizes data = (UINT8*)compressedData.data(); - dataSize = compressedData.size(); + dataSize = (UINT32)compressedData.size(); // Check header to be valid header = (const EFI_TIANO_HEADER*)data; @@ -260,7 +260,7 @@ USTATUS decompress(const UByteArray & compressedData, const UINT8 compressionTyp // Get buffer sizes data = (const UINT8*)compressedData.constData(); - dataSize = compressedData.size(); + dataSize = (UINT32)compressedData.size(); // Get info as normal LZMA section if (U_SUCCESS != LzmaGetInfo(data, dataSize, &decompressedSize)) { @@ -305,7 +305,7 @@ USTATUS decompress(const UByteArray & compressedData, const UINT8 compressionTyp // Get buffer sizes data = (const UINT8*)compressedData.constData(); - dataSize = compressedData.size(); + dataSize = (UINT32)compressedData.size(); // Get info as normal LZMA section if (U_SUCCESS != LzmaGetInfo(data, dataSize, &decompressedSize)) { @@ -498,7 +498,7 @@ USTATUS gzipDecompress(const UByteArray & input, UByteArray & output) z_stream stream; stream.next_in = (z_const Bytef *)input.data(); - stream.avail_in = input.size(); + stream.avail_in = (uInt)input.size(); stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; diff --git a/version.h b/version.h index 0b43aa8..711b3c4 100644 --- a/version.h +++ b/version.h @@ -14,6 +14,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #ifndef VERSION_H #define VERSION_H -#define PROGRAM_VERSION "NE alpha 58" " (" __DATE__ ")" +#define PROGRAM_VERSION "NE alpha 59" " (" __DATE__ ")" #endif // VERSION_H