1
0
Fork 0

temporary

This commit is contained in:
torusrxxx 2023-07-17 15:45:23 +08:00
parent fc25d8ac8d
commit 37e4416dd2
13 changed files with 1896 additions and 94 deletions

View File

@ -11,7 +11,7 @@ static int dwordStringMaxLength(HexDump::DwordViewMode mode);
static int qwordStringMaxLength(HexDump::QwordViewMode mode); static int qwordStringMaxLength(HexDump::QwordViewMode mode);
static int twordStringMaxLength(HexDump::TwordViewMode mode); static int twordStringMaxLength(HexDump::TwordViewMode mode);
HexDump::HexDump(QWidget* parent) HexDump::HexDump(QWidget* parent, MemoryPage* memPage)
: AbstractTableView(parent) : AbstractTableView(parent)
{ {
memset(&mSelection, 0, sizeof(SelectionData)); memset(&mSelection, 0, sizeof(SelectionData));
@ -22,7 +22,10 @@ HexDump::HexDump(QWidget* parent)
setRowCount(0); setRowCount(0);
mMemPage = new MemoryPage(0, 0); if(!memPage)
mMemPage = new MemoryPage(0, 0, this);
else
mMemPage = memPage;
mForceColumn = -1; mForceColumn = -1;
clearDescriptors(); clearDescriptors();

View File

@ -79,7 +79,7 @@ public:
std::function<void()> columnSwitch; std::function<void()> columnSwitch;
}; };
explicit HexDump(QWidget* parent = 0); explicit HexDump(QWidget* parent = 0, MemoryPage* memPage = 0);
~HexDump() override; ~HexDump() override;
// Configuration // Configuration

View File

@ -9,15 +9,15 @@ class MemoryPage : public QObject
public: public:
explicit MemoryPage(duint parBase, duint parSize, QObject* parent = 0); explicit MemoryPage(duint parBase, duint parSize, QObject* parent = 0);
bool read(void* parDest, dsint parRVA, duint parSize) const; virtual bool read(void* parDest, dsint parRVA, duint parSize) const;
bool write(const void* parDest, dsint parRVA, duint parSize); virtual bool write(const void* parDest, dsint parRVA, duint parSize);
duint getSize() const; duint getSize() const;
duint getBase() const; duint getBase() const;
duint va(dsint rva) const; duint va(dsint rva) const;
void setAttributes(duint base, duint size); void setAttributes(duint base, duint size);
bool inRange(duint va) const; bool inRange(duint va) const;
private: protected:
duint mBase; duint mBase;
duint mSize; duint mSize;
}; };

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,128 @@
#pragma once
#include "HexDump.h"
#include "TraceFileDump.h"
//forward declaration
//class CPUMultiDump;
class TraceBrowser;
class GotoDialog;
class CommonActions;
class TraceDump : public HexDump
{
Q_OBJECT
public:
explicit TraceDump(TraceBrowser* disas, TraceFileDumpMemoryPage* memoryPage, QWidget* parent);
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);
void setupContextMenu();
void getAttention();
void contextMenuEvent(QContextMenuEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
signals:
void displayReferencesWidget();
void showDisassemblyTab(duint selectionStart, duint selectionEnd, duint firstAddress);
public slots:
void modifyValueSlot();
void gotoExpressionSlot();
void gotoFileOffsetSlot();
void gotoStartSlot();
void gotoEndSlot();
void gotoPreviousReferenceSlot();
void gotoNextReferenceSlot();
void hexAsciiSlot();
void hexUnicodeSlot();
void hexCodepageSlot();
void hexLastCodepageSlot();
void textAsciiSlot();
void textUnicodeSlot();
void textCodepageSlot();
void textLastCodepageSlot();
void integerSignedByteSlot();
void integerSignedShortSlot();
void integerSignedLongSlot();
void integerSignedLongLongSlot();
void integerUnsignedByteSlot();
void integerUnsignedShortSlot();
void integerUnsignedLongSlot();
void integerUnsignedLongLongSlot();
void integerHexShortSlot();
void integerHexLongSlot();
void integerHexLongLongSlot();
void floatFloatSlot();
void floatDoubleSlot();
void floatLongDoubleSlot();
void addressUnicodeSlot();
void addressAsciiSlot();
void disassemblySlot();
void selectionGet(SELECTIONDATA* selection);
void selectionSet(const SELECTIONDATA* selection);
void binaryEditSlot();
void binaryCopySlot();
void binarySaveToFileSlot();
void findPattern();
void copyFileOffsetSlot();
void undoSelectionSlot();
void findReferencesSlot();
void selectionUpdatedSlot();
void syncWithExpressionSlot();
void allocMemorySlot();
void headerButtonReleasedSlot(int colIndex);
private:
TraceFileDumpMemoryPage* mMemoryPage;
MenuBuilder* mMenuBuilder;
CommonActions* mCommonActions;
//QMenu* mPluginMenu;
//QMenu* mFollowInDumpMenu;
QList<QAction*> mFollowInDumpActions;
GotoDialog* mGoto = nullptr;
GotoDialog* mGotoOffset = nullptr;
TraceBrowser* mDisas;
//CPUMultiDump* mMultiDump;
int mAsciiSeparator = 0;
enum ViewEnum_t
{
ViewHexAscii = 0,
ViewHexUnicode,
ViewTextAscii,
ViewTextUnicode,
ViewIntegerSignedShort,
ViewIntegerSignedLong,
ViewIntegerSignedLongLong,
ViewIntegerUnsignedShort,
ViewIntegerUnsignedLong,
ViewIntegerUnsignedLongLong,
ViewIntegerHexShort,
ViewIntegerHexLong,
ViewIntegerHexLongLong,
ViewFloatFloat,
ViewFloatDouble,
ViewFloatLongDouble,
ViewAddress,
ViewIntegerSignedByte,
ViewIntegerUnsignedByte,
ViewAddressAscii,
ViewAddressUnicode,
ViewHexCodepage,
ViewTextCodepage
};
void setView(ViewEnum_t view);
};

