1
0
Fork 0
x64dbg/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp

530 lines
17 KiB
C++

#include "RegistersView.h"
#ifdef _WIN64
#include "ui_RegistersView64.h"
#else
#include "ui_RegistersView32.h"
#endif
RegistersView::RegistersView(QWidget *parent) : QWidget(parent), ui(new Ui::RegistersView)
{
int wI = 0;
ui->setupUi(this);
// Set background color
QPalette wPalette;
wPalette.setColor(QPalette::Window, QColor(255, 251, 240));
this->setAutoFillBackground(true);
this->setPalette(wPalette);
// Context Menu
this->setContextMenuPolicy(Qt::CustomContextMenu);
mSelected = -1;
mRegList = new QList<QLabel*>();
mRegNamesList = new QList<REGISTER_NAME>();
mRegList->append(ui->AXRegLabel);
mRegNamesList->append(CAX);
mRegList->append(ui->CXRegLabel);
mRegNamesList->append(CCX);
mRegList->append(ui->DXRegLabel);
mRegNamesList->append(CDX);
mRegList->append(ui->BXRegLabel);
mRegNamesList->append(CBX);
mRegList->append(ui->DIRegLabel);
mRegNamesList->append(CDI);
mRegList->append(ui->BPRegLabel);
mRegNamesList->append(CBP);
mRegList->append(ui->SIRegLabel);
mRegNamesList->append(CSI);
mRegList->append(ui->SPRegLabel);
mRegNamesList->append(CSP);
#ifdef _WIN64
mRegList->append(ui->R8RegLabel);
mRegNamesList->append(R8);
mRegList->append(ui->R9RegLabel);
mRegNamesList->append(R9);
mRegList->append(ui->R10RegLabel);
mRegNamesList->append(R10);
mRegList->append(ui->R11RegLabel);
mRegNamesList->append(R11);
mRegList->append(ui->R12RegLabel);
mRegNamesList->append(R12);
mRegList->append(ui->R13RegLabel);
mRegNamesList->append(R13);
mRegList->append(ui->R14RegLabel);
mRegNamesList->append(R14);
mRegList->append(ui->R15RegLabel);
mRegNamesList->append(R15);
#endif
mRegList->append(ui->IPRegLabel);
mRegNamesList->append(CIP);
mRegList->append(ui->FLAGSRegLabel);
mRegNamesList->append(EFLAGS);
mRegList->append(ui->CFRegLabel);
mRegNamesList->append(CF);
mRegList->append(ui->PFRegLabel);
mRegNamesList->append(PF);
mRegList->append(ui->AFRegLabel);
mRegNamesList->append(AF);
mRegList->append(ui->ZFRegLabel);
mRegNamesList->append(ZF);
mRegList->append(ui->SFRegLabel);
mRegNamesList->append(SF);
mRegList->append(ui->TFRegLabel);
mRegNamesList->append(TF);
mRegList->append(ui->IFRegLabel);
mRegNamesList->append(IF);
mRegList->append(ui->DFRegLabel);
mRegNamesList->append(DF);
mRegList->append(ui->OFRegLabel);
mRegNamesList->append(OF);
mRegList->append(ui->GSRegLabel);
mRegNamesList->append(GS);
mRegList->append(ui->FSRegLabel);
mRegNamesList->append(FS);
mRegList->append(ui->ESRegLabel);
mRegNamesList->append(ES);
mRegList->append(ui->DSRegLabel);
mRegNamesList->append(DS);
mRegList->append(ui->CSRegLabel);
mRegNamesList->append(CS);
mRegList->append(ui->SSRegLabel);
mRegNamesList->append(SS);
mRegList->append(ui->DR0RegLabel);
mRegNamesList->append(DR0);
mRegList->append(ui->DR1RegLabel);
mRegNamesList->append(DR1);
mRegList->append(ui->DR2RegLabel);
mRegNamesList->append(DR2);
mRegList->append(ui->DR3RegLabel);
mRegNamesList->append(DR3);
mRegList->append(ui->DR6RegLabel);
mRegNamesList->append(DR6);
mRegList->append(ui->DR7RegLabel);
mRegNamesList->append(DR7);
for(wI = 0; wI < mRegList->size(); wI++)
{
QLabel* curLabel=mRegList->at(wI);
QFont wFont(curLabel->font());
wFont.setFamily("Monospace");
wFont.setStyleHint(QFont::Monospace);
wFont.setFixedPitch(true);
curLabel->setAutoFillBackground(true);
curLabel->setFont(wFont);
curLabel->setFixedWidth(QFontMetrics(wFont).width(curLabel->text())+1);
}
connect(Bridge::getBridge(), SIGNAL(updateRegisters()), this, SLOT(updateRegistersSlot()));
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayCustomContextMenuSlot(QPoint)));
}
RegistersView::~RegistersView()
{
delete ui;
}
void RegistersView::mousePressEvent(QMouseEvent* event)
{
int wI = 0;
int wSelected = -1;
QPalette wPalette;
if(!DbgIsDebugging()) //disable register editing when not debugging
{
wSelected = -1;
return;
}
for(wI = 0; wI < mRegList->size(); wI++)
{
if(mRegList->at(wI)->underMouse() == true)
{
wSelected = wI;
}
}
if(wSelected != mSelected)
{
// Unselect previous register
if(mSelected != -1)
{
wPalette.setColor(QPalette::Window, QColor(192,192,192,0));
mRegList->at(mSelected)->setPalette(wPalette);
}
// Select new register
mSelected = wSelected;
if(mSelected != -1)
{
wPalette.setColor(QPalette::Window, QColor(192,192,192,255));
mRegList->at(mSelected)->setPalette(wPalette);
}
}
}
void RegistersView::mouseDoubleClickEvent(QMouseEvent* event)
{
if(mSelected==-1) //no selection
return;
if( mRegNamesList->at(mSelected) == CAX ||
mRegNamesList->at(mSelected) == CCX ||
mRegNamesList->at(mSelected) == CDX ||
mRegNamesList->at(mSelected) == CBX ||
mRegNamesList->at(mSelected) == CDI ||
mRegNamesList->at(mSelected) == CBP ||
mRegNamesList->at(mSelected) == CSI ||
mRegNamesList->at(mSelected) == CSP ||
mRegNamesList->at(mSelected) == R8 ||
mRegNamesList->at(mSelected) == R9 ||
mRegNamesList->at(mSelected) == R10 ||
mRegNamesList->at(mSelected) == R11 ||
mRegNamesList->at(mSelected) == R12 ||
mRegNamesList->at(mSelected) == R13 ||
mRegNamesList->at(mSelected) == R14 ||
mRegNamesList->at(mSelected) == R15 ||
mRegNamesList->at(mSelected) == CIP ||
mRegNamesList->at(mSelected) == EFLAGS)
{ //double clicked general register
displayEditDialog();
}
else if(mRegNamesList->at(mSelected) == CF ||
mRegNamesList->at(mSelected) == PF ||
mRegNamesList->at(mSelected) == AF ||
mRegNamesList->at(mSelected) == ZF ||
mRegNamesList->at(mSelected) == SF ||
mRegNamesList->at(mSelected) == TF ||
mRegNamesList->at(mSelected) == IF ||
mRegNamesList->at(mSelected) == DF ||
mRegNamesList->at(mSelected) == OF)
{ //double clicked a flag
setRegister(mRegNamesList->at(mSelected), mRegList->at(mSelected)->text().toInt()^1); //toggle flag (stupid way in fact)
}
}
void RegistersView::updateRegistersSlot()
{
REGDUMP wRegDumpStruct;
memset(&wRegDumpStruct, 0, sizeof(REGDUMP));
Bridge::getBridge()->getRegDumpFromDbg(&wRegDumpStruct);
ui->AXRegLabel->setText(QString("%1").arg(wRegDumpStruct.cax, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->CXRegLabel->setText(QString("%1").arg(wRegDumpStruct.ccx, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DXRegLabel->setText(QString("%1").arg(wRegDumpStruct.cdx, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->BXRegLabel->setText(QString("%1").arg(wRegDumpStruct.cbx, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DIRegLabel->setText(QString("%1").arg(wRegDumpStruct.cdi, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->BPRegLabel->setText(QString("%1").arg(wRegDumpStruct.cbp, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->SIRegLabel->setText(QString("%1").arg(wRegDumpStruct.csi, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->SPRegLabel->setText(QString("%1").arg(wRegDumpStruct.csp, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
#ifdef _WIN64
ui->R8RegLabel->setText(QString("%1").arg(wRegDumpStruct.r8, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R9RegLabel->setText(QString("%1").arg(wRegDumpStruct.r9, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R10RegLabel->setText(QString("%1").arg(wRegDumpStruct.r10, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R11RegLabel->setText(QString("%1").arg(wRegDumpStruct.r11, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R12RegLabel->setText(QString("%1").arg(wRegDumpStruct.r12, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R13RegLabel->setText(QString("%1").arg(wRegDumpStruct.r13, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R14RegLabel->setText(QString("%1").arg(wRegDumpStruct.r14, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->R15RegLabel->setText(QString("%1").arg(wRegDumpStruct.r15, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
#endif
ui->IPRegLabel->setText(QString("%1").arg(wRegDumpStruct.cip, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->FLAGSRegLabel->setText(QString("%1").arg(wRegDumpStruct.eflags, sizeof(unsigned int) * 2, 16, QChar('0')).toUpper());
ui->CFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.c, 1, 16, QChar('0')).toUpper());
ui->PFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.p, 1, 16, QChar('0')).toUpper());
ui->AFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.a, 1, 16, QChar('0')).toUpper());
ui->ZFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.z, 1, 16, QChar('0')).toUpper());
ui->SFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.s, 1, 16, QChar('0')).toUpper());
ui->TFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.t, 1, 16, QChar('0')).toUpper());
ui->IFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.i, 1, 16, QChar('0')).toUpper());
ui->DFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.d, 1, 16, QChar('0')).toUpper());
ui->OFRegLabel->setText(QString("%1").arg(wRegDumpStruct.flags.o, 1, 16, QChar('0')).toUpper());
ui->GSRegLabel->setText(QString("%1").arg(wRegDumpStruct.gs, 4, 16, QChar('0')).toUpper());
ui->FSRegLabel->setText(QString("%1").arg(wRegDumpStruct.fs, 4, 16, QChar('0')).toUpper());
ui->ESRegLabel->setText(QString("%1").arg(wRegDumpStruct.es, 4, 16, QChar('0')).toUpper());
ui->DSRegLabel->setText(QString("%1").arg(wRegDumpStruct.ds, 4, 16, QChar('0')).toUpper());
ui->CSRegLabel->setText(QString("%1").arg(wRegDumpStruct.cs, 4, 16, QChar('0')).toUpper());
ui->SSRegLabel->setText(QString("%1").arg(wRegDumpStruct.ss, 4, 16, QChar('0')).toUpper());
ui->DR0RegLabel->setText(QString("%1").arg(wRegDumpStruct.dr0, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DR1RegLabel->setText(QString("%1").arg(wRegDumpStruct.dr1, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DR2RegLabel->setText(QString("%1").arg(wRegDumpStruct.dr2, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DR3RegLabel->setText(QString("%1").arg(wRegDumpStruct.dr3, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DR6RegLabel->setText(QString("%1").arg(wRegDumpStruct.dr6, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
ui->DR7RegLabel->setText(QString("%1").arg(wRegDumpStruct.dr7, sizeof(uint_t) * 2, 16, QChar('0')).toUpper());
}
void RegistersView::displayEditDialog()
{
WordEditDialog wEditDial(this);
QString wReg = mRegList->at(mSelected)->text();
#ifdef _WIN64
wEditDial.setup(QString("Edit"), wReg.toULongLong(0, 16), 8);
#else
wEditDial.setup(QString("Edit"), wReg.toULong(0, 16), 4);
#endif
if(wEditDial.exec() == QDialog::Accepted) //OK button clicked
setRegister(mRegNamesList->at(mSelected), wEditDial.getVal());
}
void RegistersView::displayCustomContextMenuSlot(QPoint pos)
{
QMenu wMenu(this);
if(mSelected != -1)
{
if( mRegNamesList->at(mSelected) == CAX ||
mRegNamesList->at(mSelected) == CCX ||
mRegNamesList->at(mSelected) == CDX ||
mRegNamesList->at(mSelected) == CBX ||
mRegNamesList->at(mSelected) == CDI ||
mRegNamesList->at(mSelected) == CBP ||
mRegNamesList->at(mSelected) == CSI ||
mRegNamesList->at(mSelected) == CSP ||
mRegNamesList->at(mSelected) == R8 ||
mRegNamesList->at(mSelected) == R9 ||
mRegNamesList->at(mSelected) == R10 ||
mRegNamesList->at(mSelected) == R11 ||
mRegNamesList->at(mSelected) == R12 ||
mRegNamesList->at(mSelected) == R13 ||
mRegNamesList->at(mSelected) == R14 ||
mRegNamesList->at(mSelected) == R15 ||
mRegNamesList->at(mSelected) == CIP ||
mRegNamesList->at(mSelected) == EFLAGS)
{
QAction* wEdit = wMenu.addAction("Edit");
QAction* wSetTo0 = wMenu.addAction("Set to 0");
QAction* wSetTo1 = wMenu.addAction("Set to 1");
QAction* wAction = wMenu.exec(this->mapToGlobal(pos));
if(wAction == wEdit)
{
displayEditDialog();
}
else if(wAction == wSetTo0)
{
setRegister(mRegNamesList->at(mSelected), 0);
}
else if(wAction == wSetTo1)
{
setRegister(mRegNamesList->at(mSelected), 1);
}
}
else if(mRegNamesList->at(mSelected) == CF ||
mRegNamesList->at(mSelected) == PF ||
mRegNamesList->at(mSelected) == AF ||
mRegNamesList->at(mSelected) == ZF ||
mRegNamesList->at(mSelected) == SF ||
mRegNamesList->at(mSelected) == TF ||
mRegNamesList->at(mSelected) == IF ||
mRegNamesList->at(mSelected) == DF ||
mRegNamesList->at(mSelected) == OF)
{
QAction* wSetTo0 = wMenu.addAction("Set to 0");
QAction* wSetTo1 = wMenu.addAction("Set to 1");
QAction* wAction = wMenu.exec(this->mapToGlobal(pos));
if(wAction == wSetTo0)
{
setRegister(mRegNamesList->at(mSelected), 0);
}
else if(wAction == wSetTo1)
{
setRegister(mRegNamesList->at(mSelected), 1);
}
}
}
}
void RegistersView::setRegister(REGISTER_NAME reg, uint_t value)
{
QString wRegName = "";
// Basic registers
if(reg == CAX)
{
#ifdef _WIN64
wRegName = "rax";
#else
wRegName = "eax";
#endif
}
else if(reg == CCX)
{
#ifdef _WIN64
wRegName = "rcx";
#else
wRegName = "ecx";
#endif
}
else if(reg == CDX)
{
#ifdef _WIN64
wRegName = "rdx";
#else
wRegName = "edx";
#endif
}
else if(reg == CBX)
{
#ifdef _WIN64
wRegName = "rbx";
#else
wRegName = "ebx";
#endif
}
else if(reg == CDI)
{
#ifdef _WIN64
wRegName = "rdi";
#else
wRegName = "edi";
#endif
}
else if(reg == CBP)
{
#ifdef _WIN64
wRegName = "rbp";
#else
wRegName = "ebp";
#endif
}
else if(reg == CSI)
{
#ifdef _WIN64
wRegName = "rsi";
#else
wRegName = "esi";
#endif
}
else if(reg == CSP)
{
#ifdef _WIN64
wRegName = "rsp";
#else
wRegName = "esp";
#endif
}
// General purpose register
else if(reg == R8)
{
wRegName = "r8";
}
else if(reg == R9)
{
wRegName = "r9";
}
else if(reg == R10)
{
wRegName = "r10";
}
else if(reg == R11)
{
wRegName = "r11";
}
else if(reg == R12)
{
wRegName = "r12";
}
else if(reg == R13)
{
wRegName = "r13";
}
else if(reg == R14)
{
wRegName = "r14";
}
else if(reg == R15)
{
wRegName = "r15";
}
// Instruction pointer register
else if(reg == CIP)
{
#ifdef _WIN64
wRegName = "rip";
#else
wRegName = "eip";
#endif
}
// Flags
else if(reg == EFLAGS)
{
#ifdef _WIN64
wRegName = "rflags";
#else
wRegName = "eflags";
#endif
}
else if(reg == CF)
{
wRegName = "!cf";
}
else if(reg == PF)
{
wRegName = "!pf";
}
else if(reg == AF)
{
wRegName = "!af";
}
else if(reg == ZF)
{
wRegName = "!zf";
}
else if(reg == SF)
{
wRegName = "!sf";
}
else if(reg == TF)
{
wRegName = "!tf";
}
else if(reg == IF)
{
wRegName = "!if";
}
else if(reg == DF)
{
wRegName = "!df";
}
else if(reg == OF)
{
wRegName = "!of";
}
else
return;
Bridge::getBridge()->valToString(wRegName.toUtf8().constData(), value);
}