diff --git a/src/bridge/bridgemain.h b/src/bridge/bridgemain.h index 758c4dd6..1fe7e6ac 100644 --- a/src/bridge/bridgemain.h +++ b/src/bridge/bridgemain.h @@ -176,7 +176,10 @@ extern "C" #define MAX_SECTION_SIZE 10 #define MAX_COMMAND_LINE_SIZE 256 #define MAX_MNEMONIC_SIZE 64 + +#ifndef PAGE_SIZE #define PAGE_SIZE 0x1000 +#endif // PAGE_SIZE //Debugger enums typedef enum diff --git a/src/gui/Src/BasicView/AbstractSearchList.h b/src/gui/Src/BasicView/AbstractSearchList.h index e537c440..fa779491 100644 --- a/src/gui/Src/BasicView/AbstractSearchList.h +++ b/src/gui/Src/BasicView/AbstractSearchList.h @@ -19,11 +19,11 @@ public: virtual void unlock() = 0; virtual AbstractStdTable* list() const = 0; virtual AbstractStdTable* searchList() const = 0; - virtual void filter(const QString & filter, FilterType type, int startColumn) = 0; + virtual void filter(const QString & filter, FilterType type, duint startColumn) = 0; - bool rowMatchesFilter(const QString & filter, FilterType type, int row, int startColumn) const + bool rowMatchesFilter(const QString & filter, FilterType type, duint row, duint startColumn) const { - int count = list()->getColumnCount(); + auto count = list()->getColumnCount(); if(startColumn + 1 > count) return false; auto cs = Qt::CaseInsensitive; @@ -32,21 +32,21 @@ public: case FilterStartsWithTextCaseSensitive: cs = Qt::CaseSensitive; case FilterStartsWithTextCaseInsensitive: - for(int i = startColumn; i < count; i++) + for(duint i = startColumn; i < count; i++) if(list()->getCellContent(row, i).startsWith(filter, cs)) return true; break; case FilterContainsTextCaseSensitive: cs = Qt::CaseSensitive; case FilterContainsTextCaseInsensitive: - for(int i = startColumn; i < count; i++) + for(duint i = startColumn; i < count; i++) if(list()->getCellContent(row, i).contains(filter, cs)) return true; break; case FilterRegexCaseSensitive: cs = Qt::CaseSensitive; case FilterRegexCaseInsensitive: - for(int i = startColumn; i < count; i++) + for(duint i = startColumn; i < count; i++) if(list()->getCellContent(row, i).contains(QRegExp(filter, cs))) return true; break; diff --git a/src/gui/Src/BasicView/AbstractStdTable.cpp b/src/gui/Src/BasicView/AbstractStdTable.cpp index 2618b26f..1a81bd88 100644 --- a/src/gui/Src/BasicView/AbstractStdTable.cpp +++ b/src/gui/Src/BasicView/AbstractStdTable.cpp @@ -811,10 +811,10 @@ QString AbstractStdTable::copyTable(const std::vector & colWidths) finalText += getColTitle(i); } finalText += "\r\n"; - for(int i = 0; i < rowCount; i++) + for(duint i = 0; i < rowCount; i++) { QString finalRowText = ""; - for(int j = 0; j < colCount; j++) + for(duint j = 0; j < colCount; j++) { if(j) finalRowText += " "; @@ -857,7 +857,7 @@ void AbstractStdTable::copyTableResizeSlot() for(duint i = 0; i < colCount; i++) { auto max = getCellContent(0, i).length(); - for(int j = 1; j < rowCount; j++) + for(duint j = 1; j < rowCount; j++) max = std::max(getCellContent(j, i).length(), max); colWidths.push_back(max); } @@ -894,7 +894,7 @@ void AbstractStdTable::exportTableSlot() { std::vector headers; headers.reserve(getColumnCount()); - for(int i = 0; i < getColumnCount(); i++) + for(duint i = 0; i < getColumnCount(); i++) headers.push_back(getColTitle(i)); ExportCSV(getRowCount(), getColumnCount(), headers, [this](duint row, duint column) { @@ -975,7 +975,7 @@ void AbstractStdTable::setupCopyColumnMenu(MenuBuilder* copyMenu) { copyMenu->addBuilder(new MenuBuilder(this, [this](QMenu * menu) { - for(int i = 0; i < getColumnCount(); i++) + for(duint i = 0; i < getColumnCount(); i++) { if(!getCellContent(getInitialSelection(), i).length()) //skip empty cells continue; diff --git a/src/gui/Src/BasicView/AbstractTableView.cpp b/src/gui/Src/BasicView/AbstractTableView.cpp index 7d7d78a8..ff241b6c 100644 --- a/src/gui/Src/BasicView/AbstractTableView.cpp +++ b/src/gui/Src/BasicView/AbstractTableView.cpp @@ -132,7 +132,7 @@ void AbstractTableView::updateShortcutsSlot() void AbstractTableView::loadColumnFromConfig(const QString & viewName) { duint columnCount = getColumnCount(); - for(int i = 0; i < columnCount; i++) + for(duint i = 0; i < columnCount; i++) { duint width = ConfigUint("Gui", QString("%1ColumnWidth%2").arg(viewName).arg(i).toUtf8().constData()); duint hidden = ConfigUint("Gui", QString("%1ColumnHidden%2").arg(viewName).arg(i).toUtf8().constData()); @@ -224,7 +224,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) QPen separatorPen(mSeparatorColor, 2); QBrush backgroundBrush(mHeaderBackgroundColor); - for(int j = 0; j < getColumnCount(); j++) + for(duint j = 0; j < getColumnCount(); j++) { int i = mColumnOrder[j]; if(getColumnHidden(i)) @@ -267,7 +267,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) int y = getHeaderHeight(); // Iterate over all columns and cells - for(int k = 0; k < getColumnCount(); k++) + for(duint k = 0; k < getColumnCount(); k++) { int j = mColumnOrder[k]; if(getColumnHidden(j)) @@ -322,8 +322,8 @@ void AbstractTableView::mouseMoveEvent(QMouseEvent* event) { if(getColumnCount() <= 1) return; - int colIndex = getColumnIndexFromX(event->x()); - int displayIndex = getColumnDisplayIndexFromX(event->x()); + auto colIndex = getColumnIndexFromX(event->x()); + auto displayIndex = getColumnDisplayIndexFromX(event->x()); int startPos = getColumnPosition(displayIndex); // Position X of the start of column int endPos = startPos + getColumnWidth(colIndex); // Position X of the end of column bool onHandle = ((colIndex != 0) && (event->x() >= startPos) && (event->x() <= (startPos + 2))) || ((event->x() <= endPos) && (event->x() >= (endPos - 2))); @@ -384,7 +384,7 @@ void AbstractTableView::mouseMoveEvent(QMouseEvent* event) case AbstractTableView::HeaderButtonPressed: { - int colIndex = getColumnIndexFromX(event->x()); + auto colIndex = getColumnIndexFromX(event->x()); if(colIndex == mHeader.activeButtonIndex) { @@ -447,7 +447,7 @@ void AbstractTableView::mousePressEvent(QMouseEvent* event) { mReorderStartX = event->x(); - int colIndex = getColumnIndexFromX(event->x()); + auto colIndex = getColumnIndexFromX(event->x()); if(mColumnList[colIndex].header.isClickable) { //qDebug() << "Button " << colIndex << "has been pressed."; @@ -515,7 +515,7 @@ void AbstractTableView::mouseReleaseEvent(QMouseEvent* event) } // Release all buttons - for(int i = 0; i < getColumnCount(); i++) + for(duint i = 0; i < getColumnCount(); i++) { mColumnList[i].header.isPressed = false; } @@ -904,7 +904,7 @@ void AbstractTableView::updateScrollBarRange(duint range) { // Count leading zeros int leadingZeroCount = 0; - for(duint mask = 0x8000000000000000; mask != 0; mask >>= 1) + for(uint64_t mask = 0x8000000000000000; mask != 0; mask >>= 1) { if((maxTableOffset & mask) != 0) { @@ -954,28 +954,23 @@ dsint AbstractTableView::getIndexOffsetFromY(int y) const duint AbstractTableView::getColumnIndexFromX(int x) const { int scrollX = -horizontalScrollBar()->value(); - duint colIndex = 0; - while(colIndex < getColumnCount()) + for(duint colIndex = 0; colIndex < getColumnCount(); colIndex++) { auto col = mColumnOrder[colIndex]; if(getColumnHidden(col)) { - colIndex++; continue; } - scrollX += getColumnWidth(col); + scrollX += getColumnWidth(col); if(x <= scrollX) { return mColumnOrder[colIndex]; } - else if(colIndex < getColumnCount()) - { - colIndex++; - } } - return getColumnCount() > 0 ? mColumnOrder[getColumnCount() - 1] : -1; + + return getColumnCount() > 0 ? mColumnOrder[getColumnCount() - 1] : - 1; } /** @@ -985,31 +980,27 @@ duint AbstractTableView::getColumnIndexFromX(int x) const * * @return Displayed index. */ -int AbstractTableView::getColumnDisplayIndexFromX(int x) +duint AbstractTableView::getColumnDisplayIndexFromX(int x) { int scrollX = -horizontalScrollBar()->value(); - int colIndex = 0; - while(colIndex < getColumnCount()) + for(duint colIndex = 0; colIndex < getColumnCount(); colIndex++) { auto col = mColumnOrder[colIndex]; if(getColumnHidden(col)) { - colIndex++; continue; } - scrollX += getColumnWidth(col); + scrollX += getColumnWidth(col); if(x <= scrollX) { return colIndex; } - else if(colIndex < getColumnCount()) - { - colIndex++; - } } - return getColumnCount() - 1; + + // TODO: what if there are no columns? + return getColumnCount() > 0 ? getColumnCount() - 1 : -1; } void AbstractTableView::updateLastColumnWidth() @@ -1020,7 +1011,7 @@ void AbstractTableView::updateLastColumnWidth() int totalWidth = 0; int lastWidth = totalWidth; int last = 0; - for(int i = 0; i < getColumnCount(); i++) + for(duint i = 0; i < getColumnCount(); i++) { if(getColumnHidden(mColumnOrder[i])) continue; @@ -1041,7 +1032,7 @@ void AbstractTableView::updateLastColumnWidth() MethodInvoker::invokeMethod([this]() { int totalWidth = 0; - for(int i = 0; i < getColumnCount(); i++) + for(duint i = 0; i < getColumnCount(); i++) if(!getColumnHidden(i)) totalWidth += getColumnWidth(i); @@ -1065,7 +1056,7 @@ int AbstractTableView::getColumnPosition(duint index) const if((index >= 0) && (index < getColumnCount())) { - for(int i = 0; i < index; i++) + for(duint i = 0; i < index; i++) if(!getColumnHidden(mColumnOrder[i])) posX += getColumnWidth(mColumnOrder[i]); return posX; @@ -1150,7 +1141,7 @@ void AbstractTableView::deleteAllColumns() void AbstractTableView::setColTitle(duint col, const QString & title) { - if(mColumnList.size() > 0 && col >= 0 && col < mColumnList.size()) + if(mColumnList.size() > 0 && col < mColumnList.size()) { Column column = mColumnList.takeAt(col); column.title = title; @@ -1160,7 +1151,7 @@ void AbstractTableView::setColTitle(duint col, const QString & title) QString AbstractTableView::getColTitle(duint col) const { - if(mColumnList.size() > 0 && col >= 0 && col < mColumnList.size()) + if(mColumnList.size() > 0 && col < mColumnList.size()) return mColumnList[col].title; return QString(); } diff --git a/src/gui/Src/BasicView/Disassembly.cpp b/src/gui/Src/BasicView/Disassembly.cpp index 0209b129..0d8dfccb 100644 --- a/src/gui/Src/BasicView/Disassembly.cpp +++ b/src/gui/Src/BasicView/Disassembly.cpp @@ -8,10 +8,10 @@ #include "MemoryPage.h" #include "DisassemblyPopup.h" -Disassembly::Disassembly(QWidget* parent, bool isMain, Architecture* architecture) +Disassembly::Disassembly(Architecture* architecture, bool isMain, QWidget* parent) : AbstractTableView(parent), - mIsMain(isMain), - mArchitecture(architecture) + mArchitecture(architecture), + mIsMain(isMain) { mMemPage = new MemoryPage(0, 0); @@ -73,6 +73,11 @@ Disassembly::~Disassembly() BridgeFree(mXrefInfo.references); } +Architecture* Disassembly::getArchitecture() const +{ + return mArchitecture; +} + void Disassembly::updateColors() { AbstractTableView::updateColors(); @@ -663,7 +668,7 @@ void Disassembly::mouseMoveEvent(QMouseEvent* event) if((transY(y) >= 0) && (transY(y) <= this->getTableHeight())) { - int i = getIndexOffsetFromY(transY(y)); + auto i = getIndexOffsetFromY(transY(y)); if(mMemPage->getSize() > 0) { @@ -713,7 +718,7 @@ duint Disassembly::getAddressForPosition(int mousex, int mousey) return 0; //Don't show this in highlight mode if(getColumnIndexFromX(mousex) != 2) return 0; //Disassembly popup for other column is undefined - int rowOffset = getIndexOffsetFromY(transY(mousey)); + auto rowOffset = getIndexOffsetFromY(transY(mousey)); if(rowOffset < mInstBuffer.size()) { ZydisTokenizer::SingleToken token; @@ -752,7 +757,7 @@ void Disassembly::mousePressEvent(QMouseEvent* event) { if(getColumnIndexFromX(event->x()) == 2) //click in instruction column { - int rowOffset = getIndexOffsetFromY(transY(event->y())); + auto rowOffset = getIndexOffsetFromY(transY(event->y())); if(rowOffset < mInstBuffer.size()) { ZydisTokenizer::SingleToken token; @@ -790,7 +795,7 @@ void Disassembly::mousePressEvent(QMouseEvent* event) { if(event->y() > getHeaderHeight()) { - dsint index = getIndexOffsetFromY(transY(event->y())); + auto index = getIndexOffsetFromY(transY(event->y())); if(mInstBuffer.size() > index && index >= 0) { diff --git a/src/gui/Src/BasicView/Disassembly.h b/src/gui/Src/BasicView/Disassembly.h index 6783bee0..30329ba4 100644 --- a/src/gui/Src/BasicView/Disassembly.h +++ b/src/gui/Src/BasicView/Disassembly.h @@ -13,8 +13,9 @@ class Disassembly : public AbstractTableView { Q_OBJECT public: - Disassembly(QWidget* parent, bool isMain, Architecture* architecture); + Disassembly(Architecture* architecture, bool isMain, QWidget* parent = nullptr); ~Disassembly() override; + Architecture* getArchitecture() const; // Configuration void updateColors() override; diff --git a/src/gui/Src/BasicView/HexDump.cpp b/src/gui/Src/BasicView/HexDump.cpp index 9505e192..23110790 100644 --- a/src/gui/Src/BasicView/HexDump.cpp +++ b/src/gui/Src/BasicView/HexDump.cpp @@ -4,6 +4,12 @@ #include "StringUtil.h" #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +#else +#include +#endif // QT_VERSION + static int getStringMaxLength(HexDump::DataDescriptor desc); static int byteStringMaxLength(HexDump::ByteViewMode mode); static int wordStringMaxLength(HexDump::WordViewMode mode); @@ -11,11 +17,10 @@ static int dwordStringMaxLength(HexDump::DwordViewMode mode); static int qwordStringMaxLength(HexDump::QwordViewMode mode); static int twordStringMaxLength(HexDump::TwordViewMode mode); -HexDump::HexDump(QWidget* parent) - : AbstractTableView(parent) +HexDump::HexDump(Architecture* architecture, QWidget* parent) + : AbstractTableView(parent), + mArchitecture(architecture) { - memset(&mSelection, 0, sizeof(SelectionData)); - setDrawDebugOnly(true); mGuiState = HexDump::NoState; @@ -149,49 +154,49 @@ void HexDump::copySelectionSlot() Bridge::CopyToClipboard(makeCopyText()); } -void HexDump::printDumpAt(dsint parVA, bool select, bool repaint, bool updateTableOffset) +void HexDump::printDumpAt(duint parVA, bool select, bool repaint, bool updateTableOffset) { - duint wSize; - auto wBase = DbgMemFindBaseAddr(parVA, &wSize); //get memory base - if(!wBase || !wSize) + duint size = 0; + auto base = DbgMemFindBaseAddr(parVA, &size); //get memory base + if(!base || !size) return; - dsint wRVA = parVA - wBase; //calculate rva - int wBytePerRowCount = getBytePerRowCount(); //get the number of bytes per row - dsint wRowCount; + auto rva = parVA - base; //calculate rva + auto bytePerRowCount = getBytePerRowCount(); //get the number of bytes per row // Byte offset used to be aligned on the given RVA - mByteOffset = (int)((dsint)wRVA % (dsint)wBytePerRowCount); - mByteOffset = mByteOffset > 0 ? wBytePerRowCount - mByteOffset : 0; + // TODO: check this logic + mByteOffset = (dsint)rva % (dsint)bytePerRowCount; + mByteOffset = mByteOffset > 0 ? (dsint)bytePerRowCount - mByteOffset : 0; // Compute row count - wRowCount = wSize / wBytePerRowCount; - wRowCount += mByteOffset > 0 ? 1 : 0; + auto rowCount = size / bytePerRowCount; + rowCount += mByteOffset > 0 ? 1 : 0; if(mRvaDisplayEnabled && mMemPage->getBase() != mRvaDisplayPageBase) mRvaDisplayEnabled = false; - setRowCount(wRowCount); //set the number of rows + setRowCount(rowCount); //set the number of rows - mMemPage->setAttributes(wBase, wSize); // Set base and size (Useful when memory page changed) + mMemPage->setAttributes(base, size); // Set base and size (Useful when memory page changed) if(updateTableOffset) { setTableOffset(-1); //make sure the requested address is always first - setTableOffset((wRVA + mByteOffset) / wBytePerRowCount); //change the displayed offset + setTableOffset((rva + mByteOffset) / bytePerRowCount); //change the displayed offset } if(select) { - setSingleSelection(wRVA); - dsint wEndingAddress = wRVA + getSizeOf(mDescriptor.at(0).data.itemSize) - 1; - expandSelectionUpTo(wEndingAddress); + setSingleSelection(rva); + auto endingAddress = rva + getSizeOf(mDescriptor.at(0).data.itemSize) - 1; + expandSelectionUpTo(endingAddress); } if(repaint) reloadData(); } -void HexDump::printDumpAt(dsint parVA) +void HexDump::printDumpAt(duint parVA) { printDumpAt(parVA, true); } @@ -206,7 +211,7 @@ void HexDump::gotoNextSlot() printDumpAt(mHistory.historyNext()); } -duint HexDump::rvaToVa(dsint rva) const +duint HexDump::rvaToVa(duint rva) const { return mMemPage->va(rva); } @@ -218,42 +223,39 @@ duint HexDump::getTableOffsetRva() const QString HexDump::makeAddrText(duint va) const { + bool addr64 = mArchitecture->addr64(); char label[MAX_LABEL_SIZE] = ""; QString addrText = ""; - dsint cur_addr = va; if(mRvaDisplayEnabled) //RVA display { - dsint rva = cur_addr - mRvaDisplayBase; - if(rva == 0) + dsint displayRva = va - mRvaDisplayBase; + if(displayRva == 0) { -#ifdef _WIN64 - addrText = "$ ==> "; -#else - addrText = "$ ==> "; -#endif //_WIN64 + if(addr64) + addrText = "$ ==> "; + else + addrText = "$ ==> "; } - else if(rva > 0) + else if(displayRva > 0) { -#ifdef _WIN64 - addrText = "$+" + QString("%1").arg(rva, -15, 16, QChar(' ')).toUpper(); -#else - addrText = "$+" + QString("%1").arg(rva, -7, 16, QChar(' ')).toUpper(); -#endif //_WIN64 + if(addr64) + addrText = "$+" + QString("%1").arg(displayRva, -15, 16, QChar(' ')).toUpper(); + else + addrText = "$+" + QString("%1").arg(displayRva, -7, 16, QChar(' ')).toUpper(); } - else if(rva < 0) + else if(displayRva < 0) { -#ifdef _WIN64 - addrText = "$-" + QString("%1").arg(-rva, -15, 16, QChar(' ')).toUpper(); -#else - addrText = "$-" + QString("%1").arg(-rva, -7, 16, QChar(' ')).toUpper(); -#endif //_WIN64 + if(addr64) + addrText = "$-" + QString("%1").arg(-displayRva, -15, 16, QChar(' ')).toUpper(); + else + addrText = "$-" + QString("%1").arg(-displayRva, -7, 16, QChar(' ')).toUpper(); } } - addrText += ToPtrString(cur_addr); - if(DbgGetLabelAt(cur_addr, SEG_DEFAULT, label)) //has label + addrText += ToPtrString(va); + if(DbgGetLabelAt(va, SEG_DEFAULT, label)) //has label { char module[MAX_MODULE_SIZE] = ""; - if(DbgGetModuleAt(cur_addr, module) && !QString(label).startsWith("JMP.&")) + if(DbgGetModuleAt(va, module) && !QString(label).startsWith("JMP.&")) addrText += " <" + QString(module) + "." + QString(label) + ">"; else addrText += " <" + QString(label) + ">"; @@ -265,14 +267,14 @@ QString HexDump::makeAddrText(duint va) const QString HexDump::makeCopyText() { - dsint deltaRowBase = getSelectionStart() % getBytePerRowCount() + mByteOffset; + auto deltaRowBase = getSelectionStart() % getBytePerRowCount() + mByteOffset; if(deltaRowBase >= getBytePerRowCount()) deltaRowBase -= getBytePerRowCount(); auto curRow = getSelectionStart() - deltaRowBase; QString result; while(curRow <= getSelectionEnd()) { - for(int col = 0; col < getColumnCount(); col++) + for(duint col = 0; col < getColumnCount(); col++) { if(col) result += " "; @@ -334,7 +336,7 @@ void HexDump::copyRvaSlot() void HexDump::mouseMoveEvent(QMouseEvent* event) { - bool wAccept = true; + bool accept = true; int x = event->x(); int y = event->y(); @@ -345,60 +347,62 @@ void HexDump::mouseMoveEvent(QMouseEvent* event) if((transY(y) >= 0) && y <= this->height()) { - int wColIndex = getColumnIndexFromX(x); + auto colIndex = getColumnIndexFromX(x); if(mForceColumn != -1) { - wColIndex = mForceColumn; + colIndex = mForceColumn; x = getColumnPosition(mForceColumn) + 1; } - if(wColIndex > 0) // No selection for first column (addresses) + if(colIndex > 0) // No selection for first column (addresses) { - dsint wStartingAddress = getItemStartingAddress(x, y); - dsint dataSize = getSizeOf(mDescriptor.at(wColIndex - 1).data.itemSize) - 1; - dsint wEndingAddress = wStartingAddress + dataSize; + auto startingAddress = getItemStartingAddress(x, y); + auto dataSize = getSizeOf(mDescriptor.at(colIndex - 1).data.itemSize) - 1; + auto endingAddress = startingAddress + dataSize; - if(wEndingAddress < (dsint)mMemPage->getSize()) + if(endingAddress < mMemPage->getSize()) { - if(wStartingAddress < getInitialSelection()) + if(startingAddress < getInitialSelection()) { - expandSelectionUpTo(wStartingAddress); + expandSelectionUpTo(startingAddress); mSelection.toIndex += dataSize; emit selectionUpdated(); } else - expandSelectionUpTo(wEndingAddress); + expandSelectionUpTo(endingAddress); mGuiState = HexDump::MultiRowsSelectionState; + // TODO: only update if the selection actually changed updateViewport(); } } else { - dsint wStartingAddress = getItemStartingAddress(getColumnPosition(1) + 1, y); - dsint dataSize = getSizeOf(mDescriptor.at(0).data.itemSize) * mDescriptor.at(0).itemCount - 1; - dsint wEndingAddress = wStartingAddress + dataSize; + auto startingAddress = getItemStartingAddress(getColumnPosition(1) + 1, y); + auto dataSize = getSizeOf(mDescriptor.at(0).data.itemSize) * mDescriptor.at(0).itemCount - 1; + auto endingAddress = startingAddress + dataSize; - if(wEndingAddress < (dsint)mMemPage->getSize()) + if(endingAddress < mMemPage->getSize()) { - if(wStartingAddress < getInitialSelection()) + if(startingAddress < getInitialSelection()) { - expandSelectionUpTo(wStartingAddress); + expandSelectionUpTo(startingAddress); mSelection.toIndex += dataSize; emit selectionUpdated(); } else - expandSelectionUpTo(wEndingAddress); + expandSelectionUpTo(endingAddress); mGuiState = HexDump::MultiRowsSelectionState; + // TODO: only update if the selection actually changed updateViewport(); } } - wAccept = true; + accept = true; } else if(y > this->height() && mGuiState == HexDump::MultiRowsSelectionState) { @@ -410,7 +414,7 @@ void HexDump::mouseMoveEvent(QMouseEvent* event) } } - if(wAccept == true) + if(accept) AbstractTableView::mouseMoveEvent(event); } @@ -420,7 +424,7 @@ void HexDump::mousePressEvent(QMouseEvent* event) { if(!DbgIsDebugging()) return; - MessageBeep(MB_OK); + QApplication::beep(); QString addrText = ToPtrString(rvaToVa(getInitialSelection())); Bridge::CopyToClipboard(addrText); return; @@ -430,7 +434,7 @@ void HexDump::mousePressEvent(QMouseEvent* event) int x = event->x(); int y = event->y(); - bool wAccept = false; + bool accept = false; if(((event->buttons() & Qt::LeftButton) != 0) && ((event->buttons() & Qt::RightButton) == 0)) { @@ -438,31 +442,31 @@ void HexDump::mousePressEvent(QMouseEvent* event) { if(y > getHeaderHeight() && y <= this->height()) { - int wColIndex = getColumnIndexFromX(x); + auto colIndex = getColumnIndexFromX(x); if(mForceColumn != -1) { - wColIndex = mForceColumn; + colIndex = mForceColumn; x = getColumnPosition(mForceColumn) + 1; } - if(wColIndex > 0 && mDescriptor.at(wColIndex - 1).isData == true) // No selection for first column (addresses) and no data columns + if(colIndex > 0 && mDescriptor.at(colIndex - 1).isData) // No selection for first column (addresses) and no data columns { - dsint wStartingAddress = getItemStartingAddress(x, y); - dsint dataSize = getSizeOf(mDescriptor.at(wColIndex - 1).data.itemSize) - 1; - dsint wEndingAddress = wStartingAddress + dataSize; + auto startingAddress = getItemStartingAddress(x, y); + auto dataSize = getSizeOf(mDescriptor.at(colIndex - 1).data.itemSize) - 1; + auto endingAddress = startingAddress + dataSize; - if(wEndingAddress < (dsint)mMemPage->getSize()) + if(endingAddress < mMemPage->getSize()) { bool bUpdateTo = false; if(!(event->modifiers() & Qt::ShiftModifier)) - setSingleSelection(wStartingAddress); - else if(getInitialSelection() > wEndingAddress) + setSingleSelection(startingAddress); + else if(getInitialSelection() > endingAddress) { - wEndingAddress -= dataSize; + endingAddress -= dataSize; bUpdateTo = true; } - expandSelectionUpTo(wEndingAddress); + expandSelectionUpTo(endingAddress); if(bUpdateTo) { mSelection.toIndex += dataSize; @@ -471,26 +475,27 @@ void HexDump::mousePressEvent(QMouseEvent* event) mGuiState = HexDump::MultiRowsSelectionState; + // TODO: only update if the selection actually changed updateViewport(); } } - else if(wColIndex == 0) + else if(colIndex == 0) { - dsint wStartingAddress = getItemStartingAddress(getColumnPosition(1) + 1, y); - dsint dataSize = getSizeOf(mDescriptor.at(0).data.itemSize) * mDescriptor.at(0).itemCount - 1; - dsint wEndingAddress = wStartingAddress + dataSize; + auto startingAddress = getItemStartingAddress(getColumnPosition(1) + 1, y); + auto dataSize = getSizeOf(mDescriptor.at(0).data.itemSize) * mDescriptor.at(0).itemCount - 1; + auto endingAddress = startingAddress + dataSize; - if(wEndingAddress < (dsint)mMemPage->getSize()) + if(endingAddress < mMemPage->getSize()) { bool bUpdateTo = false; - if(!(event->modifiers() & Qt::ShiftModifier)) - setSingleSelection(wStartingAddress); - else if(getInitialSelection() > wEndingAddress) + if((event->modifiers() & Qt::ShiftModifier) == 0) + setSingleSelection(startingAddress); + else if(getInitialSelection() > endingAddress) { - wEndingAddress -= dataSize; + endingAddress -= dataSize; bUpdateTo = true; } - expandSelectionUpTo(wEndingAddress); + expandSelectionUpTo(endingAddress); if(bUpdateTo) { mSelection.toIndex += dataSize; @@ -499,22 +504,23 @@ void HexDump::mousePressEvent(QMouseEvent* event) mGuiState = HexDump::MultiRowsSelectionState; + // TODO: only update if the selection actually changed updateViewport(); } } - wAccept = true; + accept = true; } } } - if(wAccept == false) + if(!accept) AbstractTableView::mousePressEvent(event); } void HexDump::mouseReleaseEvent(QMouseEvent* event) { - bool wAccept = true; + bool accept = true; if((event->buttons() & Qt::LeftButton) == 0) { @@ -522,23 +528,21 @@ void HexDump::mouseReleaseEvent(QMouseEvent* event) { mGuiState = HexDump::NoState; - updateViewport(); - - wAccept = false; + accept = false; } } if((event->button() & Qt::BackButton) != 0) //Go to previous/next history { - wAccept = true; + accept = true; printDumpAt(mHistory.historyPrev()); } else if((event->button() & Qt::ForwardButton) != 0) { - wAccept = true; + accept = true; printDumpAt(mHistory.historyNext()); } - if(wAccept == true) + if(accept) AbstractTableView::mouseReleaseEvent(event); } @@ -554,8 +558,8 @@ void HexDump::keyPressEvent(QKeyEvent* event) { int key = event->key(); auto selStart = getInitialSelection(); - char granularity = 1; //Size of a data word. - char action = 0; //Where to scroll the scrollbar + dsint granularity = 1; //Size of a data word. + dsint action = 0; //Where to scroll the scrollbar Qt::KeyboardModifiers modifiers = event->modifiers(); for(int i = 0; i < mDescriptor.size(); i++) //Find the first data column { @@ -671,53 +675,54 @@ void HexDump::keyPressEvent(QKeyEvent* event) */ } -QString HexDump::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString HexDump::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { // Reset byte offset when base address is reached - if(rowBase == 0 && mByteOffset != 0) + // TODO: wtf? + if(getTableOffset() == 0 && mByteOffset != 0) printDumpAt(mMemPage->getBase(), false, false); // Compute RVA - int wBytePerRowCount = getBytePerRowCount(); - dsint wRva = (rowBase + rowOffset) * wBytePerRowCount - mByteOffset; + auto bytePerRowCount = getBytePerRowCount(); + auto rva = row * bytePerRowCount - mByteOffset; if(col && mDescriptor.at(col - 1).isData) - printSelected(painter, rowBase, rowOffset, col, x, y, w, h); + printSelected(painter, row, col, x, y, w, h); RichTextPainter::List richText; - getColumnRichText(col, wRva, richText); + getColumnRichText(col, rva, richText); RichTextPainter::paintRichText(painter, x, y, w, h, 4, richText, mFontMetrics); return QString(); } -void HexDump::printSelected(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +void HexDump::printSelected(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { - if((col > 0) && ((col - 1) < mDescriptor.size())) + if(col > 0 && col <= mDescriptor.size()) { ColumnDescriptor curDescriptor = mDescriptor.at(col - 1); - int wBytePerRowCount = getBytePerRowCount(); - dsint wRva = (rowBase + rowOffset) * wBytePerRowCount - mByteOffset; - int wItemPixWidth = getItemPixelWidth(curDescriptor); - int wCharWidth = getCharWidth(); - if(wItemPixWidth == wCharWidth) + auto bytePerRowCount = getBytePerRowCount(); + duint rva = row * bytePerRowCount - mByteOffset; + int itemPixWidth = getItemPixelWidth(curDescriptor); + int charWidth = getCharWidth(); + if(itemPixWidth == charWidth) x += 4; for(int i = 0; i < curDescriptor.itemCount; i++) { - int wSelectionX = x + i * wItemPixWidth; - if(isSelected(wRva + i * getSizeOf(curDescriptor.data.itemSize)) == true) + int selectionX = x + i * itemPixWidth; + if(isSelected(rva + i * getSizeOf(curDescriptor.data.itemSize))) { - int wSelectionWidth = wItemPixWidth > w - (wSelectionX - x) ? w - (wSelectionX - x) : wItemPixWidth; - wSelectionWidth = wSelectionWidth < 0 ? 0 : wSelectionWidth; + int selectionWidth = itemPixWidth > w - (selectionX - x) ? w - (selectionX - x) : itemPixWidth; + selectionWidth = selectionWidth < 0 ? 0 : selectionWidth; painter->setPen(mTextColor); - painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(mSelectionColor)); + painter->fillRect(QRect(selectionX, y, selectionWidth, h), QBrush(mSelectionColor)); } int separator = curDescriptor.separator; if(i && separator && !(i % separator)) { painter->setPen(mSeparatorColor); - painter->drawLine(wSelectionX, y, wSelectionX, y + h); + painter->drawLine(selectionX, y, selectionX, y + h); } } } @@ -726,7 +731,7 @@ void HexDump::printSelected(QPainter* painter, dsint rowBase, int rowOffset, int /************************************************************************************ Selection Management ************************************************************************************/ -void HexDump::expandSelectionUpTo(dsint rva) +void HexDump::expandSelectionUpTo(duint rva) { if(rva < mSelection.firstSelectedIndex) { @@ -746,7 +751,7 @@ void HexDump::expandSelectionUpTo(dsint rva) } } -void HexDump::setSingleSelection(dsint rva) +void HexDump::setSingleSelection(duint rva) { mSelection.firstSelectedIndex = rva; mSelection.fromIndex = rva; @@ -754,27 +759,27 @@ void HexDump::setSingleSelection(dsint rva) emit selectionUpdated(); } -dsint HexDump::getInitialSelection() const +duint HexDump::getInitialSelection() const { return mSelection.firstSelectedIndex; } -dsint HexDump::getSelectionStart() const +duint HexDump::getSelectionStart() const { return mSelection.fromIndex; } -dsint HexDump::getSelectionEnd() const +duint HexDump::getSelectionEnd() const { return mSelection.toIndex; } -bool HexDump::isSelected(dsint rva) const +bool HexDump::isSelected(duint rva) const { return rva >= mSelection.fromIndex && rva <= mSelection.toIndex; } -void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & richText) +void HexDump::getColumnRichText(duint col, duint rva, RichTextPainter::List & richText) { RichTextPainter::CustomRichText_t curData; curData.underline = false; @@ -793,23 +798,30 @@ void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich curData.text = makeAddrText(rvaToVa(rva)); richText.push_back(curData); } - else if(mDescriptor.at(col - 1).isData == true) + else if(mDescriptor.at(col - 1).isData) { const ColumnDescriptor & desc = mDescriptor.at(col - 1); - int wI; - int wByteCount = getSizeOf(desc.data.itemSize); - int wBufferByteCount = desc.itemCount * wByteCount; + auto byteCount = getSizeOf(desc.data.itemSize); + auto bufferByteCount = desc.itemCount * byteCount; - wBufferByteCount = wBufferByteCount > (dsint)(mMemPage->getSize() - rva) ? mMemPage->getSize() - rva : wBufferByteCount; + bufferByteCount = bufferByteCount > (mMemPage->getSize() - rva) ? mMemPage->getSize() - rva : bufferByteCount; - byte_t* wData = new byte_t[wBufferByteCount]; - mMemPage->read(wData, rva, wBufferByteCount); + // TODO: reuse a member buffer for this? + uint8_t* data = new uint8_t[bufferByteCount]; + mMemPage->read(data, rva, bufferByteCount); - if(desc.textCodec) //convert the row bytes to unicode + if(!desc.textEncoding.isEmpty()) //convert the row bytes to unicode { + // TODO: decode backwards a bit to display the correct state +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto textDecoder = QStringDecoder(desc.textEncoding); + curData.text = textDecoder.decode(QByteArrayView((const char*)data, (int)bufferByteCount)); +#else + auto textCodec = QTextCodec::codecForName(desc.textEncoding); + curData.text = textCodec->toUnicode((const char*)data, (int)bufferByteCount); +#endif // QT_VERSION //This might produce invalid characters in variables-width encodings. This is currently ignored. - curData.text = desc.textCodec->toUnicode(QByteArray((const char*)wData, wBufferByteCount)); curData.text.replace('\t', "\\t"); curData.text.replace('\f', "\\f"); curData.text.replace('\v', "\\v"); @@ -819,7 +831,7 @@ void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich } else { - for(wI = 0; wI < desc.itemCount && (rva + wI) < (dsint)mMemPage->getSize(); wI++) + for(int i = 0; i < desc.itemCount && (rva + i) < mMemPage->getSize(); i++) { curData.text.clear(); curData.textColor = mTextColor; @@ -827,18 +839,18 @@ void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich curData.flags = RichTextPainter::FlagAll; int maxLen = getStringMaxLength(desc.data); - if((rva + wI + wByteCount - 1) < (dsint)mMemPage->getSize()) + if((rva + i + byteCount - 1) < mMemPage->getSize()) { - toString(desc.data, rva + wI * wByteCount, wData + wI * wByteCount, curData); + toString(desc.data, rva + i * byteCount, data + i * byteCount, curData); if(curData.text.length() < maxLen) { spaceData.text = QString(' ').repeated(maxLen - curData.text.length()); richText.push_back(spaceData); } - if(wI % sizeof(duint) == 0 && wByteCount == 1 && desc.data.byteMode == HexByte) //pointer underlining + if(i % sizeof(duint) == 0 && byteCount == 1 && desc.data.byteMode == HexByte) //pointer underlining { - auto ptr = *(duint*)(wData + wI * wByteCount); - if(spaceData.underline = curData.underline = DbgMemIsValidReadPtr(ptr)) + auto ptr = *(duint*)(data + i * byteCount); + if((spaceData.underline = curData.underline = DbgMemIsValidReadPtr(ptr))) { auto codePage = DbgFunctions()->MemIsCodePage(ptr, false); auto modbase = DbgFunctions()->ModBaseFromAddr(ptr); @@ -857,7 +869,7 @@ void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich if(maxLen) { spaceData.text = QString(' '); - if(wI % sizeof(duint) == sizeof(duint) - 1) + if(i % sizeof(duint) == sizeof(duint) - 1) spaceData.underline = false; richText.push_back(spaceData); } @@ -873,7 +885,7 @@ void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich } auto dataStartAddr = rvaToVa(rva); - auto dataEndAddr = dataStartAddr + wBufferByteCount - 1; + auto dataEndAddr = dataStartAddr + bufferByteCount - 1; if(mUnderlineRangeStartVa && mUnderlineRangeEndVa) { @@ -890,35 +902,35 @@ void HexDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich } } - delete[] wData; + delete[] data; } } -void HexDump::toString(DataDescriptor desc, duint rva, byte_t* data, RichTextPainter::CustomRichText_t & richText) //convert data to string +void HexDump::toString(DataDescriptor desc, duint rva, uint8_t* data, RichTextPainter::CustomRichText_t & richText) //convert data to string { switch(desc.itemSize) { case Byte: { - byteToString(rva, *((byte_t*)data), desc.byteMode, richText); + byteToString(rva, *((uint8_t*)data), desc.byteMode, richText); } break; case Word: { - wordToString(rva, *((uint16*)data), desc.wordMode, richText); + wordToString(rva, *((uint16_t*)data), desc.wordMode, richText); } break; case Dword: { - dwordToString(rva, *((uint32*)data), desc.dwordMode, richText); + dwordToString(rva, *((uint32_t*)data), desc.dwordMode, richText); } break; case Qword: { - qwordToString(rva, *((uint64*)data), desc.qwordMode, richText); + qwordToString(rva, *((uint64_t*)data), desc.qwordMode, richText); } break; @@ -938,46 +950,46 @@ void HexDump::toString(DataDescriptor desc, duint rva, byte_t* data, RichTextPai if(desc.itemSize == Byte) //byte patches are handled in byteToString return; - dsint start = rvaToVa(rva); - dsint end = start + getSizeOf(desc.itemSize) - 1; + duint start = rvaToVa(rva); + duint end = start + getSizeOf(desc.itemSize) - 1; if(DbgFunctions()->PatchInRange(start, end)) richText.textColor = ConfigColor("HexDumpModifiedBytesColor"); } -void HexDump::byteToString(duint rva, byte_t byte, ByteViewMode mode, RichTextPainter::CustomRichText_t & richText) +void HexDump::byteToString(duint rva, uint8_t byte, ByteViewMode mode, RichTextPainter::CustomRichText_t & richText) { - QString wStr = ""; + QString str = ""; switch(mode) { case HexByte: { - wStr = ToByteString((unsigned char)byte); + str = ToByteString((unsigned char)byte); } break; case AsciiByte: { - QChar wChar = QChar::fromLatin1((char)byte); + QChar ch = QChar::fromLatin1((char)byte); - if(wChar.isPrint()) - wStr = QString(wChar); - else if(!wChar.unicode()) - wStr = mNullReplace; + if(ch.isPrint()) + str = QString(ch); + else if(!ch.unicode()) + str = mNullReplace; else - wStr = mNonprintReplace; + str = mNonprintReplace; } break; case SignedDecByte: { - wStr = QString::number((int)((char)byte)); + str = QString::number((int)((char)byte)); } break; case UnsignedDecByte: { - wStr = QString::number((unsigned int)byte); + str = QString::number((unsigned int)byte); } break; @@ -988,7 +1000,7 @@ void HexDump::byteToString(duint rva, byte_t byte, ByteViewMode mode, RichTextPa break; } - richText.text = wStr; + richText.text = str; DBGPATCHINFO patchInfo; if(DbgFunctions()->PatchGetEx(rvaToVa(rva), &patchInfo)) @@ -1031,40 +1043,40 @@ void HexDump::byteToString(duint rva, byte_t byte, ByteViewMode mode, RichTextPa } } -void HexDump::wordToString(duint rva, uint16 word, WordViewMode mode, RichTextPainter::CustomRichText_t & richText) +void HexDump::wordToString(duint rva, uint16_t word, WordViewMode mode, RichTextPainter::CustomRichText_t & richText) { Q_UNUSED(rva); - QString wStr; + QString str; switch(mode) { case HexWord: { - wStr = ToWordString((unsigned short)word); + str = ToWordString((unsigned short)word); } break; case UnicodeWord: { - QChar wChar = QChar::fromLatin1((char)word & 0xFF); - if(wChar.isPrint() && (word >> 8) == 0) - wStr = QString(wChar); - else if(!wChar.unicode()) - wStr = mNullReplace; + QChar ch = QChar::fromLatin1((char)word & 0xFF); + if(ch.isPrint() && (word >> 8) == 0) + str = QString(ch); + else if(!ch.unicode()) + str = mNullReplace; else - wStr = mNonprintReplace; + str = mNonprintReplace; } break; case SignedDecWord: { - wStr = QString::number((int)((short)word)); + str = QString::number((int)((short)word)); } break; case UnsignedDecWord: { - wStr = QString::number((unsigned int)word); + str = QString::number((unsigned int)word); } break; @@ -1075,37 +1087,37 @@ void HexDump::wordToString(duint rva, uint16 word, WordViewMode mode, RichTextPa break; } - richText.text = wStr; + richText.text = str; } -void HexDump::dwordToString(duint rva, uint32 dword, DwordViewMode mode, RichTextPainter::CustomRichText_t & richText) +void HexDump::dwordToString(duint rva, uint32_t dword, DwordViewMode mode, RichTextPainter::CustomRichText_t & richText) { Q_UNUSED(rva); - QString wStr; + QString str; switch(mode) { case HexDword: { - wStr = QString("%1").arg((unsigned int)dword, 8, 16, QChar('0')).toUpper(); + str = QString("%1").arg((unsigned int)dword, 8, 16, QChar('0')).toUpper(); } break; case SignedDecDword: { - wStr = QString::number((int)dword); + str = QString::number((int)dword); } break; case UnsignedDecDword: { - wStr = QString::number((unsigned int)dword); + str = QString::number((unsigned int)dword); } break; case FloatDword: { - wStr = ToFloatString(&dword); + str = ToFloatString(&dword); } break; @@ -1116,37 +1128,37 @@ void HexDump::dwordToString(duint rva, uint32 dword, DwordViewMode mode, RichTex break; } - richText.text = wStr; + richText.text = str; } -void HexDump::qwordToString(duint rva, uint64 qword, QwordViewMode mode, RichTextPainter::CustomRichText_t & richText) +void HexDump::qwordToString(duint rva, uint64_t qword, QwordViewMode mode, RichTextPainter::CustomRichText_t & richText) { Q_UNUSED(rva); - QString wStr; + QString str; switch(mode) { case HexQword: { - wStr = QString("%1").arg((unsigned long long)qword, 16, 16, QChar('0')).toUpper(); + str = QString("%1").arg((unsigned long long)qword, 16, 16, QChar('0')).toUpper(); } break; case SignedDecQword: { - wStr = QString::number((long long)qword); + str = QString::number((long long)qword); } break; case UnsignedDecQword: { - wStr = QString::number((unsigned long long)qword); + str = QString::number((unsigned long long)qword); } break; case DoubleQword: { - wStr = ToDoubleString(&qword); + str = ToDoubleString(&qword); } break; @@ -1157,19 +1169,19 @@ void HexDump::qwordToString(duint rva, uint64 qword, QwordViewMode mode, RichTex break; } - richText.text = wStr; + richText.text = str; } void HexDump::twordToString(duint rva, void* tword, TwordViewMode mode, RichTextPainter::CustomRichText_t & richText) { Q_UNUSED(rva); - QString wStr; + QString str; switch(mode) { case FloatTword: { - wStr = ToLongDoubleString(tword); + str = ToLongDoubleString(tword); } break; @@ -1180,7 +1192,7 @@ void HexDump::twordToString(duint rva, void* tword, TwordViewMode mode, RichText break; } - richText.text = wStr; + richText.text = str; } size_t HexDump::getSizeOf(DataSize size) @@ -1190,37 +1202,37 @@ size_t HexDump::getSizeOf(DataSize size) static int getStringMaxLength(HexDump::DataDescriptor desc) { - int wLength = 0; + int length = 0; switch(desc.itemSize) { case HexDump::Byte: { - wLength = byteStringMaxLength(desc.byteMode); + length = byteStringMaxLength(desc.byteMode); } break; case HexDump::Word: { - wLength = wordStringMaxLength(desc.wordMode); + length = wordStringMaxLength(desc.wordMode); } break; case HexDump::Dword: { - wLength = dwordStringMaxLength(desc.dwordMode); + length = dwordStringMaxLength(desc.dwordMode); } break; case HexDump::Qword: { - wLength = qwordStringMaxLength(desc.qwordMode); + length = qwordStringMaxLength(desc.qwordMode); } break; case HexDump::Tword: { - wLength = twordStringMaxLength(desc.twordMode); + length = twordStringMaxLength(desc.twordMode); } break; @@ -1231,36 +1243,36 @@ static int getStringMaxLength(HexDump::DataDescriptor desc) break; } - return wLength; + return length; } static int byteStringMaxLength(HexDump::ByteViewMode mode) { - int wLength = 0; + int length = 0; switch(mode) { case HexDump::HexByte: { - wLength = 2; + length = 2; } break; case HexDump::AsciiByte: { - wLength = 0; + length = 0; } break; case HexDump::SignedDecByte: { - wLength = 4; + length = 4; } break; case HexDump::UnsignedDecByte: { - wLength = 3; + length = 3; } break; @@ -1271,36 +1283,36 @@ static int byteStringMaxLength(HexDump::ByteViewMode mode) break; } - return wLength; + return length; } static int wordStringMaxLength(HexDump::WordViewMode mode) { - int wLength = 0; + int length = 0; switch(mode) { case HexDump::HexWord: { - wLength = 4; + length = 4; } break; case HexDump::UnicodeWord: { - wLength = 0; + length = 0; } break; case HexDump::SignedDecWord: { - wLength = 6; + length = 6; } break; case HexDump::UnsignedDecWord: { - wLength = 5; + length = 5; } break; @@ -1311,36 +1323,36 @@ static int wordStringMaxLength(HexDump::WordViewMode mode) break; } - return wLength; + return length; } static int dwordStringMaxLength(HexDump::DwordViewMode mode) { - int wLength = 0; + int length = 0; switch(mode) { case HexDump::HexDword: { - wLength = 8; + length = 8; } break; case HexDump::SignedDecDword: { - wLength = 11; + length = 11; } break; case HexDump::UnsignedDecDword: { - wLength = 10; + length = 10; } break; case HexDump::FloatDword: { - wLength = 13; + length = 13; } break; @@ -1351,36 +1363,36 @@ static int dwordStringMaxLength(HexDump::DwordViewMode mode) break; } - return wLength; + return length; } static int qwordStringMaxLength(HexDump::QwordViewMode mode) { - int wLength = 0; + int length = 0; switch(mode) { case HexDump::HexQword: { - wLength = 16; + length = 16; } break; case HexDump::SignedDecQword: { - wLength = 20; + length = 20; } break; case HexDump::UnsignedDecQword: { - wLength = 20; + length = 20; } break; case HexDump::DoubleQword: { - wLength = 23; + length = 23; } break; @@ -1391,18 +1403,18 @@ static int qwordStringMaxLength(HexDump::QwordViewMode mode) break; } - return wLength; + return length; } static int twordStringMaxLength(HexDump::TwordViewMode mode) { - int wLength = 0; + int length = 0; switch(mode) { case HexDump::FloatTword: { - wLength = 29; + length = 29; } break; @@ -1413,29 +1425,29 @@ static int twordStringMaxLength(HexDump::TwordViewMode mode) break; } - return wLength; + return length; } int HexDump::getItemIndexFromX(int x) const { - int wColIndex = getColumnIndexFromX(x); + auto colIndex = getColumnIndexFromX(x); - if(wColIndex > 0) + if(colIndex > 0) { - int wColStartingPos = getColumnPosition(wColIndex); - int wRelativeX = x - wColStartingPos; + int colStartingPos = getColumnPosition(colIndex); + int relativeX = x - colStartingPos; - int wItemPixWidth = getItemPixelWidth(mDescriptor.at(wColIndex - 1)); - int wCharWidth = getCharWidth(); - if(wItemPixWidth == wCharWidth) - wRelativeX -= 4; + int itemPixWidth = getItemPixelWidth(mDescriptor.at(colIndex - 1)); + int charWidth = getCharWidth(); + if(itemPixWidth == charWidth) + relativeX -= 4; - int wItemIndex = wRelativeX / wItemPixWidth; + int itemIndex = relativeX / itemPixWidth; - wItemIndex = wItemIndex < 0 ? 0 : wItemIndex; - wItemIndex = wItemIndex > (mDescriptor.at(wColIndex - 1).itemCount - 1) ? (mDescriptor.at(wColIndex - 1).itemCount - 1) : wItemIndex; + itemIndex = itemIndex < 0 ? 0 : itemIndex; + itemIndex = itemIndex > (mDescriptor.at(colIndex - 1).itemCount - 1) ? (mDescriptor.at(colIndex - 1).itemCount - 1) : itemIndex; - return wItemIndex; + return itemIndex; } else { @@ -1443,33 +1455,33 @@ int HexDump::getItemIndexFromX(int x) const } } -dsint HexDump::getItemStartingAddress(int x, int y) +duint HexDump::getItemStartingAddress(int x, int y) { - int wRowOffset = getIndexOffsetFromY(transY(y)); - int wItemIndex = getItemIndexFromX(x); - int wColIndex = getColumnIndexFromX(x); - dsint wStartingAddress = 0; + auto rowOffset = getIndexOffsetFromY(transY(y)); + auto itemIndex = getItemIndexFromX(x); + auto colIndex = getColumnIndexFromX(x); + duint startingAddress = 0; - if(wColIndex > 0) + if(colIndex > 0) { - wColIndex -= 1; - wStartingAddress = (getTableOffset() + wRowOffset) * (mDescriptor.at(wColIndex).itemCount * getSizeOf(mDescriptor.at(wColIndex).data.itemSize)) + wItemIndex * getSizeOf(mDescriptor.at(wColIndex).data.itemSize) - mByteOffset; + colIndex -= 1; + startingAddress = (getTableOffset() + rowOffset) * (mDescriptor.at(colIndex).itemCount * getSizeOf(mDescriptor.at(colIndex).data.itemSize)) + itemIndex * getSizeOf(mDescriptor.at(colIndex).data.itemSize) - mByteOffset; } - return wStartingAddress; + return startingAddress; } -int HexDump::getBytePerRowCount() const +size_t HexDump::getBytePerRowCount() const { return mDescriptor.at(0).itemCount * getSizeOf(mDescriptor.at(0).data.itemSize); } int HexDump::getItemPixelWidth(ColumnDescriptor desc) const { - int wCharWidth = getCharWidth(); - int wItemPixWidth = getStringMaxLength(desc.data) * wCharWidth + wCharWidth; + int charWidth = getCharWidth(); + int itemPixWidth = getStringMaxLength(desc.data) * charWidth + charWidth; - return wItemPixWidth; + return itemPixWidth; } void HexDump::appendDescriptor(int width, QString title, bool clickable, ColumnDescriptor descriptor) @@ -1484,10 +1496,10 @@ void HexDump::appendResetDescriptor(int width, QString title, bool clickable, Co setAllowPainting(false); if(mDescriptor.size()) { - dsint wRVA = getTableOffset() * getBytePerRowCount() - mByteOffset; + auto rva = getTableOffset() * getBytePerRowCount() - mByteOffset; clearDescriptors(); appendDescriptor(width, title, clickable, descriptor); - printDumpAt(rvaToVa(wRVA), true, false); + printDumpAt(rvaToVa(rva), true, false); } else appendDescriptor(width, title, clickable, descriptor); diff --git a/src/gui/Src/BasicView/HexDump.h b/src/gui/Src/BasicView/HexDump.h index bc428c10..ead1edde 100644 --- a/src/gui/Src/BasicView/HexDump.h +++ b/src/gui/Src/BasicView/HexDump.h @@ -4,7 +4,6 @@ #include "RichTextPainter.h" #include "MemoryPage.h" #include "VaHistory.h" -#include class HexDump : public AbstractTableView { @@ -74,12 +73,12 @@ public: bool isData = true; int itemCount = 16; int separator = 0; - QTextCodec* textCodec = nullptr; //name of the text codec (leave empty if you want to keep your sanity) + QByteArray textEncoding; // name of the text codec (leave empty if you want to keep your sanity) DataDescriptor data; std::function columnSwitch; }; - explicit HexDump(QWidget* parent = 0); + HexDump(Architecture* architecture, QWidget* parent = nullptr); ~HexDump() override; // Configuration @@ -87,41 +86,40 @@ public: void updateFonts() override; void updateShortcuts() override; - //QString getStringToPrint(int rowBase, int rowOffset, int col); void mouseMoveEvent(QMouseEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void wheelEvent(QWheelEvent* event) override; void keyPressEvent(QKeyEvent* event) override; - QString paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) override; + QString paintContent(QPainter* painter, duint row, duint column, int x, int y, int w, int h) override; void paintGraphicDump(QPainter* painter, int x, int y, int addr); - void printSelected(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h); + void printSelected(QPainter* painter, duint row, duint column, int x, int y, int w, int h); // Selection Management - void expandSelectionUpTo(dsint rva); - void setSingleSelection(dsint rva); - dsint getInitialSelection() const; - dsint getSelectionStart() const; - dsint getSelectionEnd() const; - bool isSelected(dsint rva) const; + void expandSelectionUpTo(duint rva); + void setSingleSelection(duint rva); + duint getInitialSelection() const; + duint getSelectionStart() const; + duint getSelectionEnd() const; + bool isSelected(duint rva) const; - virtual void getColumnRichText(int col, dsint rva, RichTextPainter::List & richText); + virtual void getColumnRichText(duint column, duint rva, RichTextPainter::List & richText); static size_t getSizeOf(DataSize size); - void toString(DataDescriptor desc, duint rva, byte_t* data, RichTextPainter::CustomRichText_t & richText); + void toString(DataDescriptor desc, duint rva, uint8_t* data, RichTextPainter::CustomRichText_t & richText); - void byteToString(duint rva, byte_t byte, ByteViewMode mode, RichTextPainter::CustomRichText_t & richText); - void wordToString(duint rva, uint16 word, WordViewMode mode, RichTextPainter::CustomRichText_t & richText); - static void dwordToString(duint rva, uint32 dword, DwordViewMode mode, RichTextPainter::CustomRichText_t & richText); - static void qwordToString(duint rva, uint64 qword, QwordViewMode mode, RichTextPainter::CustomRichText_t & richText); + void byteToString(duint rva, uint8_t byte, ByteViewMode mode, RichTextPainter::CustomRichText_t & richText); + void wordToString(duint rva, uint16_t word, WordViewMode mode, RichTextPainter::CustomRichText_t & richText); + static void dwordToString(duint rva, uint32_t dword, DwordViewMode mode, RichTextPainter::CustomRichText_t & richText); + static void qwordToString(duint rva, uint64_t qword, QwordViewMode mode, RichTextPainter::CustomRichText_t & richText); static void twordToString(duint rva, void* tword, TwordViewMode mode, RichTextPainter::CustomRichText_t & richText); int getItemIndexFromX(int x) const; - dsint getItemStartingAddress(int x, int y); + duint getItemStartingAddress(int x, int y); - int getBytePerRowCount() const; + size_t getBytePerRowCount() const; int getItemPixelWidth(ColumnDescriptor desc) const; //descriptor management @@ -129,8 +127,8 @@ public: void appendResetDescriptor(int width, QString title, bool clickable, ColumnDescriptor descriptor); void clearDescriptors(); - void printDumpAt(dsint parVA, bool select, bool repaint = true, bool updateTableOffset = true); - duint rvaToVa(dsint rva) const; + void printDumpAt(duint parVA, bool select, bool repaint = true, bool updateTableOffset = true); + duint rvaToVa(duint rva) const; duint getTableOffsetRva() const; QString makeAddrText(duint va) const; @@ -144,7 +142,7 @@ signals: void selectionUpdated(); public slots: - void printDumpAt(dsint parVA); + void printDumpAt(duint parVA); void debugStateChanged(DBGSTATE state); void updateDumpSlot(); void copySelectionSlot(); @@ -162,9 +160,9 @@ private: struct SelectionData { - dsint firstSelectedIndex; - dsint fromIndex; - dsint toIndex; + duint firstSelectedIndex = 0; + duint fromIndex = 0; + duint toIndex = 0; }; SelectionData mSelection; @@ -209,13 +207,14 @@ private: std::vector mUpdateCacheTemp; protected: - MemoryPage* mMemPage; - int mByteOffset; + Architecture* mArchitecture = nullptr; + MemoryPage* mMemPage = nullptr; + dsint mByteOffset = 0; QList mDescriptor; int mForceColumn; bool mRvaDisplayEnabled; duint mRvaDisplayBase; - dsint mRvaDisplayPageBase; + duint mRvaDisplayPageBase; QString mSyncAddrExpression; QAction* mCopyAddress; QAction* mCopyRva; diff --git a/src/gui/Src/BasicView/LabeledSplitter.cpp b/src/gui/Src/BasicView/LabeledSplitter.cpp index faea4636..dd25bd35 100644 --- a/src/gui/Src/BasicView/LabeledSplitter.cpp +++ b/src/gui/Src/BasicView/LabeledSplitter.cpp @@ -278,7 +278,7 @@ void LabeledSplitter::loadFromConfig(const QString & configName) size_t sizeofState = strlen(state); if(sizeofState > 0) this->restoreState(QByteArray::fromBase64(QByteArray(state, int(sizeofState)))); - connect(Bridge::getBridge(), SIGNAL(shutdown()), this, SLOT(shutdownSlot())); + connect(Bridge::getBridge(), SIGNAL(close()), this, SLOT(shutdownSlot())); } } diff --git a/src/gui/Src/BasicView/ReferenceView.cpp b/src/gui/Src/BasicView/ReferenceView.cpp index 4b00fdb4..5f0ed98f 100644 --- a/src/gui/Src/BasicView/ReferenceView.cpp +++ b/src/gui/Src/BasicView/ReferenceView.cpp @@ -102,8 +102,8 @@ void ReferenceView::connectBridge() connect(Bridge::getBridge(), SIGNAL(referenceSetProgress(int)), this, SLOT(referenceSetProgressSlot(int))); connect(Bridge::getBridge(), SIGNAL(referenceSetCurrentTaskProgress(int, QString)), this, SLOT(referenceSetCurrentTaskProgressSlot(int, QString))); connect(Bridge::getBridge(), SIGNAL(referenceAddCommand(QString, QString)), this, SLOT(addCommand(QString, QString))); - connect(stdSearchList(), SIGNAL(selectionChangedSignal(int)), this, SLOT(searchSelectionChanged(int))); - connect(stdList(), SIGNAL(selectionChangedSignal(int)), this, SLOT(searchSelectionChanged(int))); + connect(stdSearchList(), SIGNAL(selectionChanged(duint)), this, SLOT(searchSelectionChanged(int))); + connect(stdList(), SIGNAL(selectionChanged(duint)), this, SLOT(searchSelectionChanged(int))); } void ReferenceView::disconnectBridge() @@ -113,8 +113,8 @@ void ReferenceView::disconnectBridge() disconnect(Bridge::getBridge(), SIGNAL(referenceSetProgress(int)), this, SLOT(referenceSetProgressSlot(int))); disconnect(Bridge::getBridge(), SIGNAL(referenceSetCurrentTaskProgress(int, QString)), this, SLOT(referenceSetCurrentTaskProgressSlot(int, QString))); disconnect(Bridge::getBridge(), SIGNAL(referenceAddCommand(QString, QString)), this, SLOT(addCommand(QString, QString))); - disconnect(stdSearchList(), SIGNAL(selectionChangedSignal(int)), this, SLOT(searchSelectionChanged(int))); - disconnect(stdList(), SIGNAL(selectionChangedSignal(int)), this, SLOT(searchSelectionChanged(int))); + disconnect(stdSearchList(), SIGNAL(selectionChanged(int)), this, SLOT(searchSelectionChanged(int))); + disconnect(stdList(), SIGNAL(selectionChanged(int)), this, SLOT(searchSelectionChanged(int))); } int ReferenceView::progress() const @@ -284,7 +284,7 @@ void ReferenceView::followGenericAddress() } } -void ReferenceView::setBreakpointAt(int row, BPSetAction action) +void ReferenceView::setBreakpointAt(duint row, BPSetAction action) { if(!DbgIsDebugging()) return; @@ -334,14 +334,14 @@ void ReferenceView::toggleBreakpoint() void ReferenceView::setBreakpointOnAllCommands() { GuiDisableUpdateScope s; - for(int i = 0; i < mCurList->getRowCount(); i++) + for(duint i = 0; i < mCurList->getRowCount(); i++) setBreakpointAt(i, Enable); } void ReferenceView::removeBreakpointOnAllCommands() { GuiDisableUpdateScope s; - for(int i = 0; i < mCurList->getRowCount(); i++) + for(duint i = 0; i < mCurList->getRowCount(); i++) setBreakpointAt(i, Remove); } @@ -355,7 +355,7 @@ void ReferenceView::setBreakpointOnAllApiCalls() QString apiText = mCurList->getCellContent(mCurList->getInitialSelection(), 1); GuiDisableUpdateScope s; - for(int i = 0; i < mCurList->getRowCount(); i++) + for(duint i = 0; i < mCurList->getRowCount(); i++) if(mCurList->getCellContent(i, 1) == apiText) setBreakpointAt(i, Enable); } @@ -371,7 +371,7 @@ void ReferenceView::removeBreakpointOnAllApiCalls() QString apiText = mCurList->getCellContent(mCurList->getInitialSelection(), 1); GuiDisableUpdateScope s; - for(int i = 0; i < mCurList->getRowCount(); i++) + for(duint i = 0; i < mCurList->getRowCount(); i++) if(mCurList->getCellContent(i, 1) == apiText) setBreakpointAt(i, Remove); } @@ -423,7 +423,7 @@ void ReferenceView::referenceExecCommand() for(int selected : mCurList->getSelection()) //to do: enable multi-selection { QString specializedCommand = command; - for(int i = 0; i < mCurList->getColumnCount(); i++) + for(duint i = 0; i < mCurList->getColumnCount(); i++) { QString token = "$" + QString::number(i); if(specializedCommand.contains(token)) diff --git a/src/gui/Src/BasicView/ReferenceView.h b/src/gui/Src/BasicView/ReferenceView.h index 91130431..85acff91 100644 --- a/src/gui/Src/BasicView/ReferenceView.h +++ b/src/gui/Src/BasicView/ReferenceView.h @@ -75,7 +75,7 @@ private: Remove }; - void setBreakpointAt(int row, BPSetAction action); + void setBreakpointAt(duint row, BPSetAction action); dsint apiAddressFromString(const QString & s); void mouseReleaseEvent(QMouseEvent* event); diff --git a/src/gui/Src/BasicView/SearchListView.cpp b/src/gui/Src/BasicView/SearchListView.cpp index c2f47b87..7cd8b344 100644 --- a/src/gui/Src/BasicView/SearchListView.cpp +++ b/src/gui/Src/BasicView/SearchListView.cpp @@ -93,7 +93,6 @@ SearchListView::SearchListView(QWidget* parent, AbstractSearchList* abstractSear // Set global variables mCurList = abstractSearchList->list(); - mSearchStartCol = 0; // Install input event filter mSearchBox->installEventFilter(this); @@ -205,9 +204,9 @@ void SearchListView::filterEntries() bool hasSetSingleSelection = false; if(!mLastFirstColValue.isEmpty()) { - int rows = mCurList->getRowCount(); + auto rows = mCurList->getRowCount(); mCurList->setTableOffset(0); - for(int i = 0; i < rows; i++) + for(duint i = 0; i < rows; i++) { if(mCurList->getCellContent(i, 0) == mLastFirstColValue) { diff --git a/src/gui/Src/BasicView/SearchListView.h b/src/gui/Src/BasicView/SearchListView.h index 8190ada6..bef1f5ab 100644 --- a/src/gui/Src/BasicView/SearchListView.h +++ b/src/gui/Src/BasicView/SearchListView.h @@ -14,8 +14,8 @@ class SearchListView : public QWidget, public ActionHelper public: explicit SearchListView(QWidget* parent, AbstractSearchList* abstractSearchList, bool enableRegex, bool enableLock); - AbstractStdTable* mCurList; - int mSearchStartCol; + AbstractStdTable* mCurList = nullptr; + duint mSearchStartCol = 0; bool findTextInList(AbstractStdTable* list, QString text, int row, int startcol, bool startswith); void refreshSearchList(); diff --git a/src/gui/Src/BasicView/StdIconTable.cpp b/src/gui/Src/BasicView/StdIconTable.cpp index 15b131d3..d6d52004 100644 --- a/src/gui/Src/BasicView/StdIconTable.cpp +++ b/src/gui/Src/BasicView/StdIconTable.cpp @@ -24,20 +24,13 @@ int StdIconTable::getIconColumn() const return mIconColumn; } -void StdIconTable::setRowCount(dsint count) +void StdIconTable::setRowCount(duint count) { - int wRowToAddOrRemove = count - int(mIcon.size()); - for(int i = 0; i < qAbs(wRowToAddOrRemove); i++) - { - if(wRowToAddOrRemove > 0) - mIcon.push_back(QIcon()); - else - mIcon.pop_back(); - } + mIcon.resize(count); StdTable::setRowCount(count); } -void StdIconTable::sortRows(int column, bool ascending) +void StdIconTable::sortRows(duint column, bool ascending) { auto sortFn = mColumnSortFunctions.at(column); std::vector index; @@ -61,24 +54,24 @@ void StdIconTable::sortRows(int column, bool ascending) } } -QString StdIconTable::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString StdIconTable::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { if(col == mIconColumn) { // Draw the selection first, so that transparent icons are drawn properly - if(isSelected(rowBase, rowOffset)) + if(isSelected(row)) painter->fillRect(QRect(x, y, w, h), QBrush(mSelectionColor)); - mIcon.at(rowBase + rowOffset).paint(painter, x, y, h, h); - QString wStr = StdTable::paintContent(painter, rowBase, rowOffset, col, x + h, y, w - h, h); + mIcon.at(row).paint(painter, x, y, h, h); + QString str = StdTable::paintContent(painter, row, col, x + h, y, w - h, h); - if(wStr.length()) + if(str.length()) { - painter->setPen(getCellColor(rowBase + rowOffset, col)); - painter->drawText(QRect(x + 4 + h, y, w - 4 - h, h), Qt::AlignVCenter | Qt::AlignLeft, wStr); + painter->setPen(getCellColor(row, col)); + painter->drawText(QRect(x + 4 + h, y, w - 4 - h, h), Qt::AlignVCenter | Qt::AlignLeft, str); } return QString(); } else - return StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h); + return StdTable::paintContent(painter, row, col, x, y, w, h); } diff --git a/src/gui/Src/BasicView/StdSearchListView.cpp b/src/gui/Src/BasicView/StdSearchListView.cpp index a08b681c..164e0443 100644 --- a/src/gui/Src/BasicView/StdSearchListView.cpp +++ b/src/gui/Src/BasicView/StdSearchListView.cpp @@ -79,7 +79,7 @@ void StdSearchListView::reloadData() }); } -void StdSearchListView::setSearchStartCol(int col) +void StdSearchListView::setSearchStartCol(duint col) { if(col < stdList()->getColumnCount()) mSearchStartCol = col; diff --git a/src/gui/Src/BasicView/StdSearchListView.h b/src/gui/Src/BasicView/StdSearchListView.h index e92b15e4..85a0d964 100644 --- a/src/gui/Src/BasicView/StdSearchListView.h +++ b/src/gui/Src/BasicView/StdSearchListView.h @@ -23,7 +23,7 @@ public slots: virtual void setRowCount(dsint count); void setCellContent(int r, int c, QString s); void reloadData(); - void setSearchStartCol(int col); + void setSearchStartCol(duint col); private: StdTableSearchList* mSearchListData; diff --git a/src/gui/Src/BasicView/StdTable.cpp b/src/gui/Src/BasicView/StdTable.cpp index fd9e4732..66f01f06 100644 --- a/src/gui/Src/BasicView/StdTable.cpp +++ b/src/gui/Src/BasicView/StdTable.cpp @@ -52,30 +52,36 @@ void StdTable::deleteAllColumns() mColumnSortFunctions.clear(); } -void StdTable::setRowCount(dsint count) +void StdTable::setRowCount(duint count) { - int wRowToAddOrRemove = count - int(mData.size()); - for(int i = 0; i < qAbs(wRowToAddOrRemove); i++) + auto oldSize = mData.size(); + mData.resize(count); + if(oldSize < count) { - if(wRowToAddOrRemove > 0) + for(duint i = oldSize; i < count; i++) { - mData.push_back(std::vector()); - for(int j = 0; j < getColumnCount(); j++) - mData[mData.size() - 1].push_back(CellData()); + mData[i].resize(getColumnCount()); } - else - mData.pop_back(); } AbstractTableView::setRowCount(count); } -void StdTable::setCellContent(int r, int c, QString s) +void StdTable::setCellContent(duint r, duint c, QString s) { if(isValidIndex(r, c)) mData[r][c].text = std::move(s); } -QString StdTable::getCellContent(int r, int c) +void StdTable::setCellContent(duint r, duint c, QString s, duint userdata) +{ + if(isValidIndex(r, c)) + { + mData[r][c].text = std::move(s); + mData[r][c].userdata = userdata; + } +} + +QString StdTable::getCellContent(duint r, duint c) { if(isValidIndex(r, c)) return mData[r][c].text; @@ -83,25 +89,25 @@ QString StdTable::getCellContent(int r, int c) return QString(""); } -void StdTable::setCellUserdata(int r, int c, duint userdata) +void StdTable::setCellUserdata(duint r, duint c, duint userdata) { if(isValidIndex(r, c)) mData[r][c].userdata = userdata; } -duint StdTable::getCellUserdata(int r, int c) +duint StdTable::getCellUserdata(duint r, duint c) { return isValidIndex(r, c) ? mData[r][c].userdata : 0; } -bool StdTable::isValidIndex(int r, int c) +bool StdTable::isValidIndex(duint r, duint c) { if(r < 0 || c < 0 || r >= int(mData.size())) return false; return c < int(mData.at(r).size()); } -void StdTable::sortRows(int column, bool ascending) +void StdTable::sortRows(duint column, bool ascending) { auto sortFn = mColumnSortFunctions.at(column); std::stable_sort(mData.begin(), mData.end(), [column, ascending, &sortFn](const std::vector & a, const std::vector & b) diff --git a/src/gui/Src/BasicView/StdTableSearchList.cpp b/src/gui/Src/BasicView/StdTableSearchList.cpp index 1e7062ae..0e78085d 100644 --- a/src/gui/Src/BasicView/StdTableSearchList.cpp +++ b/src/gui/Src/BasicView/StdTableSearchList.cpp @@ -1,7 +1,7 @@ #include "StdTableSearchList.h" #include "StdIconTable.h" -void StdTableSearchList::filter(const QString & filter, FilterType type, int startColumn) +void StdTableSearchList::filter(const QString & filter, FilterType type, duint startColumn) { StdIconTable* mSearchIconList = qobject_cast(mSearchList); StdIconTable* mIconList = qobject_cast(mList); diff --git a/src/gui/Src/BasicView/StdTableSearchList.h b/src/gui/Src/BasicView/StdTableSearchList.h index db89cd71..30256a23 100644 --- a/src/gui/Src/BasicView/StdTableSearchList.h +++ b/src/gui/Src/BasicView/StdTableSearchList.h @@ -17,7 +17,7 @@ public: AbstractStdTable* list() const override { return mList; } AbstractStdTable* searchList() const override { return mSearchList; } - void filter(const QString & filter, FilterType type, int startColumn) override; + void filter(const QString & filter, FilterType type, duint startColumn) override; private: StdTable* mList; diff --git a/src/gui/Src/Bridge/Bridge.cpp b/src/gui/Src/Bridge/Bridge.cpp index c396aa1c..8526eea6 100644 --- a/src/gui/Src/Bridge/Bridge.cpp +++ b/src/gui/Src/Bridge/Bridge.cpp @@ -85,7 +85,7 @@ void Bridge::initBridge() mBridge = new Bridge(); } -Architecture* Bridge::getArch() +Architecture* Bridge::getArchitecture() { return &mArch; } @@ -335,7 +335,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2) case GUI_REF_SETSEARCHSTARTCOL: if(referenceManager->currentReferenceView()) - referenceManager->currentReferenceView()->setSearchStartCol((int)param1); + referenceManager->currentReferenceView()->setSearchStartCol((duint)param1); break; case GUI_REF_INITIALIZE: @@ -379,7 +379,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2) byte_t buffer[16]; if(!DbgMemRead(parVA, buffer, 16)) return 0; - QZydis disasm(int(ConfigUint("Disassembler", "MaxModuleSize")), Bridge::getArch()); + QZydis disasm(int(ConfigUint("Disassembler", "MaxModuleSize")), Bridge::getArchitecture()); Instruction_t instr = disasm.DisassembleAt(buffer, 16, 0, parVA); QString finalInstruction; for(const auto & curToken : instr.tokens.tokens) diff --git a/src/gui/Src/Disassembler/QZydis.h b/src/gui/Src/Disassembler/QZydis.h index 889edb95..061f1c7e 100644 --- a/src/gui/Src/Disassembler/QZydis.h +++ b/src/gui/Src/Disassembler/QZydis.h @@ -43,6 +43,8 @@ class QZydis { public: QZydis(int maxModuleSize, Architecture* architecture); + QZydis(const QZydis &) = delete; + QZydis(QZydis &&) = delete; ~QZydis(); ulong DisassembleBack(const uint8_t* data, duint base, duint size, duint ip, int n); ulong DisassembleNext(const uint8_t* data, duint base, duint size, duint ip, int n); diff --git a/src/gui/Src/Gui/AttachDialog.cpp b/src/gui/Src/Gui/AttachDialog.cpp index 10e20e50..cd7fc478 100644 --- a/src/gui/Src/Gui/AttachDialog.cpp +++ b/src/gui/Src/Gui/AttachDialog.cpp @@ -112,7 +112,7 @@ retryFindWindow: refresh(); QString pidText = QString().sprintf(ConfigBool("Gui", "PidTidInHex") ? "%.8X" : "%u", pid); bool found = false; - for(int i = 0; i < mSearchListView->mCurList->getRowCount(); i++) + for(duint i = 0; i < mSearchListView->mCurList->getRowCount(); i++) { if(mSearchListView->mCurList->getCellContent(i, ColPid) == pidText) { diff --git a/src/gui/Src/Gui/BreakpointsView.cpp b/src/gui/Src/Gui/BreakpointsView.cpp index f54fb55f..8ded4ef8 100644 --- a/src/gui/Src/Gui/BreakpointsView.cpp +++ b/src/gui/Src/Gui/BreakpointsView.cpp @@ -22,7 +22,7 @@ BreakpointsView::BreakpointsView(QWidget* parent) addColumnAt(0, tr("Summary"), true); loadColumnFromConfig("BreakpointsView"); - mDisasm = new QZydis(ConfigUint("Disassembler", "MaxModuleSize"), Bridge::getArch()); + mDisasm = new QZydis(ConfigUint("Disassembler", "MaxModuleSize"), Bridge::getArchitecture()); mDisasm->UpdateConfig(); enableMultiSelection(true); diff --git a/src/gui/Src/Gui/CPUArgumentWidget.cpp b/src/gui/Src/Gui/CPUArgumentWidget.cpp index 06252cff..58bcff32 100644 --- a/src/gui/Src/Gui/CPUArgumentWidget.cpp +++ b/src/gui/Src/Gui/CPUArgumentWidget.cpp @@ -3,13 +3,10 @@ #include "Configuration.h" #include "Bridge.h" -CPUArgumentWidget::CPUArgumentWidget(QWidget* parent) : +CPUArgumentWidget::CPUArgumentWidget(Architecture* architecture, QWidget* parent) : QWidget(parent), ui(new Ui::CPUArgumentWidget), - mTable(nullptr), - mCurrentCallingConvention(-1), - mStackOffset(0), - mAllowUpdate(true) + mArchitecture(architecture) { ui->setupUi(this); mTable = ui->table; @@ -32,7 +29,7 @@ CPUArgumentWidget::CPUArgumentWidget(QWidget* parent) : connect(mFollowAddrStack, SIGNAL(triggered()), this, SLOT(followStackSlot())); connect(Bridge::getBridge(), SIGNAL(repaintTableView()), this, SLOT(refreshData())); - connect(Bridge::getBridge(), SIGNAL(disassembleAt(dsint, dsint)), this, SLOT(disassembleAtSlot(dsint, dsint))); + connect(Bridge::getBridge(), SIGNAL(disassembleAt(duint, duint)), this, SLOT(disassembleAtSlot(duint, duint))); } CPUArgumentWidget::~CPUArgumentWidget() @@ -46,7 +43,7 @@ void CPUArgumentWidget::updateStackOffset(bool iscall) mStackOffset = cur.getStackOffset() + (iscall ? 0 : cur.getCallOffset()); } -void CPUArgumentWidget::disassembleAtSlot(dsint addr, dsint cip) +void CPUArgumentWidget::disassembleAtSlot(duint addr, duint cip) { Q_UNUSED(addr); if(mCurrentCallingConvention == -1) //no calling conventions diff --git a/src/gui/Src/Gui/CPUArgumentWidget.h b/src/gui/Src/Gui/CPUArgumentWidget.h index da6d3845..eaf9bd3c 100644 --- a/src/gui/Src/Gui/CPUArgumentWidget.h +++ b/src/gui/Src/Gui/CPUArgumentWidget.h @@ -4,6 +4,7 @@ #include #include "StdTable.h" #include "StringUtil.h" +#include "Architecture.h" namespace Ui { @@ -15,7 +16,7 @@ class CPUArgumentWidget : public QWidget Q_OBJECT public: - explicit CPUArgumentWidget(QWidget* parent = 0); + explicit CPUArgumentWidget(Architecture* architecture, QWidget* parent = nullptr); ~CPUArgumentWidget(); static QString defaultArgFormat(const QString & format, const QString & expression) @@ -40,7 +41,7 @@ public: } public slots: - void disassembleAtSlot(dsint addr, dsint cip); + void disassembleAtSlot(duint addr, duint cip); void refreshData(); private slots: @@ -133,11 +134,12 @@ private: } }; - Ui::CPUArgumentWidget* ui; - StdTable* mTable; - int mCurrentCallingConvention; - duint mStackOffset; - bool mAllowUpdate; + Architecture* mArchitecture = nullptr; + Ui::CPUArgumentWidget* ui = nullptr; + StdTable* mTable = nullptr; + int mCurrentCallingConvention = -1; + duint mStackOffset = 0; + bool mAllowUpdate = true; std::vector mCallingConventions; std::vector mArgumentValues; QAction* mFollowDisasm; diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index d36866bb..20258e18 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -26,7 +26,8 @@ #include "BrowseDialog.h" #include "Tracer/TraceBrowser.h" -CPUDisassembly::CPUDisassembly(QWidget* parent, bool isMain) : Disassembly(parent, isMain) +CPUDisassembly::CPUDisassembly(Architecture* architecture, bool isMain, QWidget* parent) + : Disassembly(architecture, isMain, parent) { setWindowTitle("Disassembly"); @@ -34,7 +35,7 @@ CPUDisassembly::CPUDisassembly(QWidget* parent, bool isMain) : Disassembly(paren setupRightClickContextMenu(); // Connect bridge<->disasm calls - connect(Bridge::getBridge(), SIGNAL(disassembleAt(dsint, dsint)), this, SLOT(disassembleAtSlot(dsint, dsint))); + connect(Bridge::getBridge(), SIGNAL(disassembleAt(duint, duint)), this, SLOT(disassembleAtSlot(duint, duint))); if(mIsMain) { connect(Bridge::getBridge(), SIGNAL(selectionDisasmGet(SELECTIONDATA*)), this, SLOT(selectionGetSlot(SELECTIONDATA*))); @@ -133,7 +134,7 @@ void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event) } } -void CPUDisassembly::addFollowReferenceMenuItem(QString name, dsint value, QMenu* menu, bool isReferences, bool isFollowInCPU) +void CPUDisassembly::addFollowReferenceMenuItem(QString name, duint value, QMenu* menu, bool isReferences, bool isFollowInCPU) { foreach(QAction* action, menu->actions()) //check for duplicate action if(action->text() == name) @@ -149,7 +150,7 @@ void CPUDisassembly::addFollowReferenceMenuItem(QString name, dsint value, QMenu connect(newAction, SIGNAL(triggered()), this, SLOT(followActionSlot())); } -void CPUDisassembly::setupFollowReferenceMenu(dsint wVA, QMenu* menu, bool isReferences, bool isFollowInCPU) +void CPUDisassembly::setupFollowReferenceMenu(duint va, QMenu* menu, bool isReferences, bool isFollowInCPU) { //remove previous actions QList list = menu->actions(); @@ -162,12 +163,12 @@ void CPUDisassembly::setupFollowReferenceMenu(dsint wVA, QMenu* menu, bool isRef if(isReferences) menu->addAction(mReferenceSelectedAddressAction); else - addFollowReferenceMenuItem(tr("&Selected Address"), wVA, menu, isReferences, isFollowInCPU); + addFollowReferenceMenuItem(tr("&Selected Address"), va, menu, isReferences, isFollowInCPU); } //add follow actions DISASM_INSTR instr; - DbgDisasmAt(wVA, &instr); + DbgDisasmAt(va, &instr); if(!isReferences) //follow in dump { @@ -735,19 +736,19 @@ void CPUDisassembly::setLabelSlot() { if(!DbgIsDebugging()) return; - duint wVA = rvaToVa(getInitialSelection()); + duint va = rvaToVa(getInitialSelection()); LineEditDialog mLineEdit(this); mLineEdit.setTextMaxLength(MAX_LABEL_SIZE - 2); - QString addr_text = ToPtrString(wVA); + QString addr_text = ToPtrString(va); char label_text[MAX_COMMENT_SIZE] = ""; - if(DbgGetLabelAt((duint)wVA, SEG_DEFAULT, label_text)) + if(DbgGetLabelAt((duint)va, SEG_DEFAULT, label_text)) mLineEdit.setText(QString(label_text)); mLineEdit.setWindowTitle(tr("Add label at ") + addr_text); restart: if(mLineEdit.exec() != QDialog::Accepted) return; QByteArray utf8data = mLineEdit.editText.toUtf8(); - if(!utf8data.isEmpty() && DbgIsValidExpression(utf8data.constData()) && DbgValFromString(utf8data.constData()) != wVA) + if(!utf8data.isEmpty() && DbgIsValidExpression(utf8data.constData()) && DbgValFromString(utf8data.constData()) != va) { QMessageBox msg(QMessageBox::Warning, tr("The label may be in use"), tr("The label \"%1\" may be an existing label or a valid expression. Using such label might have undesired effects. Do you still want to continue?").arg(mLineEdit.editText), @@ -758,7 +759,7 @@ restart: if(msg.exec() == QMessageBox::No) goto restart; } - if(!DbgSetLabelAt(wVA, utf8data.constData())) + if(!DbgSetLabelAt(va, utf8data.constData())) SimpleErrorBox(this, tr("Error!"), tr("DbgSetLabelAt failed!")); GuiUpdateAllViews(); @@ -914,7 +915,7 @@ void CPUDisassembly::assembleSlot() assembly_error = false; - assembleDialog.setSelectedInstrVa(wVA); + assembleDialog.setSelectedInstrVa(va); if(ConfigBool("Disassembler", "Uppercase")) actual_inst = actual_inst.toUpper().replace(QRegularExpression("0X([0-9A-F]+)"), "0x\\1"); assembleDialog.setTextEditValue(actual_inst); @@ -937,7 +938,7 @@ void CPUDisassembly::assembleSlot() if(expression == QString("???") || expression.toLower() == instr.instStr.toLower() || expression == QString("")) break; - if(!DbgFunctions()->AssembleAtEx(wVA, expression.toUtf8().constData(), error, assembleDialog.bFillWithNopsChecked)) + if(!DbgFunctions()->AssembleAtEx(va, expression.toUtf8().constData(), error, assembleDialog.bFillWithNopsChecked)) { QMessageBox msg(QMessageBox::Critical, tr("Error!"), tr("Failed to assemble instruction \" %1 \" (%2)").arg(expression).arg(error)); msg.setWindowIcon(DIcon("compile-error")); @@ -951,20 +952,20 @@ void CPUDisassembly::assembleSlot() while(assembly_error); //select next instruction after assembling - setSingleSelection(wRVA); + setSingleSelection(rva); - dsint botRVA = getTableOffset(); - dsint topRVA = getInstructionRVA(getTableOffset(), getNbrOfLineToPrint() - 1); + auto botRVA = getTableOffset(); + auto topRVA = getInstructionRVA(getTableOffset(), getNbrOfLineToPrint() - 1); - dsint wInstrSize = getInstructionRVA(wRVA, 1) - wRVA - 1; - - expandSelectionUpTo(wRVA + wInstrSize); + // TODO: this seems dumb + auto instrSize = getInstructionRVA(rva, 1) - rva - 1; + expandSelectionUpTo(rva + instrSize); selectNext(false); if(getSelectionStart() < botRVA) setTableOffset(getSelectionStart()); else if(getSelectionEnd() >= topRVA) - setTableOffset(getInstructionRVA(getSelectionEnd(), -getNbrOfLineToPrint() + 2)); + setTableOffset(getInstructionRVA(getSelectionEnd(), -(dsint)getNbrOfLineToPrint() + 2)); //refresh view GuiUpdateAllViews(); @@ -1533,7 +1534,8 @@ void CPUDisassembly::pushSelectionInto(bool copyBytes, QTextStream & stream, QTe if(i) stream << "\r\n"; duint cur_addr = rvaToVa(inst.rva); - QString address = getAddrText(cur_addr, 0, addressLen > sizeof(duint) * 2 + 1); + QString label; + QString address = getAddrText(cur_addr, label, addressLen > sizeof(duint) * 2 + 1); QString bytes; QString bytesHtml; if(copyBytes) diff --git a/src/gui/Src/Gui/CPUDisassembly.h b/src/gui/Src/Gui/CPUDisassembly.h index 71df9120..063e22be 100644 --- a/src/gui/Src/Gui/CPUDisassembly.h +++ b/src/gui/Src/Gui/CPUDisassembly.h @@ -13,7 +13,7 @@ class CPUDisassembly : public Disassembly Q_OBJECT public: - CPUDisassembly(QWidget* parent, bool isMain); + CPUDisassembly(Architecture* architecture, bool isMain, QWidget* parent = nullptr); // Mouse management void contextMenuEvent(QContextMenuEvent* event); @@ -22,8 +22,8 @@ public: // Context menu management void setupRightClickContextMenu(); - void addFollowReferenceMenuItem(QString name, dsint value, QMenu* menu, bool isReferences, bool isFollowInCPU); - void setupFollowReferenceMenu(dsint wVA, QMenu* menu, bool isReferences, bool isFollowInCPU); + void addFollowReferenceMenuItem(QString name, duint value, QMenu* menu, bool isReferences, bool isFollowInCPU); + void setupFollowReferenceMenu(duint va, QMenu* menu, bool isReferences, bool isFollowInCPU); void copySelectionSlot(bool copyBytes); void copySelectionToFileSlot(bool copyBytes); void setSideBar(CPUSideBar* sideBar); diff --git a/src/gui/Src/Gui/CPUDump.cpp b/src/gui/Src/Gui/CPUDump.cpp index 093163ad..d2a5e424 100644 --- a/src/gui/Src/Gui/CPUDump.cpp +++ b/src/gui/Src/Gui/CPUDump.cpp @@ -15,11 +15,11 @@ #include "MiscUtil.h" #include "BackgroundFlickerThread.h" -CPUDump::CPUDump(CPUDisassembly* disas, CPUMultiDump* multiDump, QWidget* parent) : HexDump(parent) +CPUDump::CPUDump(CPUMultiDump* multiDump, CPUDisassembly* disassembly, QWidget* parent) + : HexDump(multiDump->getArchitecture(), parent), + mMultiDump(multiDump), + mDisassembly(disassembly) { - mDisas = disas; - mMultiDump = multiDump; - duint setting; if(BridgeSettingGetUint("Gui", "AsciiSeparator", &setting)) mAsciiSeparator = setting & 0xF; @@ -27,7 +27,7 @@ CPUDump::CPUDump(CPUDisassembly* disas, CPUMultiDump* multiDump, QWidget* parent setView((ViewEnum_t)ConfigUint("HexDump", "DefaultView")); connect(this, SIGNAL(selectionUpdated()), this, SLOT(selectionUpdatedSlot())); - connect(this, SIGNAL(headerButtonReleased(int)), this, SLOT(headerButtonReleasedSlot(int))); + connect(this, SIGNAL(headerButtonReleased(duint)), this, SLOT(headerButtonReleasedSlot(duint))); mPluginMenu = multiDump->mDumpPluginMenu; @@ -263,7 +263,7 @@ void CPUDump::getAttention() thread->start(); } -void CPUDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & richText) +void CPUDump::getColumnRichText(duint col, duint rva, RichTextPainter::List & richText) { if(col && !mDescriptor.at(col - 1).isData && mDescriptor.at(col - 1).itemCount) //print comments { @@ -308,16 +308,17 @@ void CPUDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & rich HexDump::getColumnRichText(col, rva, richText); } -QString CPUDump::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString CPUDump::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { // Reset byte offset when base address is reached - if(rowBase == 0 && mByteOffset != 0) + // TODO: wtf? + if(getTableOffset() == 0 && mByteOffset != 0) printDumpAt(mMemPage->getBase(), false, false); if(!col) //address { char label[MAX_LABEL_SIZE] = ""; - dsint cur_addr = rvaToVa((rowBase + rowOffset) * getBytePerRowCount() - mByteOffset); + dsint cur_addr = rvaToVa(row * getBytePerRowCount() - mByteOffset); QColor background; if(DbgGetLabelAt(cur_addr, SEG_DEFAULT, label)) //label { @@ -334,7 +335,7 @@ QString CPUDump::paintContent(QPainter* painter, dsint rowBase, int rowOffset, i painter->drawText(QRect(x + 4, y, w - 4, h), Qt::AlignVCenter | Qt::AlignLeft, makeAddrText(cur_addr)); return QString(); } - return HexDump::paintContent(painter, rowBase, rowOffset, col, x, y, w, h); + return HexDump::paintContent(painter, row, col, x, y, w, h); } void CPUDump::contextMenuEvent(QContextMenuEvent* event) @@ -1327,7 +1328,7 @@ void CPUDump::findReferencesSlot() { QString addrStart = ToPtrString(rvaToVa(getSelectionStart())); QString addrEnd = ToPtrString(rvaToVa(getSelectionEnd())); - QString addrDisasm = ToPtrString(mDisas->rvaToVa(mDisas->getSelectionStart())); + QString addrDisasm = ToPtrString(mDisassembly->rvaToVa(mDisassembly->getSelectionStart())); DbgCmdExec(QString("findrefrange " + addrStart + ", " + addrEnd + ", " + addrDisasm)); emit displayReferencesWidget(); } @@ -1611,7 +1612,7 @@ void CPUDump::setView(ViewEnum_t view) } } -void CPUDump::headerButtonReleasedSlot(int colIndex) +void CPUDump::headerButtonReleasedSlot(duint colIndex) { auto callback = mDescriptor[colIndex].columnSwitch; if(callback) diff --git a/src/gui/Src/Gui/CPUDump.h b/src/gui/Src/Gui/CPUDump.h index b14c3316..e99d2a37 100644 --- a/src/gui/Src/Gui/CPUDump.h +++ b/src/gui/Src/Gui/CPUDump.h @@ -12,9 +12,9 @@ class CPUDump : public HexDump { Q_OBJECT public: - explicit CPUDump(CPUDisassembly* disas, CPUMultiDump* multiDump, QWidget* parent = 0); - void getColumnRichText(int col, dsint rva, RichTextPainter::List & richText) override; - QString paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h); + explicit CPUDump(CPUMultiDump* multiDump, CPUDisassembly* disasassembly, QWidget* parent = nullptr); + void getColumnRichText(duint col, duint rva, RichTextPainter::List & richText) override; + QString paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) override; void setupContextMenu(); void getAttention(); void contextMenuEvent(QContextMenuEvent* event) override; @@ -82,7 +82,7 @@ public slots: void syncWithExpressionSlot(); void allocMemorySlot(); - void headerButtonReleasedSlot(int colIndex); + void headerButtonReleasedSlot(duint colIndex); private: MenuBuilder* mMenuBuilder; @@ -94,8 +94,8 @@ private: GotoDialog* mGoto = nullptr; GotoDialog* mGotoOffset = nullptr; - CPUDisassembly* mDisas; - CPUMultiDump* mMultiDump; + CPUDisassembly* mDisassembly = nullptr; + CPUMultiDump* mMultiDump = nullptr; int mAsciiSeparator = 0; enum ViewEnum_t diff --git a/src/gui/Src/Gui/CPUInfoBox.cpp b/src/gui/Src/Gui/CPUInfoBox.cpp index 4261e6e7..b07073b8 100644 --- a/src/gui/Src/Gui/CPUInfoBox.cpp +++ b/src/gui/Src/Gui/CPUInfoBox.cpp @@ -5,7 +5,9 @@ #include "Bridge.h" #include "QZydis.h" -CPUInfoBox::CPUInfoBox(QWidget* parent) : StdTable(parent) +CPUInfoBox::CPUInfoBox(Architecture* architecture, QWidget* parent) + : StdTable(parent), + mArchitecture(architecture) { setWindowTitle("InfoBox"); enableMultiSelection(false); @@ -32,7 +34,7 @@ CPUInfoBox::CPUInfoBox(QWidget* parent) : StdTable(parent) setSingleSelection(-1); int maxModuleSize = (int)ConfigUint("Disassembler", "MaxModuleSize"); - mDisasm = new QZydis(maxModuleSize, Bridge::getArch()); + mDisasm = new QZydis(maxModuleSize, architecture); setupContextMenu(); } diff --git a/src/gui/Src/Gui/CPUInfoBox.h b/src/gui/Src/Gui/CPUInfoBox.h index ac9cd327..8e456a26 100644 --- a/src/gui/Src/Gui/CPUInfoBox.h +++ b/src/gui/Src/Gui/CPUInfoBox.h @@ -1,6 +1,7 @@ #pragma once #include "StdTable.h" +#include "Architecture.h" class WordEditDialog; class XrefBrowseDialog; @@ -10,7 +11,7 @@ class CPUInfoBox : public StdTable { Q_OBJECT public: - explicit CPUInfoBox(QWidget* parent = 0); + CPUInfoBox(Architecture* architecture, QWidget* parent = nullptr); ~CPUInfoBox(); int getHeight(); void addFollowMenuItem(QMenu* menu, QString name, duint value); @@ -37,6 +38,7 @@ public slots: void addInfoLine(const QString & infoLine); private: + Architecture* mArchitecture = nullptr; duint mCurAddr = 0; duint mCurRva = 0; duint mCurOffset = 0; diff --git a/src/gui/Src/Gui/CPUMultiDump.cpp b/src/gui/Src/Gui/CPUMultiDump.cpp index c1d53b35..7eaadd22 100644 --- a/src/gui/Src/Gui/CPUMultiDump.cpp +++ b/src/gui/Src/Gui/CPUMultiDump.cpp @@ -9,8 +9,9 @@ #include #include -CPUMultiDump::CPUMultiDump(CPUDisassembly* disas, int nbCpuDumpTabs, QWidget* parent) - : MHTabWidget(parent, true) +CPUMultiDump::CPUMultiDump(CPUDisassembly* disassembly, int nbCpuDumpTabs, QWidget* parent) + : MHTabWidget(parent, true), + mMainDisassembly(disassembly) { setWindowTitle("CPUMultiDump"); mMaxCPUDumpTabs = nbCpuDumpTabs; @@ -22,7 +23,7 @@ CPUMultiDump::CPUMultiDump(CPUDisassembly* disas, int nbCpuDumpTabs, QWidget* pa for(uint i = 0; i < mMaxCPUDumpTabs; i++) { - CPUDump* cpuDump = new CPUDump(disas, this); + CPUDump* cpuDump = new CPUDump(this, mMainDisassembly); //cpuDump->loadColumnFromConfig(QString("CPUDump%1").arg(i + 1)); //TODO: needs a workaround because the columns change connect(cpuDump, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidgetSlot())); connect(cpuDump, SIGNAL(showDisassemblyTab(duint, duint, duint)), this, SLOT(showDisassemblyTabSlot(duint, duint, duint))); @@ -50,7 +51,7 @@ CPUMultiDump::CPUMultiDump(CPUDisassembly* disas, int nbCpuDumpTabs, QWidget* pa connect(this, SIGNAL(currentChanged(int)), this, SLOT(updateCurrentTabSlot(int))); connect(tabBar(), SIGNAL(OnDoubleClickTabIndex(int)), this, SLOT(openChangeTabTitleDialogSlot(int))); - connect(Bridge::getBridge(), SIGNAL(dumpAt(dsint)), this, SLOT(printDumpAtSlot(dsint))); + connect(Bridge::getBridge(), SIGNAL(dumpAt(duint)), this, SLOT(printDumpAtSlot(duint))); connect(Bridge::getBridge(), SIGNAL(dumpAtN(duint, int)), this, SLOT(printDumpAtNSlot(duint, int))); connect(Bridge::getBridge(), SIGNAL(selectionDumpGet(SELECTIONDATA*)), this, SLOT(selectionGetSlot(SELECTIONDATA*))); connect(Bridge::getBridge(), SIGNAL(selectionDumpSet(const SELECTIONDATA*)), this, SLOT(selectionSetSlot(const SELECTIONDATA*))); @@ -61,6 +62,11 @@ CPUMultiDump::CPUMultiDump(CPUDisassembly* disas, int nbCpuDumpTabs, QWidget* pa connect(mCurrentCPUDump, SIGNAL(selectionUpdated()), mCurrentCPUDump, SLOT(selectionUpdatedSlot())); } +Architecture* CPUMultiDump::getArchitecture() const +{ + return mMainDisassembly->getArchitecture(); +} + CPUDump* CPUMultiDump::getCurrentCPUDump() { return mCurrentCPUDump; @@ -152,7 +158,7 @@ void CPUMultiDump::updateCurrentTabSlot(int tabIndex) mCurrentCPUDump = t; } -void CPUMultiDump::printDumpAtSlot(dsint parVa) +void CPUMultiDump::printDumpAtSlot(duint va) { if(mInitAllDumpTabs) { @@ -165,8 +171,8 @@ void CPUMultiDump::printDumpAtSlot(dsint parVa) if(cpuDump) { cpuDump->mHistory.historyClear(); - cpuDump->mHistory.addVaToHistory(parVa); - cpuDump->printDumpAt(parVa); + cpuDump->mHistory.addVaToHistory(va); + cpuDump->printDumpAt(va); } } @@ -175,12 +181,12 @@ void CPUMultiDump::printDumpAtSlot(dsint parVa) else { SwitchToDumpWindow(); - mCurrentCPUDump->printDumpAt(parVa); - mCurrentCPUDump->mHistory.addVaToHistory(parVa); + mCurrentCPUDump->printDumpAt(va); + mCurrentCPUDump->mHistory.addVaToHistory(va); } } -void CPUMultiDump::printDumpAtNSlot(duint parVa, int index) +void CPUMultiDump::printDumpAtNSlot(duint va, int index) { int tabindex = GetDumpWindowIndex(index); if(tabindex == 2147483647) @@ -189,8 +195,8 @@ void CPUMultiDump::printDumpAtNSlot(duint parVa, int index) if(!current) return; setCurrentIndex(tabindex); - current->printDumpAt(parVa); - current->mHistory.addVaToHistory(parVa); + current->printDumpAt(va); + current->mHistory.addVaToHistory(va); } void CPUMultiDump::selectionGetSlot(SELECTIONDATA* selectionData) @@ -238,23 +244,23 @@ void CPUMultiDump::focusCurrentDumpSlot() void CPUMultiDump::showDisassemblyTabSlot(duint selectionStart, duint selectionEnd, duint firstAddress) { Q_UNUSED(firstAddress); // TODO: implement setTableOffset(firstAddress) - if(!mDisassembly) + if(!mExtraDisassembly) { - mDisassembly = new CPUDisassembly(this, false); - this->addTabEx(mDisassembly, DIcon(ArchValue("processor32", "processor64")), tr("Disassembly"), "DumpDisassembly"); + mExtraDisassembly = new CPUDisassembly(mMainDisassembly->getArchitecture(), false, this); + this->addTabEx(mExtraDisassembly, DIcon(ArchValue("processor32", "processor64")), tr("Disassembly"), "DumpDisassembly"); } // Set CIP - auto clearHistory = mDisassembly->getBase() == 0; - mDisassembly->disassembleAtSlot(selectionStart, Bridge::getBridge()->mLastCip); + auto clearHistory = mExtraDisassembly->getBase() == 0; + mExtraDisassembly->disassembleAtSlot(selectionStart, Bridge::getBridge()->mLastCip); if(clearHistory) - mDisassembly->historyClear(); + mExtraDisassembly->historyClear(); // Make the address visisble in memory - mDisassembly->disassembleAt(selectionStart, true, -1); + mExtraDisassembly->disassembleAt(selectionStart, true, -1); // Set selection to match the dump - mDisassembly->setSingleSelection(selectionStart - mDisassembly->getBase()); - mDisassembly->expandSelectionUpTo(selectionEnd - mDisassembly->getBase()); + mExtraDisassembly->setSingleSelection(selectionStart - mExtraDisassembly->getBase()); + mExtraDisassembly->expandSelectionUpTo(selectionEnd - mExtraDisassembly->getBase()); // Show the tab - setCurrentWidget(mDisassembly); + setCurrentWidget(mExtraDisassembly); } void CPUMultiDump::getDumpAttention() diff --git a/src/gui/Src/Gui/CPUMultiDump.h b/src/gui/Src/Gui/CPUMultiDump.h index d93b2263..92d68292 100644 --- a/src/gui/Src/Gui/CPUMultiDump.h +++ b/src/gui/Src/Gui/CPUMultiDump.h @@ -14,11 +14,12 @@ class CPUMultiDump : public MHTabWidget { Q_OBJECT public: - explicit CPUMultiDump(CPUDisassembly* disas, int nbCpuDumpTabs = 1, QWidget* parent = 0); + explicit CPUMultiDump(CPUDisassembly* disassembly, int nbCpuDumpTabs = 1, QWidget* parent = nullptr); + Architecture* getArchitecture() const; CPUDump* getCurrentCPUDump(); void getTabNames(QList & names); int getMaxCPUTabs(); - QMenu* mDumpPluginMenu; + QMenu* mDumpPluginMenu; // TODO: no void saveWindowSettings(); void loadWindowSettings(); @@ -27,8 +28,8 @@ signals: public slots: void updateCurrentTabSlot(int tabIndex); - void printDumpAtSlot(dsint parVa); - void printDumpAtNSlot(duint parVa, int index); + void printDumpAtSlot(duint va); + void printDumpAtNSlot(duint va, int index); void selectionGetSlot(SELECTIONDATA* selectionData); void selectionSetSlot(const SELECTIONDATA* selectionData); void dbgStateChangedSlot(DBGSTATE dbgState); @@ -46,7 +47,8 @@ private: WatchView* mWatch; LocalVarsView* mLocalVars; StructWidget* mStructWidget; - CPUDisassembly* mDisassembly = nullptr; + CPUDisassembly* mMainDisassembly = nullptr; + CPUDisassembly* mExtraDisassembly = nullptr; int GetDumpWindowIndex(int dump); int GetWatchWindowIndex(); diff --git a/src/gui/Src/Gui/CPURegistersView.cpp b/src/gui/Src/Gui/CPURegistersView.cpp index 9d12e3a5..f035a0f4 100644 --- a/src/gui/Src/Gui/CPURegistersView.cpp +++ b/src/gui/Src/Gui/CPURegistersView.cpp @@ -37,7 +37,7 @@ CPURegistersView::CPURegistersView(CPUWidget* parent) : RegistersView(parent), m connect(Bridge::getBridge(), SIGNAL(updateRegisters()), this, SLOT(updateRegistersSlot())); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayCustomContextMenuSlot(QPoint))); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); - connect(parent->getDisasmWidget(), SIGNAL(selectionChanged(dsint)), this, SLOT(disasmSelectionChangedSlot(dsint))); + connect(parent->getDisasmWidget(), SIGNAL(selectionChanged(duint)), this, SLOT(disasmSelectionChangedSlot(duint))); // context menu actions connect(wCM_Incrementx87Stack, SIGNAL(triggered()), this, SLOT(onIncrementx87StackAction())); connect(wCM_Decrementx87Stack, SIGNAL(triggered()), this, SLOT(onDecrementx87StackAction())); diff --git a/src/gui/Src/Gui/CPUSideBar.cpp b/src/gui/Src/Gui/CPUSideBar.cpp index 0da42212..ac5fb1d0 100644 --- a/src/gui/Src/Gui/CPUSideBar.cpp +++ b/src/gui/Src/Gui/CPUSideBar.cpp @@ -215,7 +215,7 @@ void CPUSideBar::paintEvent(QPaintEvent* event) std::vector jumpLines; std::vector labelArrows; - for(int line = 0; line < mViewableRows; line++) + for(duint line = 0; line < mViewableRows; line++) { if(line >= mInstrBuffer->size()) //at the end of the page it will crash otherwise break; diff --git a/src/gui/Src/Gui/CPUStack.cpp b/src/gui/Src/Gui/CPUStack.cpp index 59d42e0d..334de6a0 100644 --- a/src/gui/Src/Gui/CPUStack.cpp +++ b/src/gui/Src/Gui/CPUStack.cpp @@ -9,7 +9,8 @@ #include "CPUMultiDump.h" #include "GotoDialog.h" -CPUStack::CPUStack(CPUMultiDump* multiDump, QWidget* parent) : HexDump(parent) +CPUStack::CPUStack(CPUMultiDump* multiDump, QWidget* parent) + : HexDump(multiDump->getArchitecture(), parent) { setWindowTitle("Stack"); setShowHeader(false); @@ -309,7 +310,7 @@ void CPUStack::updateFreezeStackAction() mFreezeStack->setChecked(bStackFrozen); } -void CPUStack::getColumnRichText(int col, dsint rva, RichTextPainter::List & richText) +void CPUStack::getColumnRichText(duint col, duint rva, RichTextPainter::List & richText) { // Compute VA duint va = rvaToVa(rva); @@ -365,24 +366,24 @@ void CPUStack::getColumnRichText(int col, dsint rva, RichTextPainter::List & ric HexDump::getColumnRichText(col, rva, richText); } -QString CPUStack::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString CPUStack::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { // Compute RVA - int wBytePerRowCount = getBytePerRowCount(); - dsint wRva = (rowBase + rowOffset) * wBytePerRowCount - mByteOffset; - duint wVa = rvaToVa(wRva); + auto bytePerRowCount = getBytePerRowCount(); + dsint rva = row * bytePerRowCount - mByteOffset; + duint va = rvaToVa(rva); - bool wIsSelected = isSelected(wRva); - if(wIsSelected) //highlight if selected + bool rowSelected = isSelected(rva); + if(rowSelected) //highlight if selected painter->fillRect(QRect(x, y, w, h), QBrush(mSelectionColor)); if(col == 0) // paint stack address { QColor background; char labelText[MAX_LABEL_SIZE] = ""; - if(DbgGetLabelAt(wVa, SEG_DEFAULT, labelText)) //label + if(DbgGetLabelAt(va, SEG_DEFAULT, labelText)) //label { - if(wVa == mCsp) //CSP + if(va == mCsp) //CSP { background = ConfigColor("StackCspBackgroundColor"); painter->setPen(QPen(ConfigColor("StackCspColor"))); @@ -395,12 +396,12 @@ QString CPUStack::paintContent(QPainter* painter, dsint rowBase, int rowOffset, } else //no label { - if(wVa == mCsp) //CSP + if(va == mCsp) //CSP { background = ConfigColor("StackCspBackgroundColor"); painter->setPen(QPen(ConfigColor("StackCspColor"))); } - else if(wIsSelected) //selected normal address + else if(rowSelected) //selected normal address { background = ConfigColor("StackSelectedAddressBackgroundColor"); painter->setPen(QPen(ConfigColor("StackSelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) @@ -413,7 +414,7 @@ QString CPUStack::paintContent(QPainter* painter, dsint rowBase, int rowOffset, } if(background.alpha()) painter->fillRect(QRect(x, y, w, h), QBrush(background)); //fill background when defined - painter->drawText(QRect(x + 4, y, w - 4, h), Qt::AlignVCenter | Qt::AlignLeft, makeAddrText(wVa)); + painter->drawText(QRect(x + 4, y, w - 4, h), Qt::AlignVCenter | Qt::AlignLeft, makeAddrText(va)); return QString(); } else if(col == 1) // paint stack data @@ -422,14 +423,14 @@ QString CPUStack::paintContent(QPainter* painter, dsint rowBase, int rowOffset, { int stackFrameBitfield = 0; // 0:none, 1:top of stack frame, 2:bottom of stack frame, 4:middle of stack frame int party = 0; - if(wVa >= mCallstack[0].addr) + if(va >= mCallstack[0].addr) { for(size_t i = 0; i < mCallstack.size() - 1; i++) { - if(wVa >= mCallstack[i].addr && wVa < mCallstack[i + 1].addr) + if(va >= mCallstack[i].addr && va < mCallstack[i + 1].addr) { - stackFrameBitfield |= (mCallstack[i].addr == wVa) ? 1 : 0; - stackFrameBitfield |= (mCallstack[i + 1].addr == wVa + sizeof(duint)) ? 2 : 0; + stackFrameBitfield |= (mCallstack[i].addr == va) ? 1 : 0; + stackFrameBitfield |= (mCallstack[i + 1].addr == va + sizeof(duint)) ? 2 : 0; if(stackFrameBitfield == 0) stackFrameBitfield = 4; party = mCallstack[i].party; @@ -438,14 +439,14 @@ QString CPUStack::paintContent(QPainter* painter, dsint rowBase, int rowOffset, } // draw stack frame if(stackFrameBitfield == 0) - return HexDump::paintContent(painter, rowBase, rowOffset, 1, x, y, w, h); + return HexDump::paintContent(painter, row, 1, x, y, w, h); else { int height = getRowHeight(); int halfHeight = height / 2; int width = 5; int offset = 2; - auto result = HexDump::paintContent(painter, rowBase, rowOffset, 1, x + (width - 2), y, w - (width - 2), h); + auto result = HexDump::paintContent(painter, row, 1, x + (width - 2), y, w - (width - 2), h); if(party == mod_user) painter->setPen(QPen(mUserStackFrameColor, 2)); else @@ -468,13 +469,13 @@ QString CPUStack::paintContent(QPainter* painter, dsint rowBase, int rowOffset, } } else - return HexDump::paintContent(painter, rowBase, rowOffset, 1, x, y, w, h); + return HexDump::paintContent(painter, row, 1, x, y, w, h); } else - return HexDump::paintContent(painter, rowBase, rowOffset, 1, x, y, w, h); + return HexDump::paintContent(painter, row, 1, x, y, w, h); } else - return HexDump::paintContent(painter, rowBase, rowOffset, col, x, y, w, h); + return HexDump::paintContent(painter, row, col, x, y, w, h); } void CPUStack::contextMenuEvent(QContextMenuEvent* event) @@ -602,7 +603,7 @@ void CPUStack::updateSlot() } } -void CPUStack::disasmSelectionChanged(dsint parVA) +void CPUStack::disasmSelectionChanged(duint parVA) { // When the selected instruction is changed, select the argument that is in the stack. DISASM_INSTR instr; diff --git a/src/gui/Src/Gui/CPUStack.h b/src/gui/Src/Gui/CPUStack.h index 8983037b..fe2d335a 100644 --- a/src/gui/Src/Gui/CPUStack.h +++ b/src/gui/Src/Gui/CPUStack.h @@ -11,16 +11,16 @@ class CPUStack : public HexDump { Q_OBJECT public: - explicit CPUStack(CPUMultiDump* multiDump, QWidget* parent = 0); + explicit CPUStack(CPUMultiDump* multiDump, QWidget* parent = nullptr); // Configuration - virtual void updateColors(); - virtual void updateFonts(); + void updateColors() override; + void updateFonts() override; - void getColumnRichText(int col, dsint rva, RichTextPainter::List & richText) override; - QString paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) override; - void contextMenuEvent(QContextMenuEvent* event); - void mouseDoubleClickEvent(QMouseEvent* event); + void getColumnRichText(duint col, duint rva, RichTextPainter::List & richText) override; + QString paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) override; + void contextMenuEvent(QContextMenuEvent* event) override; + void mouseDoubleClickEvent(QMouseEvent* event) override; void wheelEvent(QWheelEvent* event) override; void setupContextMenu(); void updateFreezeStackAction(); @@ -52,7 +52,7 @@ public slots: void realignSlot(); void freezeStackSlot(); void dbgStateChangedSlot(DBGSTATE state); - void disasmSelectionChanged(dsint parVA); + void disasmSelectionChanged(duint parVA); void updateSlot(); void copyPtrColumnSlot(); void copyCommentsColumnSlot(); @@ -82,5 +82,5 @@ private: CommonActions* mCommonActions; std::vector mCallstack; - static int CPUStack::getCurrentFrame(const std::vector & mCallstack, duint wVA); + static int CPUStack::getCurrentFrame(const std::vector & mCallstack, duint va); }; diff --git a/src/gui/Src/Gui/CPUWidget.cpp b/src/gui/Src/Gui/CPUWidget.cpp index 81c1c1b8..e4a956da 100644 --- a/src/gui/Src/Gui/CPUWidget.cpp +++ b/src/gui/Src/Gui/CPUWidget.cpp @@ -14,22 +14,25 @@ #include "Configuration.h" #include "TabWidget.h" -CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) +CPUWidget::CPUWidget(Architecture* architecture, QWidget* parent) + : QWidget(parent), + ui(new Ui::CPUWidget), + mArchitecture(architecture) { ui->setupUi(this); setDefaultDisposition(); setStyleSheet("AbstractTableView:focus, CPURegistersView:focus, CPUSideBar:focus { border: 1px solid #000000; }"); - mDisas = new CPUDisassembly(this, true); - mSideBar = new CPUSideBar(mDisas); - mDisas->setSideBar(mSideBar); - mArgumentWidget = new CPUArgumentWidget(this); - mGraph = new DisassemblerGraphView(this); + mDisassembly = new CPUDisassembly(architecture, true, this); + mSideBar = new CPUSideBar(mDisassembly); + mDisassembly->setSideBar(mSideBar); + mArgumentWidget = new CPUArgumentWidget(architecture, this); + mGraph = new DisassemblerGraphView(architecture, this); - connect(mDisas, SIGNAL(tableOffsetChanged(dsint)), mSideBar, SLOT(changeTopmostAddress(dsint))); - connect(mDisas, SIGNAL(viewableRowsChanged(int)), mSideBar, SLOT(setViewableRows(int))); - connect(mDisas, SIGNAL(selectionChanged(dsint)), mSideBar, SLOT(setSelection(dsint))); + connect(mDisassembly, SIGNAL(tableOffsetChanged(duint)), mSideBar, SLOT(changeTopmostAddress(duint))); + connect(mDisassembly, SIGNAL(viewableRowsChanged(duint)), mSideBar, SLOT(setViewableRows(duint))); + connect(mDisassembly, SIGNAL(selectionChanged(duint)), mSideBar, SLOT(setSelection(duint))); connect(mGraph, SIGNAL(detachGraph()), this, SLOT(detachGraph())); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), mSideBar, SLOT(debugStateChangedSlot(DBGSTATE))); connect(Bridge::getBridge(), SIGNAL(updateSideBar()), mSideBar, SLOT(reload())); @@ -37,12 +40,12 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) connect(Bridge::getBridge(), SIGNAL(focusDisasm()), this, SLOT(setDisasmFocus())); connect(Bridge::getBridge(), SIGNAL(focusGraph()), this, SLOT(setGraphFocus())); - mDisas->setCodeFoldingManager(mSideBar->getCodeFoldingManager()); + mDisassembly->setCodeFoldingManager(mSideBar->getCodeFoldingManager()); ui->mTopLeftUpperHSplitter->setCollapsible(0, true); //allow collapsing of the side bar ui->mTopLeftUpperLeftFrameLayout->addWidget(mSideBar); - ui->mTopLeftUpperRightFrameLayout->addWidget(mDisas); + ui->mTopLeftUpperRightFrameLayout->addWidget(mDisassembly); ui->mTopLeftUpperRightFrameLayout->addWidget(mGraph); mGraph->hide(); disasMode = 0; @@ -51,14 +54,14 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) ui->mTopLeftVSplitter->setCollapsible(1, true); //allow collapsing of the InfoBox connect(ui->mTopLeftVSplitter, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved(int, int))); - mInfo = new CPUInfoBox(); + mInfo = new CPUInfoBox(architecture); ui->mTopLeftLowerFrameLayout->addWidget(mInfo); int height = mInfo->getHeight(); ui->mTopLeftLowerFrame->setMinimumHeight(height + 2); - connect(mDisas, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); + connect(mDisassembly, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); - mDump = new CPUMultiDump(mDisas, 5, this); //dump widget + mDump = new CPUMultiDump(mDisassembly, 5, this); //dump widget ui->mBotLeftFrameLayout->addWidget(mDump); mGeneralRegs = new CPURegistersView(this); @@ -85,9 +88,9 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) mStack = new CPUStack(mDump, 0); //stack widget ui->mBotRightFrameLayout->addWidget(mStack); - connect(mDisas, SIGNAL(selectionChanged(dsint)), mStack, SLOT(disasmSelectionChanged(dsint))); + connect(mDisassembly, SIGNAL(selectionChanged(duint)), mStack, SLOT(disasmSelectionChanged(duint))); - mDisas->setAccessibleName(tr("Disassembly")); + mDisassembly->setAccessibleName(tr("Disassembly")); mStack->setAccessibleName(tr("Stack")); upperScrollArea->setAccessibleName(tr("Registers")); mDump->setAccessibleName(tr("Dump")); @@ -96,7 +99,7 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) mInfo->setAccessibleName(tr("InfoBox")); // load column config - mDisas->loadColumnFromConfig("CPUDisassembly"); + mDisassembly->loadColumnFromConfig("CPUDisassembly"); mStack->loadColumnFromConfig("CPUStack"); } @@ -146,6 +149,11 @@ CPUWidget::~CPUWidget() delete ui; } +Architecture* CPUWidget::getArchitecture() const +{ + return mArchitecture; +} + void CPUWidget::setDefaultDisposition() { // This is magic, don't touch it... @@ -180,18 +188,18 @@ void CPUWidget::setDisasmFocus() if(disasMode == 1) { mGraph->hide(); - mDisas->show(); + mDisassembly->show(); mSideBar->show(); ui->mTopLeftUpperHSplitter->restoreState(mDisasmSidebarSplitterStatus); disasMode = 0; - connect(mDisas, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); - disconnect(mGraph, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); + connect(mDisassembly, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); + disconnect(mGraph, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); } else if(disasMode == 2) { activateWindow(); } - mDisas->setFocus(); + mDisassembly->setFocus(); } void CPUWidget::setGraphFocus() @@ -199,14 +207,14 @@ void CPUWidget::setGraphFocus() if(disasMode == 0) { mDisasmSidebarSplitterStatus = ui->mTopLeftUpperHSplitter->saveState(); - mDisas->hide(); + mDisassembly->hide(); mSideBar->hide(); mGraph->show(); // Hide the sidebar area ui->mTopLeftUpperHSplitter->setSizes(QList({0, 100})); disasMode = 1; - disconnect(mDisas, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); - connect(mGraph, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); + disconnect(mDisassembly, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); + connect(mGraph, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); } else if(disasMode == 2) { @@ -250,12 +258,12 @@ void CPUWidget::detachGraph() disasMode = 2; - mDisas->show(); + mDisassembly->show(); mSideBar->show(); // restore the sidebar splitter so that the sidebar is visible ui->mTopLeftUpperHSplitter->restoreState(mDisasmSidebarSplitterStatus); - connect(mDisas, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); - connect(mGraph, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); + connect(mDisassembly, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); + connect(mGraph, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); } } @@ -266,7 +274,7 @@ void CPUWidget::attachGraph(QWidget* widget) ui->mTopLeftUpperRightFrameLayout->addWidget(mGraph); mGraph->hide(); mGraphWindow->close(); - disconnect(mGraph, SIGNAL(selectionChanged(dsint)), mInfo, SLOT(disasmSelectionChanged(dsint))); + disconnect(mGraph, SIGNAL(selectionChanged(duint)), mInfo, SLOT(disasmSelectionChanged(duint))); delete mGraphWindow; mGraphWindow = nullptr; disasMode = 0; @@ -276,9 +284,9 @@ void CPUWidget::attachGraph(QWidget* widget) duint CPUWidget::getSelectionVa() { if(disasMode < 2) - return disasMode == 0 ? mDisas->getSelectedVa() : mGraph->get_cursor_pos(); + return disasMode == 0 ? mDisassembly->getSelectedVa() : mGraph->get_cursor_pos(); else - return !mGraph->hasFocus() ? mDisas->getSelectedVa() : mGraph->get_cursor_pos(); + return !mGraph->hasFocus() ? mDisassembly->getSelectedVa() : mGraph->get_cursor_pos(); } CPUSideBar* CPUWidget::getSidebarWidget() @@ -288,7 +296,7 @@ CPUSideBar* CPUWidget::getSidebarWidget() CPUDisassembly* CPUWidget::getDisasmWidget() { - return mDisas; + return mDisassembly; } DisassemblerGraphView* CPUWidget::getGraphWidget() diff --git a/src/gui/Src/Gui/CPUWidget.h b/src/gui/Src/Gui/CPUWidget.h index 5822d37c..f829805b 100644 --- a/src/gui/Src/Gui/CPUWidget.h +++ b/src/gui/Src/Gui/CPUWidget.h @@ -24,8 +24,9 @@ class CPUWidget : public QWidget Q_OBJECT public: - explicit CPUWidget(QWidget* parent = 0); + explicit CPUWidget(Architecture* architecture, QWidget* parent = nullptr); ~CPUWidget(); + Architecture* getArchitecture() const; // Misc void setDefaultDisposition(); @@ -49,7 +50,7 @@ public slots: protected: CPUSideBar* mSideBar; - CPUDisassembly* mDisas; + CPUDisassembly* mDisassembly; DisassemblerGraphView* mGraph; MHDetachedWindow* mGraphWindow; CPUMultiDump* mDump; @@ -61,6 +62,7 @@ protected: int disasMode; private: + Architecture* mArchitecture = nullptr; Ui::CPUWidget* ui; QByteArray mDisasmSidebarSplitterStatus; diff --git a/src/gui/Src/Gui/CallStackView.cpp b/src/gui/Src/Gui/CallStackView.cpp index 898ff588..1e3e43d1 100644 --- a/src/gui/Src/Gui/CallStackView.cpp +++ b/src/gui/Src/Gui/CallStackView.cpp @@ -73,16 +73,16 @@ void CallStackView::setupContextMenu() mMenuBuilder->loadFromConfig(); } -QString CallStackView::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString CallStackView::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { - if(isSelected(rowBase, rowOffset)) + if(isSelected(row)) painter->fillRect(QRect(x, y, w, h), QBrush(mSelectionColor)); - bool isSpaceRow = !getCellContent(rowBase + rowOffset, ColThread).isEmpty(); + bool isSpaceRow = !getCellContent(row, ColThread).isEmpty(); - if(col == ColThread && !(rowBase + rowOffset)) + if(col == ColThread && row == 0) { - QString ret = getCellContent(rowBase + rowOffset, col); + QString ret = getCellContent(row, col); if(!ret.isEmpty()) { painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("ThreadCurrentBackgroundColor"))); @@ -98,8 +98,8 @@ QString CallStackView::paintContent(QPainter* painter, dsint rowBase, int rowOff } else if(col == ColFrom || col == ColTo || col == ColAddress) { - QString ret = getCellContent(rowBase + rowOffset, col); - BPXTYPE bpxtype = DbgGetBpxTypeAt(getCellUserdata(rowBase + rowOffset, col)); + QString ret = getCellContent(row, col); + BPXTYPE bpxtype = DbgGetBpxTypeAt(getCellUserdata(row, col)); if(bpxtype & bp_normal) { painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBreakpointBackgroundColor"))); @@ -115,7 +115,7 @@ QString CallStackView::paintContent(QPainter* painter, dsint rowBase, int rowOff return ""; } } - return StdIconTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h); + return StdIconTable::paintContent(painter, row, col, x, y, w, h); } void CallStackView::updateCallStack() diff --git a/src/gui/Src/Gui/ColumnReorderDialog.cpp b/src/gui/Src/Gui/ColumnReorderDialog.cpp index e9f0a532..2fb8cd11 100644 --- a/src/gui/Src/Gui/ColumnReorderDialog.cpp +++ b/src/gui/Src/Gui/ColumnReorderDialog.cpp @@ -10,7 +10,7 @@ ColumnReorderDialog::ColumnReorderDialog(AbstractTableView* parent) : { ui->setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint | Qt::MSWindowsFixedSizeDialogHint); - for(int j = 0; j < parent->getColumnCount(); j++) + for(duint j = 0; j < parent->getColumnCount(); j++) { int i = parent->mColumnOrder[j]; if(parent->getColumnHidden(i)) diff --git a/src/gui/Src/Gui/DisassemblerGraphView.cpp b/src/gui/Src/Gui/DisassemblerGraphView.cpp index 8876901b..691c60aa 100644 --- a/src/gui/Src/Gui/DisassemblerGraphView.cpp +++ b/src/gui/Src/Gui/DisassemblerGraphView.cpp @@ -17,18 +17,12 @@ #include "MiscUtil.h" #include -DisassemblerGraphView::DisassemblerGraphView(QWidget* parent) +DisassemblerGraphView::DisassemblerGraphView(Architecture* architecture, QWidget* parent) : QAbstractScrollArea(parent), - mFontMetrics(nullptr), - currentGraph(duint(0)), - disasm(ConfigUint("Disassembler", "MaxModuleSize"), Bridge::getArch()), - mCip(0), - mGoto(nullptr), - syncOrigin(false), - forceCenter(false), - layoutType(LayoutType::Medium), - mHistoryLock(false), - mXrefDlg(nullptr) + mArchitecture(architecture), + currentGraph(0), + disasm(ConfigUint("Disassembler", "MaxModuleSize"), architecture), + layoutType(LayoutType::Medium) { this->status = "Loading..."; diff --git a/src/gui/Src/Gui/DisassemblerGraphView.h b/src/gui/Src/Gui/DisassemblerGraphView.h index 8339d025..1e07715a 100644 --- a/src/gui/Src/Gui/DisassemblerGraphView.h +++ b/src/gui/Src/Gui/DisassemblerGraphView.h @@ -206,7 +206,7 @@ public: bool inBlock = false; }; - DisassemblerGraphView(QWidget* parent = nullptr); + DisassemblerGraphView(Architecture* architecture, QWidget* parent = nullptr); ~DisassemblerGraphView(); void resetGraph(); void initFont(); @@ -294,6 +294,7 @@ public slots: void enableHighlightingModeSlot(); private: + Architecture* mArchitecture = nullptr; bool graphZoomMode; qreal zoomLevel; qreal zoomLevelOld; @@ -329,23 +330,23 @@ private: std::unordered_map blocks; std::vector col_edge_x; std::vector row_edge_y; - CachedFontMetrics* mFontMetrics; - MenuBuilder* mMenuBuilder; - CommonActions* mCommonActions; - QMenu* mPluginMenu; + CachedFontMetrics* mFontMetrics = nullptr; + MenuBuilder* mMenuBuilder = nullptr; + CommonActions* mCommonActions = nullptr; + QMenu* mPluginMenu = nullptr; bool drawOverview; bool onlySummary; - bool syncOrigin; + bool syncOrigin = false; int overviewXOfs; int overviewYOfs; qreal overviewScale; - duint mCip; - bool forceCenter; + duint mCip = 0; + bool forceCenter = false; bool saveGraph; - bool mHistoryLock; //Don't add a history while going to previous/next + bool mHistoryLock = false; //Don't add a history while going to previous/next LayoutType layoutType; - MenuBuilder* mHighlightMenuBuilder; + MenuBuilder* mHighlightMenuBuilder = nullptr; ZydisTokenizer::SingleToken mHighlightToken; bool mHighlightingModeEnabled; bool mPermanentHighlightingMode; @@ -387,8 +388,8 @@ private: BridgeCFGraph currentGraph; std::unordered_map currentBlockMap; QZydis disasm; - GotoDialog* mGoto; - XrefBrowseDialog* mXrefDlg; + GotoDialog* mGoto = nullptr; + XrefBrowseDialog* mXrefDlg = nullptr; void addReferenceAction(QMenu* menu, duint addr, const QString & description); bool getHighlightedTokenValueText(QString & text); diff --git a/src/gui/Src/Gui/HandlesView.cpp b/src/gui/Src/Gui/HandlesView.cpp index 46663d5d..2568bf25 100644 --- a/src/gui/Src/Gui/HandlesView.cpp +++ b/src/gui/Src/Gui/HandlesView.cpp @@ -284,7 +284,7 @@ void HandlesView::enableAllPrivilegesSlot() { if(!DbgIsDebugging()) return; - for(int i = 0; i < mPrivilegesTable->getRowCount(); i++) + for(duint i = 0; i < mPrivilegesTable->getRowCount(); i++) if(mPrivilegesTable->getCellContent(i, 1) != tr("Unknown")) DbgCmdExecDirect(QString("EnablePrivilege \"%1\"").arg(mPrivilegesTable->getCellContent(i, 0))); enumPrivileges(); @@ -294,7 +294,7 @@ void HandlesView::disableAllPrivilegesSlot() { if(!DbgIsDebugging()) return; - for(int i = 0; i < mPrivilegesTable->getRowCount(); i++) + for(duint i = 0; i < mPrivilegesTable->getRowCount(); i++) if(mPrivilegesTable->getCellContent(i, 1) != tr("Unknown")) DbgCmdExecDirect(QString("DisablePrivilege \"%1\"").arg(mPrivilegesTable->getCellContent(i, 0))); enumPrivileges(); diff --git a/src/gui/Src/Gui/MainWindow.cpp b/src/gui/Src/Gui/MainWindow.cpp index c0ca9cbc..48420c01 100644 --- a/src/gui/Src/Gui/MainWindow.cpp +++ b/src/gui/Src/Gui/MainWindow.cpp @@ -195,7 +195,7 @@ MainWindow::MainWindow(QWidget* parent) mScriptView->hide(); // CPU view - mCpuWidget = new CPUWidget(); + mCpuWidget = new CPUWidget(Bridge::getArchitecture()); mCpuWidget->setWindowTitle(tr("CPU")); #ifdef _WIN64 mCpuWidget->setWindowIcon(DIcon("processor64")); @@ -836,7 +836,7 @@ void MainWindow::closeEvent(QCloseEvent* event) bExecuteThread = false; Sleep(100); mCloseThread->start(); - emit Bridge::getBridge()->shutdown(); + emit Bridge::getBridge()->close(); } if(bCanClose) { diff --git a/src/gui/Src/Gui/RegistersView.cpp b/src/gui/Src/Gui/RegistersView.cpp index 0ca20ea8..f68666ec 100644 --- a/src/gui/Src/Gui/RegistersView.cpp +++ b/src/gui/Src/Gui/RegistersView.cpp @@ -1088,7 +1088,7 @@ RegistersView::RegistersView(QWidget* parent) : QScrollArea(parent), mVScrollOff connect(Config(), SIGNAL(fontsUpdated()), this, SLOT(fontsUpdatedSlot())); // self communication for repainting (maybe some other widgets needs this information, too) connect(this, SIGNAL(refresh()), this, SLOT(reload())); - connect(Bridge::getBridge(), SIGNAL(shutdown()), this, SLOT(shutdownSlot())); + connect(Bridge::getBridge(), SIGNAL(close()), this, SLOT(shutdownSlot())); InitMappings(); diff --git a/src/gui/Src/Gui/SourceView.cpp b/src/gui/Src/Gui/SourceView.cpp index d297015a..2ed42ad0 100644 --- a/src/gui/Src/Gui/SourceView.cpp +++ b/src/gui/Src/Gui/SourceView.cpp @@ -41,7 +41,7 @@ SourceView::~SourceView() clear(); } -QString SourceView::getCellContent(int r, int c) +QString SourceView::getCellContent(duint r, duint c) { if(!isValidIndex(r, c)) return QString(); @@ -59,7 +59,7 @@ QString SourceView::getCellContent(int r, int c) return "INVALID"; } -bool SourceView::isValidIndex(int r, int c) +bool SourceView::isValidIndex(duint r, duint c) { if(!mFileLines) return false; @@ -68,7 +68,7 @@ bool SourceView::isValidIndex(int r, int c) return r >= 0 && size_t(r) < mFileLines->size(); } -void SourceView::sortRows(int column, bool ascending) +void SourceView::sortRows(duint column, bool ascending) { Q_UNUSED(column); Q_UNUSED(ascending); @@ -83,7 +83,7 @@ void SourceView::prepareData() mPrepareTableOffset = getTableOffset(); mLines.clear(); mLines.resize(lines); - for(auto i = 0; i < lines; i++) + for(duint i = 0; i < lines; i++) parseLine(mPrepareTableOffset + i, mLines[i]); } } diff --git a/src/gui/Src/Gui/SourceView.h b/src/gui/Src/Gui/SourceView.h index 90520b11..9c2c9e32 100644 --- a/src/gui/Src/Gui/SourceView.h +++ b/src/gui/Src/Gui/SourceView.h @@ -13,9 +13,9 @@ public: SourceView(QString path, duint addr, QWidget* parent = nullptr); ~SourceView(); - QString getCellContent(int r, int c) override; - bool isValidIndex(int r, int c) override; - void sortRows(int column, bool ascending) override; + QString getCellContent(duint r, duint c) override; + bool isValidIndex(duint r, duint c) override; + void sortRows(duint column, bool ascending) override; void prepareData() override; QString getSourcePath(); diff --git a/src/gui/Src/Gui/ThreadView.cpp b/src/gui/Src/Gui/ThreadView.cpp index fd1da612..289140ad 100644 --- a/src/gui/Src/Gui/ThreadView.cpp +++ b/src/gui/Src/Gui/ThreadView.cpp @@ -366,10 +366,10 @@ void ThreadView::updateThreadList() reloadData(); } -QString ThreadView::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString ThreadView::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { - QString ret = StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h); - duint threadId = getCellUserdata(rowBase + rowOffset, 1); + QString ret = StdTable::paintContent(painter, row, col, x, y, w, h); + duint threadId = getCellUserdata(row, 1); if(threadId == mCurrentThreadId && !col) { painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("ThreadCurrentBackgroundColor"))); diff --git a/src/gui/Src/Gui/WatchView.cpp b/src/gui/Src/Gui/WatchView.cpp index f6addaee..ce4cea8b 100644 --- a/src/gui/Src/Gui/WatchView.cpp +++ b/src/gui/Src/Gui/WatchView.cpp @@ -181,10 +181,9 @@ QString WatchView::getSelectedId() return QChar('.') + getCellContent(getInitialSelection(), ColId); } -QString WatchView::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) +QString WatchView::paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) { - QString ret = StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h); - const dsint row = rowBase + rowOffset; + QString ret = StdTable::paintContent(painter, row, col, x, y, w, h); if(row != getInitialSelection() && DbgFunctions()->WatchIsWatchdogTriggered(getCellContent(row, ColId).toUInt())) { painter->fillRect(QRect(x, y, w, h), mWatchTriggeredBackgroundColor); diff --git a/src/gui/Src/Gui/WatchView.h b/src/gui/Src/Gui/WatchView.h index 658cfbfc..caa2af0c 100644 --- a/src/gui/Src/Gui/WatchView.h +++ b/src/gui/Src/Gui/WatchView.h @@ -10,7 +10,7 @@ class WatchView : public StdTable public: WatchView(CPUMultiDump* parent); - QString paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h) override; + QString paintContent(QPainter* painter, duint row, duint col, int x, int y, int w, int h) override; void updateColors() override; public slots: diff --git a/src/gui/Src/Gui/ZehSymbolTable.cpp b/src/gui/Src/Gui/ZehSymbolTable.cpp index 98eae731..335f72ad 100644 --- a/src/gui/Src/Gui/ZehSymbolTable.cpp +++ b/src/gui/Src/Gui/ZehSymbolTable.cpp @@ -56,7 +56,7 @@ ZehSymbolTable::ZehSymbolTable(QWidget* parent) Initialize(); } -QString ZehSymbolTable::getCellContent(int r, int c) +QString ZehSymbolTable::getCellContent(duint r, duint c) { QMutexLocker lock(&mMutex); if(!isValidIndex(r, c)) @@ -66,13 +66,13 @@ QString ZehSymbolTable::getCellContent(int r, int c) return symbolInfoString(info.get(), c); } -bool ZehSymbolTable::isValidIndex(int r, int c) +bool ZehSymbolTable::isValidIndex(duint r, duint c) { QMutexLocker lock(&mMutex); return r >= 0 && r < (int)mData.size() && c >= 0 && c <= ColUndecorated; } -void ZehSymbolTable::sortRows(int column, bool ascending) +void ZehSymbolTable::sortRows(duint column, bool ascending) { QMutexLocker lock(&mMutex); std::stable_sort(mData.begin(), mData.end(), [this, column, ascending](const SYMBOLPTR & a, const SYMBOLPTR & b) @@ -119,7 +119,7 @@ void ZehSymbolTable::sortRows(int column, bool ascending) }); } -QString ZehSymbolTable::symbolInfoString(const SYMBOLINFO* info, int c) +QString ZehSymbolTable::symbolInfoString(const SYMBOLINFO* info, duint c) { switch(c) { diff --git a/src/gui/Src/Gui/ZehSymbolTable.h b/src/gui/Src/Gui/ZehSymbolTable.h index cbddd6f2..d3d611c3 100644 --- a/src/gui/Src/Gui/ZehSymbolTable.h +++ b/src/gui/Src/Gui/ZehSymbolTable.h @@ -9,9 +9,9 @@ class ZehSymbolTable : public AbstractStdTable public: ZehSymbolTable(QWidget* parent = nullptr); - QString getCellContent(int r, int c) override; - bool isValidIndex(int r, int c) override; - void sortRows(int column, bool ascending) override; + QString getCellContent(duint r, duint c) override; + bool isValidIndex(duint r, duint c) override; + void sortRows(duint column, bool ascending) override; friend class SymbolView; friend class SearchListViewSymbols; @@ -36,5 +36,5 @@ private: ColUndecorated }; - QString symbolInfoString(const SYMBOLINFO* info, int c); + QString symbolInfoString(const SYMBOLINFO* info, duint c); }; diff --git a/src/gui/Src/Tracer/TraceBrowser.cpp b/src/gui/Src/Tracer/TraceBrowser.cpp index 56e9f840..6a89e180 100644 --- a/src/gui/Src/Tracer/TraceBrowser.cpp +++ b/src/gui/Src/Tracer/TraceBrowser.cpp @@ -1102,7 +1102,7 @@ void TraceBrowser::mouseDoubleClickEvent(QMouseEvent* event) void TraceBrowser::mouseMoveEvent(QMouseEvent* event) { - duint index = getIndexOffsetFromY(transY(event->y())) + getTableOffset(); + auto index = getIndexOffsetFromY(transY(event->y())) + getTableOffset(); if((event->buttons() & Qt::LeftButton) != 0 && getGuiState() == AbstractTableView::NoState && mTraceFile != nullptr && mTraceFile->Progress() == 100) { if(index < getRowCount()) @@ -1751,7 +1751,7 @@ void TraceBrowser::exportSlot() return; std::vector headers; headers.reserve(getColumnCount()); - for(int i = 0; i < getColumnCount(); i++) + for(duint i = 0; i < getColumnCount(); i++) headers.push_back(getColTitle(i)); ExportCSV(getRowCount(), getColumnCount(), headers, [this](dsint row, dsint col) { diff --git a/src/gui/Src/Tracer/TraceFileReader.cpp b/src/gui/Src/Tracer/TraceFileReader.cpp index bde1519c..ff92b292 100644 --- a/src/gui/Src/Tracer/TraceFileReader.cpp +++ b/src/gui/Src/Tracer/TraceFileReader.cpp @@ -18,7 +18,8 @@ TraceFileReader::TraceFileReader(QObject* parent) : QObject(parent) EXEPath.clear(); int maxModuleSize = (int)ConfigUint("Disassembler", "MaxModuleSize"); - mDisasm = new QZydis(maxModuleSize, Bridge::getArch()); + // TODO: refactor this to come from the parent TraceWidget + mDisasm = new QZydis(maxModuleSize, Bridge::getArchitecture()); connect(Config(), SIGNAL(tokenizerConfigUpdated()), this, SLOT(tokenizerUpdatedSlot())); connect(Config(), SIGNAL(colorsUpdated()), this, SLOT(tokenizerUpdatedSlot())); } diff --git a/src/gui/Src/Utils/CachedFontMetrics.h b/src/gui/Src/Utils/CachedFontMetrics.h index 6dd39730..fc38bed7 100644 --- a/src/gui/Src/Utils/CachedFontMetrics.h +++ b/src/gui/Src/Utils/CachedFontMetrics.h @@ -22,13 +22,27 @@ public: if(unicode >= 0xD800) { if(unicode >= 0xE000) + { unicode -= 0xE000 - 0xD800; + } else + { // is lonely surrogate +#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) + return mFontMetrics.horizontalAdvance(ch); +#else return mFontMetrics.width(ch); +#endif // QT_VERSION + } } if(!mWidths[unicode]) + { +#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) + return mWidths[unicode] = mFontMetrics.horizontalAdvance(ch); +#else return mWidths[unicode] = mFontMetrics.width(ch); +#endif // QT_VERSION + } return mWidths[unicode]; } @@ -39,11 +53,21 @@ public: for(const QChar & ch : text) { if(ch.isHighSurrogate()) + { temp = ch; + } else if(ch.isLowSurrogate()) + { +#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) + result += mFontMetrics.horizontalAdvance(QString(temp) + ch); +#else result += mFontMetrics.width(QString(temp) + ch); +#endif // QT_VERSION + } else + { result += width(ch); + } } return result; } diff --git a/src/gui/Src/Utils/Configuration.cpp b/src/gui/Src/Utils/Configuration.cpp index aab43963..00e4153a 100644 --- a/src/gui/Src/Utils/Configuration.cpp +++ b/src/gui/Src/Utils/Configuration.cpp @@ -25,6 +25,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) defaultColors.insert("AbstractTableViewBackgroundColor", QColor("#FFF8F0")); defaultColors.insert("AbstractTableViewTextColor", QColor("#000000")); defaultColors.insert("AbstractTableViewHeaderTextColor", QColor("#000000")); + defaultColors.insert("AbstractTableViewHeaderBackgroundColor", QColor("#C0C0C0")); defaultColors.insert("AbstractTableViewSelectionColor", QColor("#C0C0C0")); defaultColors.insert("DisassemblyCipColor", QColor("#FFFFFF")); diff --git a/src/gui/Src/Utils/RichTextPainter.cpp b/src/gui/Src/Utils/RichTextPainter.cpp index 2afc9efd..d1628518 100644 --- a/src/gui/Src/Utils/RichTextPainter.cpp +++ b/src/gui/Src/Utils/RichTextPainter.cpp @@ -5,6 +5,12 @@ //TODO: fix performance (possibly use QTextLayout?) void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const List & richText, CachedFontMetrics* fontMetrics) { +#ifdef Q_OS_DARWIN + w -= 2; +#else + w -= 1; +#endif // Q_OS_DARWIN + QPen pen; QPen highlightPen; QBrush brush(Qt::cyan); @@ -41,7 +47,7 @@ void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int painter->setPen(pen); break; } - painter->drawText(QRect(x + xinc, y, w - xinc, h), Qt::TextBypassShaping, curRichText.text); + painter->drawText(QRect(x + xinc, y, w - xinc, h), 0, curRichText.text); if(curRichText.underline && curRichText.underlineColor.alpha()) { highlightPen.setColor(curRichText.underlineColor);