View File

@ -13,7 +13,7 @@ TraceFileDump::~TraceFileDump()
void TraceFileDump::clear() void TraceFileDump::clear()
{ {
maxIndex = 0; maxIndex = 0ull;
dump.clear(); dump.clear();
} }
@ -150,3 +150,41 @@ void TraceFileDump::findMemAreas()
} }
while(true); while(true);
} }
// TraceFileDumpMemoryPage
TraceFileDumpMemoryPage::TraceFileDumpMemoryPage(QObject* parent) : MemoryPage(0, 0, parent)
{
dump = nullptr;
}
void TraceFileDumpMemoryPage::setSelectedIndex(unsigned long long index)
{
if(dump)
selectedIndex = std::min(index, dump->getMaxIndex());
else
selectedIndex = 0ull;
}
void TraceFileDumpMemoryPage::setDumpObject(TraceFileDump* dump)
{
this->dump = dump;
}
unsigned long long TraceFileDumpMemoryPage::getSelectedIndex() const
{
return selectedIndex;
}
bool TraceFileDumpMemoryPage::read(void* parDest, dsint parRVA, duint parSize) const
{
if(!dump)
return false;
auto buffer = dump->getBytes(mBase + parRVA, parSize, selectedIndex);
memcpy(parDest, buffer.data(), parSize);
return true;
}
bool TraceFileDumpMemoryPage::write(const void* parDest, dsint parRVA, duint parSize)
{
return false; // write is not supported
}

View File

@ -2,6 +2,7 @@
#include "Imports.h" #include "Imports.h"
#include <map> #include <map>
#include "MemoryPage.h"
class TraceFileDump class TraceFileDump
{ {
@ -49,3 +50,18 @@ private:
std::map<Key, DumpRecord> dump; std::map<Key, DumpRecord> dump;
unsigned long long maxIndex; unsigned long long maxIndex;
}; };
class TraceFileDumpMemoryPage : public MemoryPage
{
Q_OBJECT
public:
TraceFileDumpMemoryPage(QObject* parent = 0);
virtual bool read(void* parDest, dsint parRVA, duint parSize) const override;
virtual bool write(const void* parDest, dsint parRVA, duint parSize) override;
void setSelectedIndex(unsigned long long index);
unsigned long long getSelectedIndex() const;
void setDumpObject(TraceFileDump* dump);
private:
TraceFileDump* dump;
unsigned long long selectedIndex = 0ull;
};

View File

