From ca637fad339e9e4540ab6608ab4de69a4bbe5b14 Mon Sep 17 00:00:00 2001 From: dad Date: Thu, 12 Oct 2023 10:37:51 -0600 Subject: [PATCH 1/2] Find Pattern searches now begin at start of current region --- src/gui/Src/Gui/CPUDisassembly.cpp | 4 +--- src/gui/Src/Gui/CPUDump.cpp | 4 +--- src/gui/Src/Gui/CPUStack.cpp | 6 +++--- src/gui/Src/Gui/MemoryMapView.cpp | 17 ++++++++++++++--- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index 43ef511d..2e32eb1d 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -1217,7 +1217,6 @@ void CPUDisassembly::findCallsSlot() void CPUDisassembly::findPatternSlot() { HexEditDialog hexEdit(this); - hexEdit.showEntireBlock(true); hexEdit.isDataCopiable(false); hexEdit.mHexEdit->setOverwriteMode(false); hexEdit.setWindowTitle(tr("Find Pattern...")); @@ -1225,12 +1224,11 @@ void CPUDisassembly::findPatternSlot() return; dsint addr = rvaToVa(getSelectionStart()); - if(hexEdit.entireBlock()) - addr = DbgMemFindBaseAddr(addr, 0); QString command; if(sender() == mFindPatternRegion) { + addr = DbgMemFindBaseAddr(addr, 0); command = QString("findall %1, %2").arg(ToHexString(addr), hexEdit.mHexEdit->pattern()); } else if(sender() == mFindPatternModule) diff --git a/src/gui/Src/Gui/CPUDump.cpp b/src/gui/Src/Gui/CPUDump.cpp index bcce3626..d68d3c38 100644 --- a/src/gui/Src/Gui/CPUDump.cpp +++ b/src/gui/Src/Gui/CPUDump.cpp @@ -1443,15 +1443,13 @@ void CPUDump::binarySaveToFileSlot() void CPUDump::findPattern() { HexEditDialog hexEdit(this); - hexEdit.showEntireBlock(true); hexEdit.isDataCopiable(false); hexEdit.mHexEdit->setOverwriteMode(false); hexEdit.setWindowTitle(tr("Find Pattern...")); if(hexEdit.exec() != QDialog::Accepted) return; dsint addr = rvaToVa(getSelectionStart()); - if(hexEdit.entireBlock()) - addr = DbgMemFindBaseAddr(addr, 0); + addr = DbgMemFindBaseAddr(addr, 0); QString addrText = ToPtrString(addr); DbgCmdExec(QString("findall " + addrText + ", " + hexEdit.mHexEdit->pattern() + ", &data&")); emit displayReferencesWidget(); diff --git a/src/gui/Src/Gui/CPUStack.cpp b/src/gui/Src/Gui/CPUStack.cpp index 37a39320..869b573d 100644 --- a/src/gui/Src/Gui/CPUStack.cpp +++ b/src/gui/Src/Gui/CPUStack.cpp @@ -865,15 +865,15 @@ void CPUStack::binaryPasteIgnoreSizeSlot() void CPUStack::findPattern() { HexEditDialog hexEdit(this); - hexEdit.showEntireBlock(true); hexEdit.isDataCopiable(false); hexEdit.mHexEdit->setOverwriteMode(false); hexEdit.setWindowTitle(tr("Find Pattern...")); if(hexEdit.exec() != QDialog::Accepted) return; + dsint addr = rvaToVa(getSelectionStart()); - if(hexEdit.entireBlock()) - addr = DbgMemFindBaseAddr(addr, 0); + addr = DbgMemFindBaseAddr(addr, 0); + QString addrText = ToPtrString(addr); DbgCmdExec(QString("findall " + addrText + ", " + hexEdit.mHexEdit->pattern() + ", &data&")); emit displayReferencesWidget(); diff --git a/src/gui/Src/Gui/MemoryMapView.cpp b/src/gui/Src/Gui/MemoryMapView.cpp index 022aa09f..b45f3b2e 100644 --- a/src/gui/Src/Gui/MemoryMapView.cpp +++ b/src/gui/Src/Gui/MemoryMapView.cpp @@ -612,12 +612,23 @@ void MemoryMapView::findPatternSlot() hexEdit.setWindowTitle(tr("Find Pattern...")); if(hexEdit.exec() != QDialog::Accepted) return; - duint addr = getSelectionAddr(); + entireBlockEnabled = hexEdit.entireBlock(); BridgeSettingSetUint("Gui", "MemoryMapEntireBlock", entireBlockEnabled); if(entireBlockEnabled) - addr = 0; - DbgCmdExec(QString("findallmem %1, %2, &data&").arg(ToPtrString(addr)).arg(hexEdit.mHexEdit->pattern())); + { + DbgCmdExec(QString("findallmem 0, %2").arg(hexEdit.mHexEdit->pattern())); + } + else + { + QList selection = getSelection(); + if(selection.isEmpty()) + return; + duint addrFirst = getCellUserdata(selection.first(), ColAddress); + duint addrLast = getCellUserdata(selection.last(), ColAddress); + duint size = getCellUserdata(selection.last(), ColSize); + DbgCmdExec(QString("findallmem %1, %2, %3").arg(ToPtrString(addrFirst)).arg(hexEdit.mHexEdit->pattern()).arg(ToHexString(addrLast - addrFirst + size))); + } emit showReferences(); } From 7dade58481d9bdf93bcc92a702ab3c9d22a41a19 Mon Sep 17 00:00:00 2001 From: dad Date: Mon, 23 Oct 2023 11:10:59 -0600 Subject: [PATCH 2/2] Add Start from Selection --- src/gui/Src/Gui/CPUDisassembly.cpp | 15 ++++++++++----- src/gui/Src/Gui/CPUDump.cpp | 6 +++++- src/gui/Src/Gui/CPUStack.cpp | 6 +++++- src/gui/Src/Gui/HexEditDialog.cpp | 12 ++++++++++++ src/gui/Src/Gui/HexEditDialog.h | 2 ++ src/gui/Src/Gui/HexEditDialog.ui | 7 +++++++ src/gui/Src/Utils/Configuration.cpp | 5 ++++- 7 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index 2e32eb1d..9c206f3e 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -1218,6 +1218,8 @@ void CPUDisassembly::findPatternSlot() { HexEditDialog hexEdit(this); hexEdit.isDataCopiable(false); + if(sender() == mFindPatternRegion) + hexEdit.showStartFromSelection(true, ConfigBool("Disassembler", "FindPatternFromSelection")); hexEdit.mHexEdit->setOverwriteMode(false); hexEdit.setWindowTitle(tr("Find Pattern...")); if(hexEdit.exec() != QDialog::Accepted) @@ -1228,7 +1230,10 @@ void CPUDisassembly::findPatternSlot() QString command; if(sender() == mFindPatternRegion) { - addr = DbgMemFindBaseAddr(addr, 0); + bool startFromSelection = hexEdit.startFromSelection(); + Config()->setBool("Disassembler", "FindPatternFromSelection", startFromSelection); + if(!startFromSelection) + addr = DbgMemFindBaseAddr(addr, 0); command = QString("findall %1, %2").arg(ToHexString(addr), hexEdit.mHexEdit->pattern()); } else if(sender() == mFindPatternModule) @@ -1773,18 +1778,18 @@ void CPUDisassembly::findCommandSlot() LineEditDialog mLineEdit(this); mLineEdit.enableCheckBox(refFindType == 0); - mLineEdit.setCheckBoxText(tr("Entire &Block")); - mLineEdit.setCheckBox(ConfigBool("Disassembler", "FindCommandEntireBlock")); + mLineEdit.setCheckBoxText(tr("Start from &Selection")); + mLineEdit.setCheckBox(ConfigBool("Disassembler", "FindCommandFromSelection")); mLineEdit.setWindowTitle("Find Command"); if(mLineEdit.exec() != QDialog::Accepted) return; - Config()->setBool("Disassembler", "FindCommandEntireBlock", mLineEdit.bChecked); + Config()->setBool("Disassembler", "FindCommandFromSelection", mLineEdit.bChecked); char error[MAX_ERROR_SIZE] = ""; unsigned char dest[16]; int asmsize = 0; duint va = rvaToVa(getInitialSelection()); - if(mLineEdit.bChecked) // entire block + if(!mLineEdit.bChecked) // start search from selection va = mMemPage->getBase(); if(!DbgFunctions()->Assemble(mMemPage->getBase() + mMemPage->getSize() / 2, dest, &asmsize, mLineEdit.editText.toUtf8().constData(), error)) diff --git a/src/gui/Src/Gui/CPUDump.cpp b/src/gui/Src/Gui/CPUDump.cpp index d68d3c38..06599ba4 100644 --- a/src/gui/Src/Gui/CPUDump.cpp +++ b/src/gui/Src/Gui/CPUDump.cpp @@ -1444,12 +1444,16 @@ void CPUDump::findPattern() { HexEditDialog hexEdit(this); hexEdit.isDataCopiable(false); + hexEdit.showStartFromSelection(true, ConfigBool("Gui", "CPUDumpStartFromSelect")); hexEdit.mHexEdit->setOverwriteMode(false); hexEdit.setWindowTitle(tr("Find Pattern...")); if(hexEdit.exec() != QDialog::Accepted) return; + bool startFromSelection = hexEdit.startFromSelection(); + Config()->setBool("Gui", "CPUDumpStartFromSelect", startFromSelection); dsint addr = rvaToVa(getSelectionStart()); - addr = DbgMemFindBaseAddr(addr, 0); + if(!startFromSelection) + addr = DbgMemFindBaseAddr(addr, 0); QString addrText = ToPtrString(addr); DbgCmdExec(QString("findall " + addrText + ", " + hexEdit.mHexEdit->pattern() + ", &data&")); emit displayReferencesWidget(); diff --git a/src/gui/Src/Gui/CPUStack.cpp b/src/gui/Src/Gui/CPUStack.cpp index 869b573d..2ad660d9 100644 --- a/src/gui/Src/Gui/CPUStack.cpp +++ b/src/gui/Src/Gui/CPUStack.cpp @@ -866,13 +866,17 @@ void CPUStack::findPattern() { HexEditDialog hexEdit(this); hexEdit.isDataCopiable(false); + hexEdit.showStartFromSelection(true, ConfigBool("Gui", "CPUStackStartFromSelect")); hexEdit.mHexEdit->setOverwriteMode(false); hexEdit.setWindowTitle(tr("Find Pattern...")); if(hexEdit.exec() != QDialog::Accepted) return; dsint addr = rvaToVa(getSelectionStart()); - addr = DbgMemFindBaseAddr(addr, 0); + bool startFromSelection = hexEdit.startFromSelection(); + Config()->setBool("Gui", "CPUStackStartFromSelect", startFromSelection); + if(!startFromSelection) + addr = DbgMemFindBaseAddr(addr, 0); QString addrText = ToPtrString(addr); DbgCmdExec(QString("findall " + addrText + ", " + hexEdit.mHexEdit->pattern() + ", &data&")); diff --git a/src/gui/Src/Gui/HexEditDialog.cpp b/src/gui/Src/Gui/HexEditDialog.cpp index 495992a8..961c1576 100644 --- a/src/gui/Src/Gui/HexEditDialog.cpp +++ b/src/gui/Src/Gui/HexEditDialog.cpp @@ -28,6 +28,7 @@ HexEditDialog::HexEditDialog(QWidget* parent) : QDialog(parent), ui(new Ui::HexE ui->chkKeepSize->setChecked(ConfigBool("HexDump", "KeepSize")); ui->chkKeepSize->hide(); ui->chkEntireBlock->hide(); + ui->chkFromSelection->hide(); mDataInitialized = false; stringEditorLock = false; @@ -112,6 +113,12 @@ void HexEditDialog::showKeepSize(bool show) ui->chkKeepSize->setVisible(show); } +void HexEditDialog::showStartFromSelection(bool show, bool checked) +{ + ui->chkFromSelection->setVisible(show); + ui->chkFromSelection->setChecked(checked); +} + void HexEditDialog::isDataCopiable(bool copyDataEnabled) { if(copyDataEnabled == false) @@ -150,6 +157,11 @@ bool HexEditDialog::entireBlock() return ui->chkEntireBlock->isChecked(); } +bool HexEditDialog::startFromSelection() +{ + return ui->chkFromSelection->isChecked(); +} + void HexEditDialog::updateStyle() { QString style = QString("QLineEdit { border-style: outset; border-width: 1px; border-color: %1; color: %1; background-color: %2 }").arg(ConfigColor("HexEditTextColor").name(), ConfigColor("HexEditBackgroundColor").name()); diff --git a/src/gui/Src/Gui/HexEditDialog.h b/src/gui/Src/Gui/HexEditDialog.h index eabfb3ab..aea1b3ea 100644 --- a/src/gui/Src/Gui/HexEditDialog.h +++ b/src/gui/Src/Gui/HexEditDialog.h @@ -18,10 +18,12 @@ public: void showEntireBlock(bool show, bool checked = false); void showKeepSize(bool show); + void showStartFromSelection(bool show, bool checked = false); void isDataCopiable(bool copyDataEnabled); void updateCodepage(); bool entireBlock(); + bool startFromSelection(); QHexEdit* mHexEdit; diff --git a/src/gui/Src/Gui/HexEditDialog.ui b/src/gui/Src/Gui/HexEditDialog.ui index 2fd9ce33..50b5325d 100644 --- a/src/gui/Src/Gui/HexEditDialog.ui +++ b/src/gui/Src/Gui/HexEditDialog.ui @@ -445,6 +445,13 @@ + + + + Start from &Selection + + + diff --git a/src/gui/Src/Utils/Configuration.cpp b/src/gui/Src/Utils/Configuration.cpp index 00e4153a..ca469ce2 100644 --- a/src/gui/Src/Utils/Configuration.cpp +++ b/src/gui/Src/Utils/Configuration.cpp @@ -254,7 +254,8 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) disassemblyBool.insert("KeepSize", false); disassemblyBool.insert("FillNOPs", false); disassemblyBool.insert("Uppercase", false); - disassemblyBool.insert("FindCommandEntireBlock", false); + disassemblyBool.insert("FindCommandFromSelection", true); + disassemblyBool.insert("FindPatternFromSelection", true); disassemblyBool.insert("OnlyCipAutoComments", false); disassemblyBool.insert("TabbedMnemonic", false); disassemblyBool.insert("LongDataInstruction", false); @@ -292,6 +293,8 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false) guiBool.insert("AutoFollowInStack", true); guiBool.insert("EnableQtHighDpiScaling", true); guiBool.insert("Topmost", false); + guiBool.insert("CPUDumpStartFromSelect", true); + guiBool.insert("CPUStackStartFromSelect", true); //Named menu settings insertMenuBuilderBools(&guiBool, "CPUDisassembly", 50); //CPUDisassembly insertMenuBuilderBools(&guiBool, "CPUDump", 50); //CPUDump