Merged mrexodia/x64_dbg into master
This commit is contained in:
commit
02d3b834d3
|
@ -213,7 +213,10 @@ static bool cbCommandProvider(char* cmd, int maxlen)
|
||||||
msgwait(gMsgStack, &msg);
|
msgwait(gMsgStack, &msg);
|
||||||
char* newcmd = (char*)msg.param1;
|
char* newcmd = (char*)msg.param1;
|
||||||
if(strlen(newcmd) >= deflen)
|
if(strlen(newcmd) >= deflen)
|
||||||
newcmd[deflen - 1] = 0;
|
{
|
||||||
|
dprintf("command cut at ~%d characters\n", deflen);
|
||||||
|
newcmd[deflen - 2] = 0;
|
||||||
|
}
|
||||||
strcpy(cmd, newcmd);
|
strcpy(cmd, newcmd);
|
||||||
efree(newcmd, "cbCommandProvider:newcmd"); //free allocated command
|
efree(newcmd, "cbCommandProvider:newcmd"); //free allocated command
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -21,6 +21,8 @@ HexDump::HexDump(QWidget* parent) : AbstractTableView(parent)
|
||||||
textColor = ConfigColor("HexDumpTextColor");
|
textColor = ConfigColor("HexDumpTextColor");
|
||||||
selectionColor = ConfigColor("HexDumpSelectionColor");
|
selectionColor = ConfigColor("HexDumpSelectionColor");
|
||||||
|
|
||||||
|
mRvaDisplayEnabled = false;
|
||||||
|
|
||||||
connect(Bridge::getBridge(), SIGNAL(updateDump()), this, SLOT(reloadData()));
|
connect(Bridge::getBridge(), SIGNAL(updateDump()), this, SLOT(reloadData()));
|
||||||
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChanged(DBGSTATE)));
|
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChanged(DBGSTATE)));
|
||||||
}
|
}
|
||||||
|
@ -57,6 +59,9 @@ void HexDump::printDumpAt(int_t parVA, bool select, bool repaint)
|
||||||
wRowCount = wSize / wBytePerRowCount;
|
wRowCount = wSize / wBytePerRowCount;
|
||||||
wRowCount += mByteOffset > 0 ? 1 : 0;
|
wRowCount += mByteOffset > 0 ? 1 : 0;
|
||||||
|
|
||||||
|
if(mRvaDisplayEnabled && mMemPage->getBase() != mRvaDisplayPageBase)
|
||||||
|
mRvaDisplayEnabled = false;
|
||||||
|
|
||||||
setRowCount(wRowCount); //set the number of rows
|
setRowCount(wRowCount); //set the number of rows
|
||||||
|
|
||||||
mMemPage->setAttributes(wBase, wSize); // Set base and size (Useful when memory page changed)
|
mMemPage->setAttributes(wBase, wSize); // Set base and size (Useful when memory page changed)
|
||||||
|
|
|
@ -159,6 +159,9 @@ protected:
|
||||||
int mByteOffset;
|
int mByteOffset;
|
||||||
QList<ColumnDescriptor_t> mDescriptor;
|
QList<ColumnDescriptor_t> mDescriptor;
|
||||||
int mForceColumn;
|
int mForceColumn;
|
||||||
|
bool mRvaDisplayEnabled;
|
||||||
|
uint_t mRvaDisplayBase;
|
||||||
|
int_t mRvaDisplayPageBase;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _HEXDUMP_H
|
#endif // _HEXDUMP_H
|
||||||
|
|
|
@ -350,12 +350,40 @@ QString CPUDump::paintContent(QPainter* painter, int_t rowBase, int rowOffset, i
|
||||||
{
|
{
|
||||||
char label[MAX_LABEL_SIZE] = "";
|
char label[MAX_LABEL_SIZE] = "";
|
||||||
QString addrText = "";
|
QString addrText = "";
|
||||||
int_t curAddr = rvaToVa((rowBase + rowOffset) * getBytePerRowCount() - mByteOffset);
|
int_t cur_addr = rvaToVa((rowBase + rowOffset) * getBytePerRowCount() - mByteOffset);
|
||||||
addrText = QString("%1").arg(curAddr, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
|
if(mRvaDisplayEnabled) //RVA display
|
||||||
if(DbgGetLabelAt(curAddr, SEG_DEFAULT, label)) //has label
|
{
|
||||||
|
int_t rva = cur_addr - mRvaDisplayBase;
|
||||||
|
if(rva == 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
addrText = "$ ==> ";
|
||||||
|
#else
|
||||||
|
addrText = "$ ==> ";
|
||||||
|
#endif //_WIN64
|
||||||
|
}
|
||||||
|
else if(rva > 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
addrText = "$+" + QString("%1").arg(rva, -15, 16, QChar(' ')).toUpper();
|
||||||
|
#else
|
||||||
|
addrText = "$+" + QString("%1").arg(rva, -7, 16, QChar(' ')).toUpper();
|
||||||
|
#endif //_WIN64
|
||||||
|
}
|
||||||
|
else if(rva < 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
addrText = "$-" + QString("%1").arg(-rva, -15, 16, QChar(' ')).toUpper();
|
||||||
|
#else
|
||||||
|
addrText = "$-" + QString("%1").arg(-rva, -7, 16, QChar(' ')).toUpper();
|
||||||
|
#endif //_WIN64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addrText += QString("%1").arg(cur_addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
|
||||||
|
if(DbgGetLabelAt(cur_addr, SEG_DEFAULT, label)) //has label
|
||||||
{
|
{
|
||||||
char module[MAX_MODULE_SIZE] = "";
|
char module[MAX_MODULE_SIZE] = "";
|
||||||
if(DbgGetModuleAt(curAddr, module) && !QString(label).startsWith("JMP.&"))
|
if(DbgGetModuleAt(cur_addr, module) && !QString(label).startsWith("JMP.&"))
|
||||||
addrText += " <" + QString(module) + "." + QString(label) + ">";
|
addrText += " <" + QString(module) + "." + QString(label) + ">";
|
||||||
else
|
else
|
||||||
addrText += " <" + QString(label) + ">";
|
addrText += " <" + QString(label) + ">";
|
||||||
|
@ -451,6 +479,36 @@ void CPUDump::contextMenuEvent(QContextMenuEvent* event)
|
||||||
wMenu->exec(event->globalPos()); //execute context menu
|
wMenu->exec(event->globalPos()); //execute context menu
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CPUDump::mouseDoubleClickEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if(event->button() != Qt::LeftButton)
|
||||||
|
return;
|
||||||
|
switch(getColumnIndexFromX(event->x()))
|
||||||
|
{
|
||||||
|
case 0: //address
|
||||||
|
{
|
||||||
|
//very ugly way to calculate the base of the current row (no clue why it works)
|
||||||
|
int_t deltaRowBase = getInitialSelection() % getBytePerRowCount() + mByteOffset;
|
||||||
|
if(deltaRowBase >= getBytePerRowCount())
|
||||||
|
deltaRowBase -= getBytePerRowCount();
|
||||||
|
int_t mSelectedVa = rvaToVa(getInitialSelection() - deltaRowBase);
|
||||||
|
if(mRvaDisplayEnabled && mSelectedVa == mRvaDisplayBase)
|
||||||
|
mRvaDisplayEnabled = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mRvaDisplayEnabled = true;
|
||||||
|
mRvaDisplayBase = mSelectedVa;
|
||||||
|
mRvaDisplayPageBase = mMemPage->getBase();
|
||||||
|
}
|
||||||
|
reloadData();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CPUDump::setLabelSlot()
|
void CPUDump::setLabelSlot()
|
||||||
{
|
{
|
||||||
if(!DbgIsDebugging())
|
if(!DbgIsDebugging())
|
||||||
|
|
|
@ -20,6 +20,7 @@ public:
|
||||||
QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h);
|
QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h);
|
||||||
void setupContextMenu();
|
void setupContextMenu();
|
||||||
void contextMenuEvent(QContextMenuEvent* event);
|
void contextMenuEvent(QContextMenuEvent* event);
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent* event);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void displayReferencesWidget();
|
void displayReferencesWidget();
|
||||||
|
|
|
@ -184,12 +184,40 @@ QString CPUStack::paintContent(QPainter* painter, int_t rowBase, int rowOffset,
|
||||||
{
|
{
|
||||||
char label[MAX_LABEL_SIZE] = "";
|
char label[MAX_LABEL_SIZE] = "";
|
||||||
QString addrText = "";
|
QString addrText = "";
|
||||||
int_t curAddr = rvaToVa((rowBase + rowOffset) * getBytePerRowCount() - mByteOffset);
|
int_t cur_addr = rvaToVa((rowBase + rowOffset) * getBytePerRowCount() - mByteOffset);
|
||||||
addrText = QString("%1").arg(curAddr, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
|
if(mRvaDisplayEnabled) //RVA display
|
||||||
if(DbgGetLabelAt(curAddr, SEG_DEFAULT, label)) //has label
|
{
|
||||||
|
int_t rva = cur_addr - mRvaDisplayBase;
|
||||||
|
if(rva == 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
addrText = "$ ==> ";
|
||||||
|
#else
|
||||||
|
addrText = "$ ==> ";
|
||||||
|
#endif //_WIN64
|
||||||
|
}
|
||||||
|
else if(rva > 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
addrText = "$+" + QString("%1").arg(rva, -15, 16, QChar(' ')).toUpper();
|
||||||
|
#else
|
||||||
|
addrText = "$+" + QString("%1").arg(rva, -7, 16, QChar(' ')).toUpper();
|
||||||
|
#endif //_WIN64
|
||||||
|
}
|
||||||
|
else if(rva < 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
addrText = "$-" + QString("%1").arg(-rva, -15, 16, QChar(' ')).toUpper();
|
||||||
|
#else
|
||||||
|
addrText = "$-" + QString("%1").arg(-rva, -7, 16, QChar(' ')).toUpper();
|
||||||
|
#endif //_WIN64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addrText += QString("%1").arg(cur_addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
|
||||||
|
if(DbgGetLabelAt(cur_addr, SEG_DEFAULT, label)) //has label
|
||||||
{
|
{
|
||||||
char module[MAX_MODULE_SIZE] = "";
|
char module[MAX_MODULE_SIZE] = "";
|
||||||
if(DbgGetModuleAt(curAddr, module) && !QString(label).startsWith("JMP.&"))
|
if(DbgGetModuleAt(cur_addr, module) && !QString(label).startsWith("JMP.&"))
|
||||||
addrText += " <" + QString(module) + "." + QString(label) + ">";
|
addrText += " <" + QString(module) + "." + QString(label) + ">";
|
||||||
else
|
else
|
||||||
addrText += " <" + QString(label) + ">";
|
addrText += " <" + QString(label) + ">";
|
||||||
|
@ -300,6 +328,36 @@ void CPUStack::contextMenuEvent(QContextMenuEvent* event)
|
||||||
wMenu->exec(event->globalPos());
|
wMenu->exec(event->globalPos());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CPUStack::mouseDoubleClickEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if(event->button() != Qt::LeftButton)
|
||||||
|
return;
|
||||||
|
switch(getColumnIndexFromX(event->x()))
|
||||||
|
{
|
||||||
|
case 0: //address
|
||||||
|
{
|
||||||
|
//very ugly way to calculate the base of the current row (no clue why it works)
|
||||||
|
int_t deltaRowBase = getInitialSelection() % getBytePerRowCount() + mByteOffset;
|
||||||
|
if(deltaRowBase >= getBytePerRowCount())
|
||||||
|
deltaRowBase -= getBytePerRowCount();
|
||||||
|
int_t mSelectedVa = rvaToVa(getInitialSelection() - deltaRowBase);
|
||||||
|
if(mRvaDisplayEnabled && mSelectedVa == mRvaDisplayBase)
|
||||||
|
mRvaDisplayEnabled = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mRvaDisplayEnabled = true;
|
||||||
|
mRvaDisplayBase = mSelectedVa;
|
||||||
|
mRvaDisplayPageBase = mMemPage->getBase();
|
||||||
|
}
|
||||||
|
reloadData();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CPUStack::stackDumpAt(uint_t addr, uint_t csp)
|
void CPUStack::stackDumpAt(uint_t addr, uint_t csp)
|
||||||
{
|
{
|
||||||
mCsp = csp;
|
mCsp = csp;
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
void fontsUpdated();
|
void fontsUpdated();
|
||||||
QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h);
|
QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h);
|
||||||
void contextMenuEvent(QContextMenuEvent* event);
|
void contextMenuEvent(QContextMenuEvent* event);
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent* event);
|
||||||
void setupContextMenu();
|
void setupContextMenu();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
Loading…
Reference in New Issue