@ -123,6 +123,11 @@ unsigned long long TraceFileReader::Length() const
return length; return length;
} }
TraceFileDump* TraceFileReader::getDump()
{
return &dump;
}
QString TraceFileReader::getIndexText(unsigned long long index) const QString TraceFileReader::getIndexText(unsigned long long index) const
{ {
QString indexString; QString indexString;

View File

@ -43,6 +43,7 @@ public:
void buildDumpTo(unsigned long long index); void buildDumpTo(unsigned long long index);
std::vector<unsigned long long> getReferences(duint startAddr, duint endAddr) const; std::vector<unsigned long long> getReferences(duint startAddr, duint endAddr) const;
void debugdump(unsigned long long index); void debugdump(unsigned long long index);
TraceFileDump* getDump();
signals: signals:
void parseFinished(); void parseFinished();

View File

@ -2,6 +2,7 @@
#include "ui_TraceWidget.h" #include "ui_TraceWidget.h"
#include "TraceBrowser.h" #include "TraceBrowser.h"
#include "TraceInfoBox.h" #include "TraceInfoBox.h"
#include "TraceDump.h"
#include "TraceFileReader.h" #include "TraceFileReader.h"
#include "TraceRegisters.h" #include "TraceRegisters.h"
#include "StdTable.h" #include "StdTable.h"
@ -16,6 +17,8 @@ TraceWidget::TraceWidget(QWidget* parent) :
mTraceWidget = new TraceBrowser(this); mTraceWidget = new TraceBrowser(this);
mOverview = new StdTable(this); mOverview = new StdTable(this);
mInfo = new TraceInfoBox(this); mInfo = new TraceInfoBox(this);
mMemoryPage = new TraceFileDumpMemoryPage(this);
mDump = new TraceDump(mTraceWidget, mMemoryPage, this);
mGeneralRegs = new TraceRegisters(this); mGeneralRegs = new TraceRegisters(this);
//disasm //disasm
ui->mTopLeftUpperRightFrameLayout->addWidget(mTraceWidget); ui->mTopLeftUpperRightFrameLayout->addWidget(mTraceWidget);
@ -44,7 +47,12 @@ TraceWidget::TraceWidget(QWidget* parent) :
ui->mTopHSplitter->setCollapsible(1, true); // allow collapsing the RegisterView ui->mTopHSplitter->setCollapsible(1, true); // allow collapsing the RegisterView
//info //info
ui->mTopLeftLowerFrameLayout->addWidget(mInfo); //ui->mTopLeftLowerFrameLayout->addWidget(mInfo);
ui->mTopLeftUpperRightFrameLayout->addWidget(mInfo);
//dump
ui->mTopLeftLowerFrameLayout->addWidget(mDump);
int height = (mInfo->getRowHeight() + 1) * 4; int height = (mInfo->getRowHeight() + 1) * 4;
ui->mTopLeftLowerFrame->setMinimumHeight(height + 2); ui->mTopLeftLowerFrame->setMinimumHeight(height + 2);
ui->mTopHSplitter->setSizes(QList<int>({1000, 1})); ui->mTopHSplitter->setSizes(QList<int>({1000, 1}));
@ -80,10 +88,14 @@ void TraceWidget::traceSelectionChanged(unsigned long long selection)
{ {
registers = traceFile->Registers(selection); registers = traceFile->Registers(selection);
mInfo->update(selection, traceFile, registers); mInfo->update(selection, traceFile, registers);
traceFile->buildDumpTo(selection);
mMemoryPage->setDumpObject(traceFile->getDump());
} }
else else
memset(&registers, 0, sizeof(registers)); memset(&registers, 0, sizeof(registers));
} }
else
mMemoryPage->setDumpObject(nullptr);
mGeneralRegs->setRegisters(&registers); mGeneralRegs->setRegisters(&registers);
} }

View File

@ -8,7 +8,9 @@ class CPUWidget;
class TraceRegisters; class TraceRegisters;
class TraceBrowser; class TraceBrowser;
class TraceFileReader; class TraceFileReader;
class TraceFileDumpMemoryPage;
class TraceInfoBox; class TraceInfoBox;
class TraceDump;
class StdTable; class StdTable;
namespace Ui namespace Ui
@ -33,7 +35,9 @@ protected slots:
protected: protected:
TraceBrowser* mTraceWidget; TraceBrowser* mTraceWidget;
TraceInfoBox* mInfo; TraceInfoBox* mInfo;
TraceDump* mDump;
TraceRegisters* mGeneralRegs; TraceRegisters* mGeneralRegs;
TraceFileDumpMemoryPage* mMemoryPage;
StdTable* mOverview; StdTable* mOverview;
private: private:

