Skip to content

Commit

Permalink
Fixed CustomizeMenuDialog and various features related to modules
Browse files Browse the repository at this point in the history
  • Loading branch information
torusrxxx committed Aug 27, 2023
1 parent 8ac9b8a commit 7a6c225
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 17 deletions.
2 changes: 1 addition & 1 deletion src/gui/Src/BasicView/HexDump.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class HexDump : public AbstractTableView
void appendResetDescriptor(int width, QString title, bool clickable, ColumnDescriptor descriptor);
void clearDescriptors();

void printDumpAt(dsint parVA, bool select, bool repaint = true, bool updateTableOffset = true);
virtual void printDumpAt(dsint parVA, bool select, bool repaint = true, bool updateTableOffset = true);
duint rvaToVa(dsint rva) const;

duint getTableOffsetRva() const;
Expand Down
2 changes: 2 additions & 0 deletions src/gui/Src/Gui/CustomizeMenuDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ CustomizeMenuDialog::CustomizeMenuDialog(QWidget* parent) :
viewName = tr("View");
else if(id == "TraceBrowser")
viewName = tr("Trace disassembler");
else if(id == "TraceDump")
viewName = tr("Trace dump");
else
continue;
// Add Parent Node
Expand Down
74 changes: 60 additions & 14 deletions src/gui/Src/Tracer/TraceDump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ void TraceDump::setupContextMenu()

mMenuBuilder->addMenu(makeMenu(DIcon("copy"), tr("&Copy")), wCopyMenu);

mMenuBuilder->addAction(makeShortcutAction(DIcon("eraser"), tr("&Restore selection"), SLOT(undoSelectionSlot()), "ActionUndoSelection"), [this](QMenu*)
/*mMenuBuilder->addAction(makeShortcutAction(DIcon("eraser"), tr("&Restore selection"), SLOT(undoSelectionSlot()), "ActionUndoSelection"), [this](QMenu*)
{
return DbgFunctions()->PatchInRange(rvaToVa(getSelectionStart()), rvaToVa(getSelectionEnd()));
});
});*/

mCommonActions->build(mMenuBuilder, CommonActions::ActionDisasm | CommonActions::ActionMemoryMap | CommonActions::ActionDumpData | CommonActions::ActionDumpN
| CommonActions::ActionDisasmData | CommonActions::ActionStackDump | CommonActions::ActionLabel);
Expand Down Expand Up @@ -154,7 +154,7 @@ void TraceDump::setupContextMenu()

MenuBuilder* wGotoMenu = new MenuBuilder(this);
wGotoMenu->addAction(makeShortcutAction(DIcon("geolocation-goto"), tr("&Expression"), SLOT(gotoExpressionSlot()), "ActionGotoExpression"));
wGotoMenu->addAction(makeShortcutAction(DIcon("fileoffset"), tr("File Offset"), SLOT(gotoFileOffsetSlot()), "ActionGotoFileOffset"));
//wGotoMenu->addAction(makeShortcutAction(DIcon("fileoffset"), tr("File Offset"), SLOT(gotoFileOffsetSlot()), "ActionGotoFileOffset"));
wGotoMenu->addAction(makeShortcutAction(DIcon("top"), tr("Start of Page"), SLOT(gotoStartSlot()), "ActionGotoStart"), [this](QMenu*)
{
return getSelectionStart() != 0;
Expand Down Expand Up @@ -235,6 +235,7 @@ void TraceDump::setupContextMenu()
//}));

mMenuBuilder->loadFromConfig();
disconnect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChanged(DBGSTATE)));
updateShortcuts();
}

Expand All @@ -245,6 +246,48 @@ void TraceDump::getAttention()
thread->start();
}

void TraceDump::printDumpAt(dsint parVA, bool select, bool repaint, bool updateTableOffset)
{
// Modified from Hexdump, removed memory page information
// TODO: get memory range from trace instead
duint wSize;
auto wBase = mMemoryPage->getBase();
dsint wRVA = parVA - wBase; //calculate rva
int wBytePerRowCount = getBytePerRowCount(); //get the number of bytes per row
dsint wRowCount;

// Byte offset used to be aligned on the given RVA
mByteOffset = (int)((dsint)wRVA % (dsint)wBytePerRowCount);
mByteOffset = mByteOffset > 0 ? wBytePerRowCount - mByteOffset : 0;

// Compute row count
wRowCount = wSize / wBytePerRowCount;
wRowCount += mByteOffset > 0 ? 1 : 0;

//if(mRvaDisplayEnabled && mMemPage->getBase() != mRvaDisplayPageBase)
// mRvaDisplayEnabled = false;

setRowCount(wRowCount); //set the number of rows

//mMemPage->setAttributes(wBase, wSize); // 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
}

if(select)
{
setSingleSelection(wRVA);
dsint wEndingAddress = wRVA + getSizeOf(mDescriptor.at(0).data.itemSize) - 1;
expandSelectionUpTo(wEndingAddress);
}

if(repaint)
reloadData();
}

void TraceDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & richText)
{
if(col && !mDescriptor.at(col - 1).isData && mDescriptor.at(col - 1).itemCount) //print comments
Expand All @@ -256,8 +299,9 @@ void TraceDump::getColumnRichText(int col, dsint rva, RichTextPainter::List & ri
mMemPage->read((byte_t*)&data, rva, sizeof(duint));

char modname[MAX_MODULE_SIZE] = "";
if(!DbgGetModuleAt(data, modname))
modname[0] = '\0';
//TODO
//if(!DbgGetModuleAt(data, modname))
// modname[0] = '\0';
char label_text[MAX_LABEL_SIZE] = "";
char string_text[MAX_STRING_SIZE] = "";
if(DbgGetLabelAt(data, SEG_DEFAULT, label_text))
Expand Down Expand Up @@ -294,7 +338,7 @@ QString TraceDump::paintContent(QPainter* painter, dsint rowBase, int rowOffset,
{
// Reset byte offset when base address is reached
if(rowBase == 0 && mByteOffset != 0)
printDumpAt(mMemPage->getBase(), false, false);
HexDump::printDumpAt(mMemPage->getBase(), false, false);

if(!col) //address
{
Expand Down Expand Up @@ -476,18 +520,19 @@ void TraceDump::gotoExpressionSlot()
if(!mMemoryPage->isAvailable())
return;
if(!mGoto)
mGoto = new GotoDialog(this, false, true);
mGoto = new GotoDialog(this, false, true, true);
mGoto->setWindowTitle(tr("Enter expression to follow in Dump..."));
mGoto->setInitialExpression(ToPtrString(rvaToVa(getInitialSelection())));
if(mGoto->exec() == QDialog::Accepted)
{
duint value = DbgValFromString(mGoto->expressionText.toUtf8().constData());
GuiAddLogMessage(ToPtrString(value).toUtf8());
this->printDumpAt(value, true);
this->HexDump::printDumpAt(value, true);
}
}

void TraceDump::gotoFileOffsetSlot()
// TODO: Module information need to be read from trace file
/*void TraceDump::gotoFileOffsetSlot()
{
if(!mMemoryPage->isAvailable())
return;
Expand All @@ -511,18 +556,18 @@ void TraceDump::gotoFileOffsetSlot()
duint value = DbgValFromString(mGotoOffset->expressionText.toUtf8().constData());
value = DbgFunctions()->FileOffsetToVa(modname, value);
this->printDumpAt(value, true);
}
}*/

void TraceDump::gotoStartSlot()
{
duint dest = mMemPage->getBase();
this->printDumpAt(dest, true);
this->HexDump::printDumpAt(dest, true);
}

void TraceDump::gotoEndSlot()
{
duint dest = mMemPage->getBase() + mMemPage->getSize() - (getViewableRowsCount() * getBytePerRowCount());
this->printDumpAt(dest, true);
this->HexDump::printDumpAt(dest, true);
}

void TraceDump::hexAsciiSlot()
Expand Down Expand Up @@ -1298,8 +1343,9 @@ void TraceDump::selectionUpdatedSlot()
QString selEnd = ToPtrString(rvaToVa(getSelectionEnd()));
QString info = tr("Dump");
char mod[MAX_MODULE_SIZE] = "";
if(DbgFunctions()->ModNameFromAddr(rvaToVa(getSelectionStart()), mod, true))
info = QString(mod) + "";
//TODO
//if(DbgFunctions()->ModNameFromAddr(rvaToVa(getSelectionStart()), mod, true))
// info = QString(mod) + "";
GuiAddStatusBarMessage(QString(info + ": " + selStart + " -> " + selEnd + QString().sprintf(" (0x%.8X bytes)\n", getSelectionEnd() - getSelectionStart() + 1)).toUtf8().constData());
}

Expand Down
3 changes: 2 additions & 1 deletion src/gui/Src/Tracer/TraceDump.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,15 @@ class TraceDump : public HexDump
void contextMenuEvent(QContextMenuEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void printDumpAt(dsint parVA, bool select, bool repaint, bool updateTableOffset);

signals:
void displayReferencesWidget();
void showDisassemblyTab(duint selectionStart, duint selectionEnd, duint firstAddress);

public slots:
void gotoExpressionSlot();
void gotoFileOffsetSlot();
//void gotoFileOffsetSlot();
void gotoStartSlot();
void gotoEndSlot();
//void gotoPreviousReferenceSlot();
Expand Down
2 changes: 1 addition & 1 deletion src/gui/Src/Tracer/TraceFileDump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ void TraceFileDump::findMemAreas()
}

// TraceFileDumpMemoryPage
TraceFileDumpMemoryPage::TraceFileDumpMemoryPage(QObject* parent) : MemoryPage(0, 0, parent)
TraceFileDumpMemoryPage::TraceFileDumpMemoryPage(QObject* parent) : MemoryPage(0x1000, ((duint) - 1) >> 1, parent)
{
QMutexLocker locker(&lock);
dump = nullptr;
Expand Down
1 change: 1 addition & 0 deletions src/gui/Src/Utils/Configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
insertMenuBuilderBools(&guiBool, "Help", 50); //Main Menu : Help
insertMenuBuilderBools(&guiBool, "View", 50); //Main Menu : View
insertMenuBuilderBools(&guiBool, "TraceBrowser", 50); //TraceBrowser
insertMenuBuilderBools(&guiBool, "TraceDump", 50); //Trace Dump
defaultBools.insert("Gui", guiBool);

QMap<QString, duint> guiUint;
Expand Down

0 comments on commit 7a6c225

Please sign in to comment.