View File

@ -14,24 +14,6 @@
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item> <item>
<widget class="QSplitter" name="mVSplitter"> <widget class="QSplitter" name="mVSplitter">
<property name="orientation"> <property name="orientation">
@ -54,12 +36,6 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<widget class="QSplitter" name="mTopLeftVSplitter"> <widget class="QSplitter" name="mTopLeftVSplitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
@ -67,7 +43,17 @@
<number>1</number> <number>1</number>
</property> </property>
<property name="childrenCollapsible"> <property name="childrenCollapsible">
<bool>true</bool> <bool>false</bool>
</property>
<widget class="QSplitter" name="mTopLeftUpperHSplitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>1</number>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
</property> </property>
<widget class="QFrame" name="mTopLeftUpperRightFrame"> <widget class="QFrame" name="mTopLeftUpperRightFrame">
<property name="frameShape"> <property name="frameShape">
@ -94,13 +80,8 @@
</property> </property>
</layout> </layout>
</widget> </widget>
</widget>
<widget class="QFrame" name="mTopLeftLowerFrame"> <widget class="QFrame" name="mTopLeftLowerFrame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
@ -123,16 +104,13 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item>
<layout class="QVBoxLayout" name="mTopLeftLowerFrameLayout_2"/>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
<widget class="QSplitter" name="mTopRightVSplitter"> <widget class="QSplitter" name="mTopRightVSplitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
@ -143,19 +121,13 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<widget class="QFrame" name="mTopRightUpperFrame"> <widget class="QFrame" name="mTopRightUpperFrame">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="frameShadow"> <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QVBoxLayout" name="mTopRightUpperFrameLayout"> <layout class="QVBoxLayout" name="mTopRightUpperFrameLayout_2">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
@ -171,22 +143,44 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item>
<layout class="QVBoxLayout" name="mTopRightUpperFrameLayout"/>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QFrame" name="mTopRightLowerFrame"> <widget class="QFrame" name="mTopRightLowerFrame">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="frameShadow"> <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QVBoxLayout" name="mTopRightLowerFrameLayout"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QVBoxLayout" name="mTopRightLowerFrameLayout"/>
</item>
</layout>
</widget>
</widget>
</widget>
<widget class="QSplitter" name="mBotHSplitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>1</number>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="QFrame" name="mBotLeftFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="mBotLeftFrameLayout">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
@ -204,6 +198,30 @@
</property> </property>
</layout> </layout>
</widget> </widget>
<widget class="QFrame" name="mBotRightFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="mBotRightFrameLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget> </widget>
</widget> </widget>
</widget> </widget>

View File

@ -80,6 +80,7 @@ SOURCES += \
Src/Gui/RichTextItemDelegate.cpp \ Src/Gui/RichTextItemDelegate.cpp \
Src/Gui/SystemBreakpointScriptDialog.cpp \ Src/Gui/SystemBreakpointScriptDialog.cpp \
Src/Imports.cpp \ Src/Imports.cpp \
Src/Tracer/TraceDump.cpp \
Src/Tracer/TraceFileDump.cpp \ Src/Tracer/TraceFileDump.cpp \
Src/Tracer/TraceInfoBox.cpp \ Src/Tracer/TraceInfoBox.cpp \
Src/Tracer/TraceRegisters.cpp \ Src/Tracer/TraceRegisters.cpp \
@ -203,6 +204,7 @@ HEADERS += \
Src/Gui/CPURegistersView.h \ Src/Gui/CPURegistersView.h \
Src/Gui/RichTextItemDelegate.h \ Src/Gui/RichTextItemDelegate.h \
Src/Gui/SystemBreakpointScriptDialog.h \ Src/Gui/SystemBreakpointScriptDialog.h \
Src/Tracer/TraceDump.h \
Src/Tracer/TraceFileDump.h \ Src/Tracer/TraceFileDump.h \
Src/Tracer/TraceInfoBox.h \ Src/Tracer/TraceInfoBox.h \
Src/Tracer/TraceRegisters.h \ Src/Tracer/TraceRegisters.h \