From eeef3f698a5817523fdf781ffa0fccfd2a756c75 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Wed, 22 Jul 2020 20:08:29 +0200 Subject: [PATCH] GUI: AStyle --- src/gui/Src/Gui/CPURegistersView.cpp | 2018 ++++++++++++------------- src/gui/Src/Gui/CPURegistersView.h | 198 +-- src/gui/Src/Tracer/TraceRegisters.cpp | 34 +- src/gui/Src/Tracer/TraceRegisters.h | 30 +- src/gui/Src/Tracer/TraceWidget.cpp | 590 ++++---- src/gui/Src/Tracer/TraceWidget.h | 90 +- 6 files changed, 1480 insertions(+), 1480 deletions(-) diff --git a/src/gui/Src/Gui/CPURegistersView.cpp b/src/gui/Src/Gui/CPURegistersView.cpp index fb9f991a..b5e83dba 100644 --- a/src/gui/Src/Gui/CPURegistersView.cpp +++ b/src/gui/Src/Gui/CPURegistersView.cpp @@ -1,1009 +1,1009 @@ -#include -#include "MiscUtil.h" -#include "CPUWidget.h" -#include "CPUDisassembly.h" -#include "CPUMultiDump.h" -#include "Configuration.h" -#include "WordEditDialog.h" -#include "LineEditDialog.h" -#include "EditFloatRegister.h" -#include "SelectFields.h" -#include "CPURegistersView.h" -#include "ldconvert.h" - -static QAction* setupAction(const QIcon & icon, const QString & text, RegistersView* this_object) -{ - QAction* action = new QAction(icon, text, this_object); - action->setShortcutContext(Qt::WidgetShortcut); - this_object->addAction(action); - return action; -} - -static QAction* setupAction(const QString & text, RegistersView* this_object) -{ - QAction* action = new QAction(text, this_object); - action->setShortcutContext(Qt::WidgetShortcut); - this_object->addAction(action); - return action; -} - -CPURegistersView::CPURegistersView(CPUWidget* parent) : RegistersView(parent), mParent(parent) -{ - // precreate ContextMenu Actions - wCM_Increment = setupAction(DIcon("register_inc.png"), tr("Increment"), this); - wCM_Decrement = setupAction(DIcon("register_dec.png"), tr("Decrement"), this); - wCM_Zero = setupAction(DIcon("register_zero.png"), tr("Zero"), this); - wCM_SetToOne = setupAction(DIcon("register_one.png"), tr("Set to 1"), this); - wCM_Modify = new QAction(DIcon("register_edit.png"), tr("Modify value"), this); - wCM_Modify->setShortcut(QKeySequence(Qt::Key_Enter)); - wCM_ToggleValue = setupAction(DIcon("register_toggle.png"), tr("Toggle"), this); - wCM_Undo = setupAction(DIcon("undo.png"), tr("Undo"), this); - wCM_CopyToClipboard = setupAction(DIcon("copy.png"), tr("Copy value"), this); - wCM_CopyFloatingPointValueToClipboard = setupAction(DIcon("copy.png"), tr("Copy floating point value"), this); - wCM_CopySymbolToClipboard = setupAction(DIcon("pdb.png"), tr("Copy Symbol Value"), this); - wCM_CopyAll = setupAction(DIcon("copy-alt.png"), tr("Copy all registers"), this); - wCM_FollowInDisassembly = new QAction(DIcon(QString("processor%1.png").arg(ArchValue("32", "64"))), tr("Follow in Disassembler"), this); - wCM_FollowInDump = new QAction(DIcon("dump.png"), tr("Follow in Dump"), this); - wCM_FollowInStack = new QAction(DIcon("stack.png"), tr("Follow in Stack"), this); - wCM_FollowInMemoryMap = new QAction(DIcon("memmap_find_address_page"), tr("Follow in Memory Map"), this); - wCM_Incrementx87Stack = setupAction(DIcon("arrow-small-down.png"), tr("Increment x87 Stack"), this); - wCM_Decrementx87Stack = setupAction(DIcon("arrow-small-up.png"), tr("Decrement x87 Stack"), this); - wCM_ChangeFPUView = new QAction(DIcon("change-view.png"), tr("Change view"), this); - wCM_IncrementPtrSize = setupAction(DIcon("register_inc.png"), ArchValue(tr("Increase 4"), tr("Increase 8")), this); - wCM_DecrementPtrSize = setupAction(DIcon("register_dec.png"), ArchValue(tr("Decrease 4"), tr("Decrease 8")), this); - wCM_Push = setupAction(DIcon("arrow-small-down.png"), tr("Push"), this); - wCM_Pop = setupAction(DIcon("arrow-small-up.png"), tr("Pop"), this); - wCM_Highlight = setupAction(DIcon("highlight.png"), tr("Highlight"), this); - mSwitchSIMDDispMode = new QMenu(tr("Change SIMD Register Display Mode"), this); - mSwitchSIMDDispMode->setIcon(DIcon("simdmode.png")); - mDisplaySTX = new QAction(tr("Display ST(x)"), this); - mDisplayx87rX = new QAction(tr("Display x87rX"), this); - mDisplayMMX = new QAction(tr("Display MMX"), this); - SIMDHex = new QAction(tr("Hexadecimal"), mSwitchSIMDDispMode); - SIMDFloat = new QAction(tr("Float"), mSwitchSIMDDispMode); - SIMDDouble = new QAction(tr("Double"), mSwitchSIMDDispMode); - SIMDSWord = new QAction(tr("Signed Word"), mSwitchSIMDDispMode); - SIMDSDWord = new QAction(tr("Signed Dword"), mSwitchSIMDDispMode); - SIMDSQWord = new QAction(tr("Signed Qword"), mSwitchSIMDDispMode); - SIMDUWord = new QAction(tr("Unsigned Word"), mSwitchSIMDDispMode); - SIMDUDWord = new QAction(tr("Unsigned Dword"), mSwitchSIMDDispMode); - SIMDUQWord = new QAction(tr("Unsigned Qword"), mSwitchSIMDDispMode); - SIMDHWord = new QAction(tr("Hexadecimal Word"), mSwitchSIMDDispMode); - SIMDHDWord = new QAction(tr("Hexadecimal Dword"), mSwitchSIMDDispMode); - SIMDHQWord = new QAction(tr("Hexadecimal Qword"), mSwitchSIMDDispMode); - SIMDHex->setData(QVariant(0)); - SIMDFloat->setData(QVariant(1)); - SIMDDouble->setData(QVariant(2)); - SIMDSWord->setData(QVariant(3)); - SIMDUWord->setData(QVariant(6)); - SIMDHWord->setData(QVariant(9)); - SIMDSDWord->setData(QVariant(4)); - SIMDUDWord->setData(QVariant(7)); - SIMDHDWord->setData(QVariant(10)); - SIMDSQWord->setData(QVariant(5)); - SIMDUQWord->setData(QVariant(8)); - SIMDHQWord->setData(QVariant(11)); - mDisplaySTX->setData(QVariant(0)); - mDisplayx87rX->setData(QVariant(1)); - mDisplayMMX->setData(QVariant(2)); - connect(SIMDHex, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDFloat, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDDouble, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDSWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDUWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDHWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDSDWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDUDWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDHDWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDSQWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDUQWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(SIMDHQWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); - connect(mDisplaySTX, SIGNAL(triggered()), this, SLOT(onFpuMode())); - connect(mDisplayx87rX, SIGNAL(triggered()), this, SLOT(onFpuMode())); - connect(mDisplayMMX, SIGNAL(triggered()), this, SLOT(onFpuMode())); - SIMDHex->setCheckable(true); - SIMDFloat->setCheckable(true); - SIMDDouble->setCheckable(true); - SIMDSWord->setCheckable(true); - SIMDUWord->setCheckable(true); - SIMDHWord->setCheckable(true); - SIMDSDWord->setCheckable(true); - SIMDUDWord->setCheckable(true); - SIMDHDWord->setCheckable(true); - SIMDSQWord->setCheckable(true); - SIMDUQWord->setCheckable(true); - SIMDHQWord->setCheckable(true); - SIMDHex->setChecked(true); - SIMDFloat->setChecked(false); - SIMDDouble->setChecked(false); - SIMDSWord->setChecked(false); - SIMDUWord->setChecked(false); - SIMDHWord->setChecked(false); - SIMDSDWord->setChecked(false); - SIMDUDWord->setChecked(false); - SIMDHDWord->setChecked(false); - SIMDSQWord->setChecked(false); - SIMDUQWord->setChecked(false); - SIMDHQWord->setChecked(false); - mSwitchSIMDDispMode->addAction(SIMDHex); - mSwitchSIMDDispMode->addAction(SIMDFloat); - mSwitchSIMDDispMode->addAction(SIMDDouble); - mSwitchSIMDDispMode->addAction(SIMDSWord); - mSwitchSIMDDispMode->addAction(SIMDSDWord); - mSwitchSIMDDispMode->addAction(SIMDSQWord); - mSwitchSIMDDispMode->addAction(SIMDUWord); - mSwitchSIMDDispMode->addAction(SIMDUDWord); - mSwitchSIMDDispMode->addAction(SIMDUQWord); - mSwitchSIMDDispMode->addAction(SIMDHWord); - mSwitchSIMDDispMode->addAction(SIMDHDWord); - mSwitchSIMDDispMode->addAction(SIMDHQWord); - // Context Menu - this->setContextMenuPolicy(Qt::CustomContextMenu); - // foreign messages - connect(Bridge::getBridge(), SIGNAL(updateRegisters()), this, SLOT(updateRegistersSlot())); - connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayCustomContextMenuSlot(QPoint))); - connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); - connect(parent->getDisasmWidget(), SIGNAL(selectionChanged(dsint)), this, SLOT(disasmSelectionChangedSlot(dsint))); - // context menu actions - connect(wCM_Increment, SIGNAL(triggered()), this, SLOT(onIncrementAction())); - connect(wCM_ChangeFPUView, SIGNAL(triggered()), this, SLOT(onChangeFPUViewAction())); - connect(wCM_Decrement, SIGNAL(triggered()), this, SLOT(onDecrementAction())); - connect(wCM_Incrementx87Stack, SIGNAL(triggered()), this, SLOT(onIncrementx87StackAction())); - connect(wCM_Decrementx87Stack, SIGNAL(triggered()), this, SLOT(onDecrementx87StackAction())); - connect(wCM_Zero, SIGNAL(triggered()), this, SLOT(onZeroAction())); - connect(wCM_SetToOne, SIGNAL(triggered()), this, SLOT(onSetToOneAction())); - connect(wCM_Modify, SIGNAL(triggered()), this, SLOT(onModifyAction())); - connect(wCM_ToggleValue, SIGNAL(triggered()), this, SLOT(onToggleValueAction())); - connect(wCM_Undo, SIGNAL(triggered()), this, SLOT(onUndoAction())); - connect(wCM_CopyToClipboard, SIGNAL(triggered()), this, SLOT(onCopyToClipboardAction())); - connect(wCM_CopyFloatingPointValueToClipboard, SIGNAL(triggered()), this, SLOT(onCopyFloatingPointToClipboardAction())); - connect(wCM_CopySymbolToClipboard, SIGNAL(triggered()), this, SLOT(onCopySymbolToClipboardAction())); - connect(wCM_CopyAll, SIGNAL(triggered()), this, SLOT(onCopyAllAction())); - connect(wCM_FollowInDisassembly, SIGNAL(triggered()), this, SLOT(onFollowInDisassembly())); - connect(wCM_FollowInDump, SIGNAL(triggered()), this, SLOT(onFollowInDump())); - connect(wCM_FollowInStack, SIGNAL(triggered()), this, SLOT(onFollowInStack())); - connect(wCM_FollowInMemoryMap, SIGNAL(triggered()), this, SLOT(onFollowInMemoryMap())); - connect(wCM_IncrementPtrSize, SIGNAL(triggered()), this, SLOT(onIncrementPtrSize())); - connect(wCM_DecrementPtrSize, SIGNAL(triggered()), this, SLOT(onDecrementPtrSize())); - connect(wCM_Push, SIGNAL(triggered()), this, SLOT(onPushAction())); - connect(wCM_Pop, SIGNAL(triggered()), this, SLOT(onPopAction())); - connect(wCM_Highlight, SIGNAL(triggered()), this, SLOT(onHighlightSlot())); - - refreshShortcutsSlot(); - connect(Config(), SIGNAL(shortcutsUpdated()), this, SLOT(refreshShortcutsSlot())); -} - -void CPURegistersView::refreshShortcutsSlot() -{ - wCM_Increment->setShortcut(ConfigShortcut("ActionIncreaseRegister")); - wCM_Decrement->setShortcut(ConfigShortcut("ActionDecreaseRegister")); - wCM_Zero->setShortcut(ConfigShortcut("ActionZeroRegister")); - wCM_SetToOne->setShortcut(ConfigShortcut("ActionSetOneRegister")); - wCM_ToggleValue->setShortcut(ConfigShortcut("ActionToggleRegisterValue")); - wCM_CopyToClipboard->setShortcut(ConfigShortcut("ActionCopy")); - wCM_CopySymbolToClipboard->setShortcut(ConfigShortcut("ActionCopySymbol")); - wCM_CopyAll->setShortcut(ConfigShortcut("ActionCopyAllRegisters")); - wCM_Highlight->setShortcut(ConfigShortcut("ActionHighlightingMode")); - wCM_IncrementPtrSize->setShortcut(ConfigShortcut("ActionIncreaseRegisterPtrSize")); - wCM_DecrementPtrSize->setShortcut(ConfigShortcut("ActionDecreaseRegisterPtrSize")); - wCM_Incrementx87Stack->setShortcut(ConfigShortcut("ActionIncrementx87Stack")); - wCM_Decrementx87Stack->setShortcut(ConfigShortcut("ActionDecrementx87Stack")); - wCM_Push->setShortcut(ConfigShortcut("ActionPush")); - wCM_Pop->setShortcut(ConfigShortcut("ActionPop")); -} - -void CPURegistersView::mousePressEvent(QMouseEvent* event) -{ - if(!isActive) - return; - - if(event->y() < yTopSpacing - mButtonHeight) - { - onChangeFPUViewAction(); - } - else - { - // get mouse position - const int y = (event->y() - yTopSpacing) / (double)mRowHeight; - const int x = event->x() / (double)mCharWidth; - - REGISTER_NAME r; - // do we find a corresponding register? - if(identifyRegister(y, x, &r)) - { - Disassembly* CPUDisassemblyView = mParent->getDisasmWidget(); - if(CPUDisassemblyView->isHighlightMode()) - { - if(mGPR.contains(r) && r != REGISTER_NAME::EFLAGS) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::GeneralRegister, mRegisterMapping.constFind(r).value())); - else if(mFPUMMX.contains(r)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MmxRegister, mRegisterMapping.constFind(r).value())); - else if(mFPUXMM.contains(r)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::XmmRegister, mRegisterMapping.constFind(r).value())); - else if(mFPUYMM.contains(r)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::YmmRegister, mRegisterMapping.constFind(r).value())); - else if(mSEGMENTREGISTER.contains(r)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MemorySegment, mRegisterMapping.constFind(r).value())); - else - mSelected = r; - } - else - mSelected = r; - emit refresh(); - } - else - mSelected = UNKNOWN; - } -} - -void CPURegistersView::mouseDoubleClickEvent(QMouseEvent* event) -{ - if(!isActive || event->button() != Qt::LeftButton) - return; - // get mouse position - const int y = (event->y() - yTopSpacing) / (double)mRowHeight; - const int x = event->x() / (double)mCharWidth; - - // do we find a corresponding register? - if(!identifyRegister(y, x, 0)) - return; - if(mSelected == CIP) //double clicked on CIP register - DbgCmdExec("disasm cip"); - // is current register general purposes register or FPU register? - else if(mMODIFYDISPLAY.contains(mSelected)) - wCM_Modify->trigger(); - else if(mBOOLDISPLAY.contains(mSelected)) // is flag ? - wCM_ToggleValue->trigger(); - else if(mCANSTOREADDRESS.contains(mSelected)) - wCM_FollowInDisassembly->trigger(); -} - -void CPURegistersView::keyPressEvent(QKeyEvent* event) -{ - if(isActive) - { - int key = event->key(); - REGISTER_NAME newRegister = UNKNOWN; - - switch(key) - { - case Qt::Key_Enter: - case Qt::Key_Return: - wCM_Modify->trigger(); - break; - case Qt::Key_Left: - newRegister = mRegisterRelativePlaces[mSelected].left; - break; - case Qt::Key_Right: - newRegister = mRegisterRelativePlaces[mSelected].right; - break; - case Qt::Key_Up: - newRegister = mRegisterRelativePlaces[mSelected].up; - break; - case Qt::Key_Down: - newRegister = mRegisterRelativePlaces[mSelected].down; - break; - } - - if(newRegister != UNKNOWN) - { - mSelected = newRegister; - ensureRegisterVisible(newRegister); - emit refresh(); - } - } - RegistersView::keyPressEvent(event); -} - -void CPURegistersView::debugStateChangedSlot(DBGSTATE state) -{ - if(state == stopped) - { - updateRegistersSlot(); - isActive = false; - } - else - { - isActive = true; - } -} - -void CPURegistersView::updateRegistersSlot() -{ - // read registers - REGDUMP z; - DbgGetRegDumpEx(&z, sizeof(REGDUMP)); - // update gui - setRegisters(&z); -} - -void CPURegistersView::ModifyFields(const QString & title, STRING_VALUE_TABLE_t* table, SIZE_T size) -{ - SelectFields mSelectFields(this); - QListWidget* mQListWidget = mSelectFields.GetList(); - - QStringList items; - unsigned int i; - - for(i = 0; i < size; i++) - items << QApplication::translate("RegistersView_ConstantsOfRegisters", table[i].string) + QString(" (%1)").arg(table[i].value, 0, 16); - - mQListWidget->addItems(items); - - mSelectFields.setWindowTitle(title); - if(mSelectFields.exec() != QDialog::Accepted) - return; - - if(mQListWidget->selectedItems().count() != 1) - return; - - //QListWidgetItem* item = mQListWidget->takeItem(mQListWidget->currentRow()); - QString itemText = mQListWidget->item(mQListWidget->currentRow())->text(); - - duint value; - - for(i = 0; i < size; i++) - { - if(QApplication::translate("RegistersView_ConstantsOfRegisters", table[i].string) + QString(" (%1)").arg(table[i].value, 0, 16) == itemText) - break; - } - - value = table[i].value; - - setRegister(mSelected, (duint)value); - //delete item; -} - -extern STRING_VALUE_TABLE_t MxCsrRCValueStringTable[4]; -extern STRING_VALUE_TABLE_t ControlWordRCValueStringTable[4]; -extern STRING_VALUE_TABLE_t StatusWordTOPValueStringTable[8]; -extern STRING_VALUE_TABLE_t ControlWordPCValueStringTable[4]; -extern STRING_VALUE_TABLE_t TagWordValueStringTable[4]; - -#define MODIFY_FIELDS_DISPLAY(prefix, title, table) ModifyFields(prefix + QChar(' ') + QString(title), (STRING_VALUE_TABLE_t *) & table, SIZE_TABLE(table) ) - -/** - * @brief This function displays the appropriate edit dialog according to selected register - * @return Nothing. - */ - -void CPURegistersView::displayEditDialog() -{ - if(mFPU.contains(mSelected)) - { - if(mTAGWORD.contains(mSelected)) - MODIFY_FIELDS_DISPLAY(tr("Edit"), "Tag " + mRegisterMapping.constFind(mSelected).value(), TagWordValueStringTable); - else if(mSelected == MxCsr_RC) - MODIFY_FIELDS_DISPLAY(tr("Edit"), "MxCsr_RC", MxCsrRCValueStringTable); - else if(mSelected == x87CW_RC) - MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87CW_RC", ControlWordRCValueStringTable); - else if(mSelected == x87CW_PC) - MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87CW_PC", ControlWordPCValueStringTable); - else if(mSelected == x87SW_TOP) - { - MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87SW_TOP", StatusWordTOPValueStringTable); - // if(mFpuMode == false) - updateRegistersSlot(); - } - else if(mFPUYMM.contains(mSelected)) - { - EditFloatRegister mEditFloat(256, this); - mEditFloat.setWindowTitle(tr("Edit YMM register")); - mEditFloat.loadData(registerValue(&wRegDumpStruct, mSelected)); - mEditFloat.show(); - mEditFloat.selectAllText(); - if(mEditFloat.exec() == QDialog::Accepted) - setRegister(mSelected, (duint)mEditFloat.getData()); - } - else if(mFPUXMM.contains(mSelected)) - { - EditFloatRegister mEditFloat(128, this); - mEditFloat.setWindowTitle(tr("Edit XMM register")); - mEditFloat.loadData(registerValue(&wRegDumpStruct, mSelected)); - mEditFloat.show(); - mEditFloat.selectAllText(); - if(mEditFloat.exec() == QDialog::Accepted) - setRegister(mSelected, (duint)mEditFloat.getData()); - } - else if(mFPUMMX.contains(mSelected)) - { - EditFloatRegister mEditFloat(64, this); - mEditFloat.setWindowTitle(tr("Edit MMX register")); - mEditFloat.loadData(registerValue(&wRegDumpStruct, mSelected)); - mEditFloat.show(); - mEditFloat.selectAllText(); - if(mEditFloat.exec() == QDialog::Accepted) - setRegister(mSelected, (duint)mEditFloat.getData()); - } - else - { - bool errorinput = false; - LineEditDialog mLineEdit(this); - - mLineEdit.setText(GetRegStringValueFromValue(mSelected, registerValue(&wRegDumpStruct, mSelected))); - mLineEdit.setWindowTitle(tr("Edit FPU register")); - mLineEdit.setWindowIcon(DIcon("log.png")); - mLineEdit.setCursorPosition(0); - auto sizeRegister = int(GetSizeRegister(mSelected)); - if(sizeRegister == 10) - mLineEdit.setFpuMode(); - mLineEdit.ForceSize(sizeRegister * 2); - do - { - errorinput = false; - mLineEdit.show(); - mLineEdit.selectAllText(); - if(mLineEdit.exec() != QDialog::Accepted) - return; //pressed cancel - else - { - bool ok = false; - duint fpuvalue; - - if(mUSHORTDISPLAY.contains(mSelected)) - fpuvalue = (duint) mLineEdit.editText.toUShort(&ok, 16); - else if(mDWORDDISPLAY.contains(mSelected)) - fpuvalue = mLineEdit.editText.toUInt(&ok, 16); - else if(mFPUx87_80BITSDISPLAY.contains(mSelected)) - { - QString editTextLower = mLineEdit.editText.toLower(); - if(sizeRegister == 10 && (mLineEdit.editText.contains(QChar('.')) || editTextLower == "nan" || editTextLower == "inf" - || editTextLower == "+inf" || editTextLower == "-inf")) - { - char number[10]; - str2ld(mLineEdit.editText.toUtf8().constData(), number); - setRegister(mSelected, reinterpret_cast(number)); - return; - } - else - { - QByteArray pArray = mLineEdit.editText.toLocal8Bit(); - - if(pArray.size() == sizeRegister * 2) - { - char* pData = (char*) calloc(1, sizeof(char) * sizeRegister); - - if(pData != NULL) - { - ok = true; - char actual_char[3]; - for(int i = 0; i < sizeRegister; i++) - { - memset(actual_char, 0, sizeof(actual_char)); - memcpy(actual_char, (char*) pArray.data() + (i * 2), 2); - if(! isxdigit(actual_char[0]) || ! isxdigit(actual_char[1])) - { - ok = false; - break; - } - pData[i] = (char)strtol(actual_char, NULL, 16); - } - - if(ok) - { - if(!ConfigBool("Gui", "FpuRegistersLittleEndian")) // reverse byte order if it is big-endian - { - pArray = ByteReverse(QByteArray(pData, sizeRegister)); - setRegister(mSelected, reinterpret_cast(pArray.constData())); - } - else - setRegister(mSelected, reinterpret_cast(pData)); - } - - free(pData); - - if(ok) - return; - } - } - } - } - if(!ok) - { - errorinput = true; - - SimpleWarningBox(this, tr("ERROR CONVERTING TO HEX"), tr("ERROR CONVERTING TO HEX")); - } - else - setRegister(mSelected, fpuvalue); - } - } - while(errorinput); - } - } - else if(mSelected == LastError) - { - bool errorinput = false; - LineEditDialog mLineEdit(this); - LASTERROR* error = (LASTERROR*)registerValue(&wRegDumpStruct, LastError); - mLineEdit.setText(QString::number(error->code, 16)); - mLineEdit.setWindowTitle(tr("Set Last Error")); - mLineEdit.setCursorPosition(0); - do - { - errorinput = true; - mLineEdit.show(); - mLineEdit.selectAllText(); - if(mLineEdit.exec() != QDialog::Accepted) - return; - if(DbgIsValidExpression(mLineEdit.editText.toUtf8().constData())) - errorinput = false; - } - while(errorinput); - setRegister(LastError, DbgValFromString(mLineEdit.editText.toUtf8().constData())); - } - else if(mSelected == LastStatus) - { - bool statusinput = false; - LineEditDialog mLineEdit(this); - LASTSTATUS* status = (LASTSTATUS*)registerValue(&wRegDumpStruct, LastStatus); - mLineEdit.setText(QString::number(status->code, 16)); - mLineEdit.setWindowTitle(tr("Set Last Status")); - mLineEdit.setCursorPosition(0); - do - { - statusinput = true; - mLineEdit.show(); - mLineEdit.selectAllText(); - if(mLineEdit.exec() != QDialog::Accepted) - return; - if(DbgIsValidExpression(mLineEdit.editText.toUtf8().constData())) - statusinput = false; - } - while(statusinput); - setRegister(LastStatus, DbgValFromString(mLineEdit.editText.toUtf8().constData())); - } - else - { - WordEditDialog wEditDial(this); - wEditDial.setup(tr("Edit"), (* ((duint*) registerValue(&wRegDumpStruct, mSelected))), sizeof(dsint)); - if(wEditDial.exec() == QDialog::Accepted) //OK button clicked - setRegister(mSelected, wEditDial.getVal()); - } -} - -void CPURegistersView::CreateDumpNMenu(QMenu* dumpMenu) -{ - QList names; - CPUMultiDump* multiDump = mParent->getDumpWidget(); - dumpMenu->setIcon(DIcon("dump.png")); - int maxDumps = multiDump->getMaxCPUTabs(); - multiDump->getTabNames(names); - for(int i = 0; i < maxDumps; i++) - { - QAction* action = new QAction(names.at(i), this); - connect(action, SIGNAL(triggered()), this, SLOT(onFollowInDumpN())); - dumpMenu->addAction(action); - action->setData(i + 1); - } -} - -void CPURegistersView::onIncrementx87StackAction() -{ - if(mFPUx87_80BITSDISPLAY.contains(mSelected)) - setRegister(x87SW_TOP, ((* ((duint*) registerValue(&wRegDumpStruct, x87SW_TOP))) + 1) % 8); -} - -void CPURegistersView::onDecrementx87StackAction() -{ - if(mFPUx87_80BITSDISPLAY.contains(mSelected)) - setRegister(x87SW_TOP, ((* ((duint*) registerValue(&wRegDumpStruct, x87SW_TOP))) - 1) % 8); -} - -void CPURegistersView::onIncrementAction() -{ - if(mINCREMENTDECREMET.contains(mSelected)) - setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) + 1); -} - -void CPURegistersView::onDecrementAction() -{ - if(mINCREMENTDECREMET.contains(mSelected)) - setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) - 1); -} - -void CPURegistersView::onIncrementPtrSize() -{ - if(mINCREMENTDECREMET.contains(mSelected)) - setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) + sizeof(void*)); -} - -void CPURegistersView::onDecrementPtrSize() -{ - if(mINCREMENTDECREMET.contains(mSelected)) - setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) - sizeof(void*)); -} - -void CPURegistersView::onPushAction() -{ - duint csp = (* ((duint*) registerValue(&wRegDumpStruct, CSP))) - sizeof(void*); - duint regVal = 0; - regVal = * ((duint*) registerValue(&wRegDumpStruct, mSelected)); - setRegister(CSP, csp); - DbgMemWrite(csp, (const unsigned char*)®Val, sizeof(void*)); -} - -void CPURegistersView::onPopAction() -{ - duint csp = (* ((duint*) registerValue(&wRegDumpStruct, CSP))); - duint newVal; - DbgMemRead(csp, (unsigned char*)&newVal, sizeof(void*)); - setRegister(CSP, csp + sizeof(void*)); - setRegister(mSelected, newVal); -} - -void CPURegistersView::onZeroAction() -{ - if(mSETONEZEROTOGGLE.contains(mSelected)) - { - if(mSelected >= x87r0 && mSelected <= x87r7 || mSelected >= x87st0 && mSelected <= x87st7) - setRegister(mSelected, reinterpret_cast("\0\0\0\0\0\0\0\0\0")); //9 zeros and 1 terminating zero - else - setRegister(mSelected, 0); - } -} - -void CPURegistersView::onSetToOneAction() -{ - if(mSETONEZEROTOGGLE.contains(mSelected)) - { - if(mSelected >= x87r0 && mSelected <= x87r7 || mSelected >= x87st0 && mSelected <= x87st7) - setRegister(mSelected, reinterpret_cast("\0\0\0\0\0\0\0\x80\xFF\x3F")); - else - setRegister(mSelected, 1); - } -} - -void CPURegistersView::onModifyAction() -{ - if(mMODIFYDISPLAY.contains(mSelected)) - displayEditDialog(); -} - -void CPURegistersView::onToggleValueAction() -{ - if(mBOOLDISPLAY.contains(mSelected)) - { - int value = (int)(* (bool*) registerValue(&wRegDumpStruct, mSelected)); - setRegister(mSelected, value ^ 1); - } -} - -void CPURegistersView::onUndoAction() -{ - if(mUNDODISPLAY.contains(mSelected)) - { - if(mFPUMMX.contains(mSelected) || mFPUXMM.contains(mSelected) || mFPUYMM.contains(mSelected) || mFPUx87_80BITSDISPLAY.contains(mSelected)) - setRegister(mSelected, (duint)registerValue(&wCipRegDumpStruct, mSelected)); - else - setRegister(mSelected, *(duint*)registerValue(&wCipRegDumpStruct, mSelected)); - } -} - -void CPURegistersView::onCopyToClipboardAction() -{ - Bridge::CopyToClipboard(GetRegStringValueFromValue(mSelected, registerValue(&wRegDumpStruct, mSelected))); -} - -void CPURegistersView::onCopyFloatingPointToClipboardAction() -{ - Bridge::CopyToClipboard(ToLongDoubleString(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, mSelected))->data)); -} - -void CPURegistersView::onCopySymbolToClipboardAction() -{ - if(mLABELDISPLAY.contains(mSelected)) - { - QString symbol = getRegisterLabel(mSelected); - if(symbol != "") - Bridge::CopyToClipboard(symbol); - } -} - -void CPURegistersView::onHighlightSlot() -{ - Disassembly* CPUDisassemblyView = mParent->getDisasmWidget(); - if(mGPR.contains(mSelected) && mSelected != REGISTER_NAME::EFLAGS) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::GeneralRegister, mRegisterMapping.constFind(mSelected).value())); - else if(mSEGMENTREGISTER.contains(mSelected)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MemorySegment, mRegisterMapping.constFind(mSelected).value())); - else if(mFPUMMX.contains(mSelected)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MmxRegister, mRegisterMapping.constFind(mSelected).value())); - else if(mFPUXMM.contains(mSelected)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::XmmRegister, mRegisterMapping.constFind(mSelected).value())); - else if(mFPUYMM.contains(mSelected)) - CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::YmmRegister, mRegisterMapping.constFind(mSelected).value())); - CPUDisassemblyView->reloadData(); -} - -void CPURegistersView::onFollowInDisassembly() -{ - if(mCANSTOREADDRESS.contains(mSelected)) - { - QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); - if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) - DbgCmdExec(QString().sprintf("disasm \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); - } -} - -void CPURegistersView::onFollowInDump() -{ - if(mCANSTOREADDRESS.contains(mSelected)) - { - QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); - if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) - DbgCmdExec(QString().sprintf("dump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); - } -} - -void CPURegistersView::onFollowInDumpN() -{ - if(mCANSTOREADDRESS.contains(mSelected)) - { - QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); - if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) - { - QAction* action = qobject_cast(sender()); - int numDump = action->data().toInt(); - DbgCmdExec(QString("dump %1, .%2").arg(addr).arg(numDump).toUtf8().constData()); - } - } -} - -void CPURegistersView::onFollowInStack() -{ - if(mCANSTOREADDRESS.contains(mSelected)) - { - QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); - if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) - DbgCmdExec(QString().sprintf("sdump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); - } -} - -void CPURegistersView::onFollowInMemoryMap() -{ - if(mCANSTOREADDRESS.contains(mSelected)) - { - QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); - if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) - DbgCmdExec(QString().sprintf("memmapdump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); - } -} - -void CPURegistersView::displayCustomContextMenuSlot(QPoint pos) -{ - if(!isActive) - return; - QMenu wMenu(this); - QMenu* followInDumpNMenu = nullptr; - const QAction* selectedAction = nullptr; - switch(ConfigUint("Gui", "SIMDRegistersDisplayMode")) - { - case 0: - selectedAction = SIMDHex; - break; - case 1: - selectedAction = SIMDFloat; - break; - case 2: - selectedAction = SIMDDouble; - break; - case 3: - selectedAction = SIMDSWord; - break; - case 6: - selectedAction = SIMDUWord; - break; - case 9: - selectedAction = SIMDHWord; - break; - case 4: - selectedAction = SIMDSDWord; - break; - case 7: - selectedAction = SIMDUDWord; - break; - case 10: - selectedAction = SIMDHDWord; - break; - case 5: - selectedAction = SIMDSQWord; - break; - case 8: - selectedAction = SIMDUQWord; - break; - case 11: - selectedAction = SIMDHQWord; - break; - } - SIMDHex->setChecked(SIMDHex == selectedAction); - SIMDFloat->setChecked(SIMDFloat == selectedAction); - SIMDDouble->setChecked(SIMDDouble == selectedAction); - SIMDSWord->setChecked(SIMDSWord == selectedAction); - SIMDUWord->setChecked(SIMDUWord == selectedAction); - SIMDHWord->setChecked(SIMDHWord == selectedAction); - SIMDSDWord->setChecked(SIMDSDWord == selectedAction); - SIMDUDWord->setChecked(SIMDUDWord == selectedAction); - SIMDHDWord->setChecked(SIMDHDWord == selectedAction); - SIMDSQWord->setChecked(SIMDSQWord == selectedAction); - SIMDUQWord->setChecked(SIMDUQWord == selectedAction); - SIMDHQWord->setChecked(SIMDHQWord == selectedAction); - - if(mSelected != UNKNOWN) - { - if(mMODIFYDISPLAY.contains(mSelected)) - { - wMenu.addAction(wCM_Modify); - } - - if(mCANSTOREADDRESS.contains(mSelected)) - { - duint addr = (* ((duint*) registerValue(&wRegDumpStruct, mSelected))); - if(DbgMemIsValidReadPtr(addr)) - { - wMenu.addAction(wCM_FollowInDump); - followInDumpNMenu = new QMenu(tr("Follow in &Dump"), &wMenu); - CreateDumpNMenu(followInDumpNMenu); - wMenu.addMenu(followInDumpNMenu); - wMenu.addAction(wCM_FollowInDisassembly); - wMenu.addAction(wCM_FollowInMemoryMap); - duint size = 0; - duint base = DbgMemFindBaseAddr(DbgValFromString("csp"), &size); - if(addr >= base && addr < base + size) - wMenu.addAction(wCM_FollowInStack); - } - } - - wMenu.addAction(wCM_CopyToClipboard); - if(mFPUx87_80BITSDISPLAY.contains(mSelected)) - { - wMenu.addAction(wCM_CopyFloatingPointValueToClipboard); - } - wMenu.addAction(wCM_CopyAll); - if(mLABELDISPLAY.contains(mSelected)) - { - QString symbol = getRegisterLabel(mSelected); - if(symbol != "") - wMenu.addAction(wCM_CopySymbolToClipboard); - } - - if((mGPR.contains(mSelected) && mSelected != REGISTER_NAME::EFLAGS) || mSEGMENTREGISTER.contains(mSelected) || mFPUMMX.contains(mSelected) || mFPUXMM.contains(mSelected) || mFPUYMM.contains(mSelected)) - { - wMenu.addAction(wCM_Highlight); - } - - if(mUNDODISPLAY.contains(mSelected) && CompareRegisters(mSelected, &wRegDumpStruct, &wCipRegDumpStruct) != 0) - { - wMenu.addAction(wCM_Undo); - } - - if(mSETONEZEROTOGGLE.contains(mSelected)) - { - if(mSelected >= x87r0 && mSelected <= x87r7 || mSelected >= x87st0 && mSelected <= x87st7) - { - if(memcmp(registerValue(&wRegDumpStruct, mSelected), "\0\0\0\0\0\0\0\0\0", 10) != 0) - wMenu.addAction(wCM_Zero); - if(memcmp(registerValue(&wRegDumpStruct, mSelected), "\0\0\0\0\0\0\0\x80\xFF\x3F", 10) != 0) - wMenu.addAction(wCM_SetToOne); - } - else - { - if((* ((duint*) registerValue(&wRegDumpStruct, mSelected))) != 0) - wMenu.addAction(wCM_Zero); - if((* ((duint*) registerValue(&wRegDumpStruct, mSelected))) == 0) - wMenu.addAction(wCM_SetToOne); - } - } - - if(mBOOLDISPLAY.contains(mSelected)) - { - wMenu.addAction(wCM_ToggleValue); - } - - if(mFPUx87_80BITSDISPLAY.contains(mSelected)) - { - wMenu.addAction(wCM_Incrementx87Stack); - wMenu.addAction(wCM_Decrementx87Stack); - } - - if(mINCREMENTDECREMET.contains(mSelected)) - { - wMenu.addAction(wCM_Increment); - wMenu.addAction(wCM_Decrement); - wMenu.addAction(wCM_IncrementPtrSize); - wMenu.addAction(wCM_DecrementPtrSize); - } - - if(mGPR.contains(mSelected) || mSelected == CIP) - { - wMenu.addAction(wCM_Push); - wMenu.addAction(wCM_Pop); - } - - if(mFPUMMX.contains(mSelected) || mFPUXMM.contains(mSelected) || mFPUYMM.contains(mSelected)) - { - wMenu.addMenu(mSwitchSIMDDispMode); - } - - if(mFPUMMX.contains(mSelected) || mFPUx87_80BITSDISPLAY.contains(mSelected)) - { - if(mFpuMode != 0) - wMenu.addAction(mDisplaySTX); - if(mFpuMode != 1) - wMenu.addAction(mDisplayx87rX); - if(mFpuMode != 2) - wMenu.addAction(mDisplayMMX); - } - - wMenu.exec(this->mapToGlobal(pos)); - } - else - { - wMenu.addSeparator(); - wMenu.addAction(wCM_ChangeFPUView); - wMenu.addAction(wCM_CopyAll); - wMenu.addMenu(mSwitchSIMDDispMode); - if(mFpuMode != 0) - wMenu.addAction(mDisplaySTX); - if(mFpuMode != 1) - wMenu.addAction(mDisplayx87rX); - if(mFpuMode != 2) - wMenu.addAction(mDisplayMMX); - wMenu.addSeparator(); - QAction* wHwbpCsp = wMenu.addAction(DIcon("breakpoint.png"), tr("Set Hardware Breakpoint on %1").arg(ArchValue("ESP", "RSP"))); - QAction* wAction = wMenu.exec(this->mapToGlobal(pos)); - - if(wAction == wHwbpCsp) - DbgCmdExec("bphws csp,rw"); - } -} - -void CPURegistersView::onSIMDMode() -{ - Config()->setUint("Gui", "SIMDRegistersDisplayMode", dynamic_cast(sender())->data().toInt()); - emit refresh(); - GuiUpdateDisassemblyView(); // refresh display mode for data in disassembly -} - -void CPURegistersView::onFpuMode() -{ - mFpuMode = (char)(dynamic_cast(sender())->data().toInt()); - InitMappings(); - emit refresh(); -} - -void CPURegistersView::setRegister(REGISTER_NAME reg, duint value) -{ - // is register-id known? - if(mRegisterMapping.contains(reg)) - { - // map x87st0 to x87r0 - QString wRegName; - if(reg >= x87st0 && reg <= x87st7) - wRegName = QString().sprintf("st%d", reg - x87st0); - else - // map "cax" to "eax" or "rax" - wRegName = mRegisterMapping.constFind(reg).value(); - - // flags need to '_' infront - if(mFlags.contains(reg)) - wRegName = "_" + wRegName; - - // we change the value (so highlight it) - mRegisterUpdates.insert(reg); - // tell everything the compiler - if(mFPU.contains(reg)) - wRegName = "_" + wRegName; - - DbgValToString(wRegName.toUtf8().constData(), value); - - // force repaint - emit refresh(); - } -} - -void CPURegistersView::disasmSelectionChangedSlot(dsint va) -{ - mHighlightRegs = mParent->getDisasmWidget()->DisassembleAt(va - mParent->getDisasmWidget()->getBase()).regsReferenced; - emit refresh(); -} +#include +#include "MiscUtil.h" +#include "CPUWidget.h" +#include "CPUDisassembly.h" +#include "CPUMultiDump.h" +#include "Configuration.h" +#include "WordEditDialog.h" +#include "LineEditDialog.h" +#include "EditFloatRegister.h" +#include "SelectFields.h" +#include "CPURegistersView.h" +#include "ldconvert.h" + +static QAction* setupAction(const QIcon & icon, const QString & text, RegistersView* this_object) +{ + QAction* action = new QAction(icon, text, this_object); + action->setShortcutContext(Qt::WidgetShortcut); + this_object->addAction(action); + return action; +} + +static QAction* setupAction(const QString & text, RegistersView* this_object) +{ + QAction* action = new QAction(text, this_object); + action->setShortcutContext(Qt::WidgetShortcut); + this_object->addAction(action); + return action; +} + +CPURegistersView::CPURegistersView(CPUWidget* parent) : RegistersView(parent), mParent(parent) +{ + // precreate ContextMenu Actions + wCM_Increment = setupAction(DIcon("register_inc.png"), tr("Increment"), this); + wCM_Decrement = setupAction(DIcon("register_dec.png"), tr("Decrement"), this); + wCM_Zero = setupAction(DIcon("register_zero.png"), tr("Zero"), this); + wCM_SetToOne = setupAction(DIcon("register_one.png"), tr("Set to 1"), this); + wCM_Modify = new QAction(DIcon("register_edit.png"), tr("Modify value"), this); + wCM_Modify->setShortcut(QKeySequence(Qt::Key_Enter)); + wCM_ToggleValue = setupAction(DIcon("register_toggle.png"), tr("Toggle"), this); + wCM_Undo = setupAction(DIcon("undo.png"), tr("Undo"), this); + wCM_CopyToClipboard = setupAction(DIcon("copy.png"), tr("Copy value"), this); + wCM_CopyFloatingPointValueToClipboard = setupAction(DIcon("copy.png"), tr("Copy floating point value"), this); + wCM_CopySymbolToClipboard = setupAction(DIcon("pdb.png"), tr("Copy Symbol Value"), this); + wCM_CopyAll = setupAction(DIcon("copy-alt.png"), tr("Copy all registers"), this); + wCM_FollowInDisassembly = new QAction(DIcon(QString("processor%1.png").arg(ArchValue("32", "64"))), tr("Follow in Disassembler"), this); + wCM_FollowInDump = new QAction(DIcon("dump.png"), tr("Follow in Dump"), this); + wCM_FollowInStack = new QAction(DIcon("stack.png"), tr("Follow in Stack"), this); + wCM_FollowInMemoryMap = new QAction(DIcon("memmap_find_address_page"), tr("Follow in Memory Map"), this); + wCM_Incrementx87Stack = setupAction(DIcon("arrow-small-down.png"), tr("Increment x87 Stack"), this); + wCM_Decrementx87Stack = setupAction(DIcon("arrow-small-up.png"), tr("Decrement x87 Stack"), this); + wCM_ChangeFPUView = new QAction(DIcon("change-view.png"), tr("Change view"), this); + wCM_IncrementPtrSize = setupAction(DIcon("register_inc.png"), ArchValue(tr("Increase 4"), tr("Increase 8")), this); + wCM_DecrementPtrSize = setupAction(DIcon("register_dec.png"), ArchValue(tr("Decrease 4"), tr("Decrease 8")), this); + wCM_Push = setupAction(DIcon("arrow-small-down.png"), tr("Push"), this); + wCM_Pop = setupAction(DIcon("arrow-small-up.png"), tr("Pop"), this); + wCM_Highlight = setupAction(DIcon("highlight.png"), tr("Highlight"), this); + mSwitchSIMDDispMode = new QMenu(tr("Change SIMD Register Display Mode"), this); + mSwitchSIMDDispMode->setIcon(DIcon("simdmode.png")); + mDisplaySTX = new QAction(tr("Display ST(x)"), this); + mDisplayx87rX = new QAction(tr("Display x87rX"), this); + mDisplayMMX = new QAction(tr("Display MMX"), this); + SIMDHex = new QAction(tr("Hexadecimal"), mSwitchSIMDDispMode); + SIMDFloat = new QAction(tr("Float"), mSwitchSIMDDispMode); + SIMDDouble = new QAction(tr("Double"), mSwitchSIMDDispMode); + SIMDSWord = new QAction(tr("Signed Word"), mSwitchSIMDDispMode); + SIMDSDWord = new QAction(tr("Signed Dword"), mSwitchSIMDDispMode); + SIMDSQWord = new QAction(tr("Signed Qword"), mSwitchSIMDDispMode); + SIMDUWord = new QAction(tr("Unsigned Word"), mSwitchSIMDDispMode); + SIMDUDWord = new QAction(tr("Unsigned Dword"), mSwitchSIMDDispMode); + SIMDUQWord = new QAction(tr("Unsigned Qword"), mSwitchSIMDDispMode); + SIMDHWord = new QAction(tr("Hexadecimal Word"), mSwitchSIMDDispMode); + SIMDHDWord = new QAction(tr("Hexadecimal Dword"), mSwitchSIMDDispMode); + SIMDHQWord = new QAction(tr("Hexadecimal Qword"), mSwitchSIMDDispMode); + SIMDHex->setData(QVariant(0)); + SIMDFloat->setData(QVariant(1)); + SIMDDouble->setData(QVariant(2)); + SIMDSWord->setData(QVariant(3)); + SIMDUWord->setData(QVariant(6)); + SIMDHWord->setData(QVariant(9)); + SIMDSDWord->setData(QVariant(4)); + SIMDUDWord->setData(QVariant(7)); + SIMDHDWord->setData(QVariant(10)); + SIMDSQWord->setData(QVariant(5)); + SIMDUQWord->setData(QVariant(8)); + SIMDHQWord->setData(QVariant(11)); + mDisplaySTX->setData(QVariant(0)); + mDisplayx87rX->setData(QVariant(1)); + mDisplayMMX->setData(QVariant(2)); + connect(SIMDHex, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDFloat, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDDouble, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDSWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDUWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDHWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDSDWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDUDWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDHDWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDSQWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDUQWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(SIMDHQWord, SIGNAL(triggered()), this, SLOT(onSIMDMode())); + connect(mDisplaySTX, SIGNAL(triggered()), this, SLOT(onFpuMode())); + connect(mDisplayx87rX, SIGNAL(triggered()), this, SLOT(onFpuMode())); + connect(mDisplayMMX, SIGNAL(triggered()), this, SLOT(onFpuMode())); + SIMDHex->setCheckable(true); + SIMDFloat->setCheckable(true); + SIMDDouble->setCheckable(true); + SIMDSWord->setCheckable(true); + SIMDUWord->setCheckable(true); + SIMDHWord->setCheckable(true); + SIMDSDWord->setCheckable(true); + SIMDUDWord->setCheckable(true); + SIMDHDWord->setCheckable(true); + SIMDSQWord->setCheckable(true); + SIMDUQWord->setCheckable(true); + SIMDHQWord->setCheckable(true); + SIMDHex->setChecked(true); + SIMDFloat->setChecked(false); + SIMDDouble->setChecked(false); + SIMDSWord->setChecked(false); + SIMDUWord->setChecked(false); + SIMDHWord->setChecked(false); + SIMDSDWord->setChecked(false); + SIMDUDWord->setChecked(false); + SIMDHDWord->setChecked(false); + SIMDSQWord->setChecked(false); + SIMDUQWord->setChecked(false); + SIMDHQWord->setChecked(false); + mSwitchSIMDDispMode->addAction(SIMDHex); + mSwitchSIMDDispMode->addAction(SIMDFloat); + mSwitchSIMDDispMode->addAction(SIMDDouble); + mSwitchSIMDDispMode->addAction(SIMDSWord); + mSwitchSIMDDispMode->addAction(SIMDSDWord); + mSwitchSIMDDispMode->addAction(SIMDSQWord); + mSwitchSIMDDispMode->addAction(SIMDUWord); + mSwitchSIMDDispMode->addAction(SIMDUDWord); + mSwitchSIMDDispMode->addAction(SIMDUQWord); + mSwitchSIMDDispMode->addAction(SIMDHWord); + mSwitchSIMDDispMode->addAction(SIMDHDWord); + mSwitchSIMDDispMode->addAction(SIMDHQWord); + // Context Menu + this->setContextMenuPolicy(Qt::CustomContextMenu); + // foreign messages + connect(Bridge::getBridge(), SIGNAL(updateRegisters()), this, SLOT(updateRegistersSlot())); + connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayCustomContextMenuSlot(QPoint))); + connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); + connect(parent->getDisasmWidget(), SIGNAL(selectionChanged(dsint)), this, SLOT(disasmSelectionChangedSlot(dsint))); + // context menu actions + connect(wCM_Increment, SIGNAL(triggered()), this, SLOT(onIncrementAction())); + connect(wCM_ChangeFPUView, SIGNAL(triggered()), this, SLOT(onChangeFPUViewAction())); + connect(wCM_Decrement, SIGNAL(triggered()), this, SLOT(onDecrementAction())); + connect(wCM_Incrementx87Stack, SIGNAL(triggered()), this, SLOT(onIncrementx87StackAction())); + connect(wCM_Decrementx87Stack, SIGNAL(triggered()), this, SLOT(onDecrementx87StackAction())); + connect(wCM_Zero, SIGNAL(triggered()), this, SLOT(onZeroAction())); + connect(wCM_SetToOne, SIGNAL(triggered()), this, SLOT(onSetToOneAction())); + connect(wCM_Modify, SIGNAL(triggered()), this, SLOT(onModifyAction())); + connect(wCM_ToggleValue, SIGNAL(triggered()), this, SLOT(onToggleValueAction())); + connect(wCM_Undo, SIGNAL(triggered()), this, SLOT(onUndoAction())); + connect(wCM_CopyToClipboard, SIGNAL(triggered()), this, SLOT(onCopyToClipboardAction())); + connect(wCM_CopyFloatingPointValueToClipboard, SIGNAL(triggered()), this, SLOT(onCopyFloatingPointToClipboardAction())); + connect(wCM_CopySymbolToClipboard, SIGNAL(triggered()), this, SLOT(onCopySymbolToClipboardAction())); + connect(wCM_CopyAll, SIGNAL(triggered()), this, SLOT(onCopyAllAction())); + connect(wCM_FollowInDisassembly, SIGNAL(triggered()), this, SLOT(onFollowInDisassembly())); + connect(wCM_FollowInDump, SIGNAL(triggered()), this, SLOT(onFollowInDump())); + connect(wCM_FollowInStack, SIGNAL(triggered()), this, SLOT(onFollowInStack())); + connect(wCM_FollowInMemoryMap, SIGNAL(triggered()), this, SLOT(onFollowInMemoryMap())); + connect(wCM_IncrementPtrSize, SIGNAL(triggered()), this, SLOT(onIncrementPtrSize())); + connect(wCM_DecrementPtrSize, SIGNAL(triggered()), this, SLOT(onDecrementPtrSize())); + connect(wCM_Push, SIGNAL(triggered()), this, SLOT(onPushAction())); + connect(wCM_Pop, SIGNAL(triggered()), this, SLOT(onPopAction())); + connect(wCM_Highlight, SIGNAL(triggered()), this, SLOT(onHighlightSlot())); + + refreshShortcutsSlot(); + connect(Config(), SIGNAL(shortcutsUpdated()), this, SLOT(refreshShortcutsSlot())); +} + +void CPURegistersView::refreshShortcutsSlot() +{ + wCM_Increment->setShortcut(ConfigShortcut("ActionIncreaseRegister")); + wCM_Decrement->setShortcut(ConfigShortcut("ActionDecreaseRegister")); + wCM_Zero->setShortcut(ConfigShortcut("ActionZeroRegister")); + wCM_SetToOne->setShortcut(ConfigShortcut("ActionSetOneRegister")); + wCM_ToggleValue->setShortcut(ConfigShortcut("ActionToggleRegisterValue")); + wCM_CopyToClipboard->setShortcut(ConfigShortcut("ActionCopy")); + wCM_CopySymbolToClipboard->setShortcut(ConfigShortcut("ActionCopySymbol")); + wCM_CopyAll->setShortcut(ConfigShortcut("ActionCopyAllRegisters")); + wCM_Highlight->setShortcut(ConfigShortcut("ActionHighlightingMode")); + wCM_IncrementPtrSize->setShortcut(ConfigShortcut("ActionIncreaseRegisterPtrSize")); + wCM_DecrementPtrSize->setShortcut(ConfigShortcut("ActionDecreaseRegisterPtrSize")); + wCM_Incrementx87Stack->setShortcut(ConfigShortcut("ActionIncrementx87Stack")); + wCM_Decrementx87Stack->setShortcut(ConfigShortcut("ActionDecrementx87Stack")); + wCM_Push->setShortcut(ConfigShortcut("ActionPush")); + wCM_Pop->setShortcut(ConfigShortcut("ActionPop")); +} + +void CPURegistersView::mousePressEvent(QMouseEvent* event) +{ + if(!isActive) + return; + + if(event->y() < yTopSpacing - mButtonHeight) + { + onChangeFPUViewAction(); + } + else + { + // get mouse position + const int y = (event->y() - yTopSpacing) / (double)mRowHeight; + const int x = event->x() / (double)mCharWidth; + + REGISTER_NAME r; + // do we find a corresponding register? + if(identifyRegister(y, x, &r)) + { + Disassembly* CPUDisassemblyView = mParent->getDisasmWidget(); + if(CPUDisassemblyView->isHighlightMode()) + { + if(mGPR.contains(r) && r != REGISTER_NAME::EFLAGS) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::GeneralRegister, mRegisterMapping.constFind(r).value())); + else if(mFPUMMX.contains(r)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MmxRegister, mRegisterMapping.constFind(r).value())); + else if(mFPUXMM.contains(r)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::XmmRegister, mRegisterMapping.constFind(r).value())); + else if(mFPUYMM.contains(r)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::YmmRegister, mRegisterMapping.constFind(r).value())); + else if(mSEGMENTREGISTER.contains(r)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MemorySegment, mRegisterMapping.constFind(r).value())); + else + mSelected = r; + } + else + mSelected = r; + emit refresh(); + } + else + mSelected = UNKNOWN; + } +} + +void CPURegistersView::mouseDoubleClickEvent(QMouseEvent* event) +{ + if(!isActive || event->button() != Qt::LeftButton) + return; + // get mouse position + const int y = (event->y() - yTopSpacing) / (double)mRowHeight; + const int x = event->x() / (double)mCharWidth; + + // do we find a corresponding register? + if(!identifyRegister(y, x, 0)) + return; + if(mSelected == CIP) //double clicked on CIP register + DbgCmdExec("disasm cip"); + // is current register general purposes register or FPU register? + else if(mMODIFYDISPLAY.contains(mSelected)) + wCM_Modify->trigger(); + else if(mBOOLDISPLAY.contains(mSelected)) // is flag ? + wCM_ToggleValue->trigger(); + else if(mCANSTOREADDRESS.contains(mSelected)) + wCM_FollowInDisassembly->trigger(); +} + +void CPURegistersView::keyPressEvent(QKeyEvent* event) +{ + if(isActive) + { + int key = event->key(); + REGISTER_NAME newRegister = UNKNOWN; + + switch(key) + { + case Qt::Key_Enter: + case Qt::Key_Return: + wCM_Modify->trigger(); + break; + case Qt::Key_Left: + newRegister = mRegisterRelativePlaces[mSelected].left; + break; + case Qt::Key_Right: + newRegister = mRegisterRelativePlaces[mSelected].right; + break; + case Qt::Key_Up: + newRegister = mRegisterRelativePlaces[mSelected].up; + break; + case Qt::Key_Down: + newRegister = mRegisterRelativePlaces[mSelected].down; + break; + } + + if(newRegister != UNKNOWN) + { + mSelected = newRegister; + ensureRegisterVisible(newRegister); + emit refresh(); + } + } + RegistersView::keyPressEvent(event); +} + +void CPURegistersView::debugStateChangedSlot(DBGSTATE state) +{ + if(state == stopped) + { + updateRegistersSlot(); + isActive = false; + } + else + { + isActive = true; + } +} + +void CPURegistersView::updateRegistersSlot() +{ + // read registers + REGDUMP z; + DbgGetRegDumpEx(&z, sizeof(REGDUMP)); + // update gui + setRegisters(&z); +} + +void CPURegistersView::ModifyFields(const QString & title, STRING_VALUE_TABLE_t* table, SIZE_T size) +{ + SelectFields mSelectFields(this); + QListWidget* mQListWidget = mSelectFields.GetList(); + + QStringList items; + unsigned int i; + + for(i = 0; i < size; i++) + items << QApplication::translate("RegistersView_ConstantsOfRegisters", table[i].string) + QString(" (%1)").arg(table[i].value, 0, 16); + + mQListWidget->addItems(items); + + mSelectFields.setWindowTitle(title); + if(mSelectFields.exec() != QDialog::Accepted) + return; + + if(mQListWidget->selectedItems().count() != 1) + return; + + //QListWidgetItem* item = mQListWidget->takeItem(mQListWidget->currentRow()); + QString itemText = mQListWidget->item(mQListWidget->currentRow())->text(); + + duint value; + + for(i = 0; i < size; i++) + { + if(QApplication::translate("RegistersView_ConstantsOfRegisters", table[i].string) + QString(" (%1)").arg(table[i].value, 0, 16) == itemText) + break; + } + + value = table[i].value; + + setRegister(mSelected, (duint)value); + //delete item; +} + +extern STRING_VALUE_TABLE_t MxCsrRCValueStringTable[4]; +extern STRING_VALUE_TABLE_t ControlWordRCValueStringTable[4]; +extern STRING_VALUE_TABLE_t StatusWordTOPValueStringTable[8]; +extern STRING_VALUE_TABLE_t ControlWordPCValueStringTable[4]; +extern STRING_VALUE_TABLE_t TagWordValueStringTable[4]; + +#define MODIFY_FIELDS_DISPLAY(prefix, title, table) ModifyFields(prefix + QChar(' ') + QString(title), (STRING_VALUE_TABLE_t *) & table, SIZE_TABLE(table) ) + +/** + * @brief This function displays the appropriate edit dialog according to selected register + * @return Nothing. + */ + +void CPURegistersView::displayEditDialog() +{ + if(mFPU.contains(mSelected)) + { + if(mTAGWORD.contains(mSelected)) + MODIFY_FIELDS_DISPLAY(tr("Edit"), "Tag " + mRegisterMapping.constFind(mSelected).value(), TagWordValueStringTable); + else if(mSelected == MxCsr_RC) + MODIFY_FIELDS_DISPLAY(tr("Edit"), "MxCsr_RC", MxCsrRCValueStringTable); + else if(mSelected == x87CW_RC) + MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87CW_RC", ControlWordRCValueStringTable); + else if(mSelected == x87CW_PC) + MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87CW_PC", ControlWordPCValueStringTable); + else if(mSelected == x87SW_TOP) + { + MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87SW_TOP", StatusWordTOPValueStringTable); + // if(mFpuMode == false) + updateRegistersSlot(); + } + else if(mFPUYMM.contains(mSelected)) + { + EditFloatRegister mEditFloat(256, this); + mEditFloat.setWindowTitle(tr("Edit YMM register")); + mEditFloat.loadData(registerValue(&wRegDumpStruct, mSelected)); + mEditFloat.show(); + mEditFloat.selectAllText(); + if(mEditFloat.exec() == QDialog::Accepted) + setRegister(mSelected, (duint)mEditFloat.getData()); + } + else if(mFPUXMM.contains(mSelected)) + { + EditFloatRegister mEditFloat(128, this); + mEditFloat.setWindowTitle(tr("Edit XMM register")); + mEditFloat.loadData(registerValue(&wRegDumpStruct, mSelected)); + mEditFloat.show(); + mEditFloat.selectAllText(); + if(mEditFloat.exec() == QDialog::Accepted) + setRegister(mSelected, (duint)mEditFloat.getData()); + } + else if(mFPUMMX.contains(mSelected)) + { + EditFloatRegister mEditFloat(64, this); + mEditFloat.setWindowTitle(tr("Edit MMX register")); + mEditFloat.loadData(registerValue(&wRegDumpStruct, mSelected)); + mEditFloat.show(); + mEditFloat.selectAllText(); + if(mEditFloat.exec() == QDialog::Accepted) + setRegister(mSelected, (duint)mEditFloat.getData()); + } + else + { + bool errorinput = false; + LineEditDialog mLineEdit(this); + + mLineEdit.setText(GetRegStringValueFromValue(mSelected, registerValue(&wRegDumpStruct, mSelected))); + mLineEdit.setWindowTitle(tr("Edit FPU register")); + mLineEdit.setWindowIcon(DIcon("log.png")); + mLineEdit.setCursorPosition(0); + auto sizeRegister = int(GetSizeRegister(mSelected)); + if(sizeRegister == 10) + mLineEdit.setFpuMode(); + mLineEdit.ForceSize(sizeRegister * 2); + do + { + errorinput = false; + mLineEdit.show(); + mLineEdit.selectAllText(); + if(mLineEdit.exec() != QDialog::Accepted) + return; //pressed cancel + else + { + bool ok = false; + duint fpuvalue; + + if(mUSHORTDISPLAY.contains(mSelected)) + fpuvalue = (duint) mLineEdit.editText.toUShort(&ok, 16); + else if(mDWORDDISPLAY.contains(mSelected)) + fpuvalue = mLineEdit.editText.toUInt(&ok, 16); + else if(mFPUx87_80BITSDISPLAY.contains(mSelected)) + { + QString editTextLower = mLineEdit.editText.toLower(); + if(sizeRegister == 10 && (mLineEdit.editText.contains(QChar('.')) || editTextLower == "nan" || editTextLower == "inf" + || editTextLower == "+inf" || editTextLower == "-inf")) + { + char number[10]; + str2ld(mLineEdit.editText.toUtf8().constData(), number); + setRegister(mSelected, reinterpret_cast(number)); + return; + } + else + { + QByteArray pArray = mLineEdit.editText.toLocal8Bit(); + + if(pArray.size() == sizeRegister * 2) + { + char* pData = (char*) calloc(1, sizeof(char) * sizeRegister); + + if(pData != NULL) + { + ok = true; + char actual_char[3]; + for(int i = 0; i < sizeRegister; i++) + { + memset(actual_char, 0, sizeof(actual_char)); + memcpy(actual_char, (char*) pArray.data() + (i * 2), 2); + if(! isxdigit(actual_char[0]) || ! isxdigit(actual_char[1])) + { + ok = false; + break; + } + pData[i] = (char)strtol(actual_char, NULL, 16); + } + + if(ok) + { + if(!ConfigBool("Gui", "FpuRegistersLittleEndian")) // reverse byte order if it is big-endian + { + pArray = ByteReverse(QByteArray(pData, sizeRegister)); + setRegister(mSelected, reinterpret_cast(pArray.constData())); + } + else + setRegister(mSelected, reinterpret_cast(pData)); + } + + free(pData); + + if(ok) + return; + } + } + } + } + if(!ok) + { + errorinput = true; + + SimpleWarningBox(this, tr("ERROR CONVERTING TO HEX"), tr("ERROR CONVERTING TO HEX")); + } + else + setRegister(mSelected, fpuvalue); + } + } + while(errorinput); + } + } + else if(mSelected == LastError) + { + bool errorinput = false; + LineEditDialog mLineEdit(this); + LASTERROR* error = (LASTERROR*)registerValue(&wRegDumpStruct, LastError); + mLineEdit.setText(QString::number(error->code, 16)); + mLineEdit.setWindowTitle(tr("Set Last Error")); + mLineEdit.setCursorPosition(0); + do + { + errorinput = true; + mLineEdit.show(); + mLineEdit.selectAllText(); + if(mLineEdit.exec() != QDialog::Accepted) + return; + if(DbgIsValidExpression(mLineEdit.editText.toUtf8().constData())) + errorinput = false; + } + while(errorinput); + setRegister(LastError, DbgValFromString(mLineEdit.editText.toUtf8().constData())); + } + else if(mSelected == LastStatus) + { + bool statusinput = false; + LineEditDialog mLineEdit(this); + LASTSTATUS* status = (LASTSTATUS*)registerValue(&wRegDumpStruct, LastStatus); + mLineEdit.setText(QString::number(status->code, 16)); + mLineEdit.setWindowTitle(tr("Set Last Status")); + mLineEdit.setCursorPosition(0); + do + { + statusinput = true; + mLineEdit.show(); + mLineEdit.selectAllText(); + if(mLineEdit.exec() != QDialog::Accepted) + return; + if(DbgIsValidExpression(mLineEdit.editText.toUtf8().constData())) + statusinput = false; + } + while(statusinput); + setRegister(LastStatus, DbgValFromString(mLineEdit.editText.toUtf8().constData())); + } + else + { + WordEditDialog wEditDial(this); + wEditDial.setup(tr("Edit"), (* ((duint*) registerValue(&wRegDumpStruct, mSelected))), sizeof(dsint)); + if(wEditDial.exec() == QDialog::Accepted) //OK button clicked + setRegister(mSelected, wEditDial.getVal()); + } +} + +void CPURegistersView::CreateDumpNMenu(QMenu* dumpMenu) +{ + QList names; + CPUMultiDump* multiDump = mParent->getDumpWidget(); + dumpMenu->setIcon(DIcon("dump.png")); + int maxDumps = multiDump->getMaxCPUTabs(); + multiDump->getTabNames(names); + for(int i = 0; i < maxDumps; i++) + { + QAction* action = new QAction(names.at(i), this); + connect(action, SIGNAL(triggered()), this, SLOT(onFollowInDumpN())); + dumpMenu->addAction(action); + action->setData(i + 1); + } +} + +void CPURegistersView::onIncrementx87StackAction() +{ + if(mFPUx87_80BITSDISPLAY.contains(mSelected)) + setRegister(x87SW_TOP, ((* ((duint*) registerValue(&wRegDumpStruct, x87SW_TOP))) + 1) % 8); +} + +void CPURegistersView::onDecrementx87StackAction() +{ + if(mFPUx87_80BITSDISPLAY.contains(mSelected)) + setRegister(x87SW_TOP, ((* ((duint*) registerValue(&wRegDumpStruct, x87SW_TOP))) - 1) % 8); +} + +void CPURegistersView::onIncrementAction() +{ + if(mINCREMENTDECREMET.contains(mSelected)) + setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) + 1); +} + +void CPURegistersView::onDecrementAction() +{ + if(mINCREMENTDECREMET.contains(mSelected)) + setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) - 1); +} + +void CPURegistersView::onIncrementPtrSize() +{ + if(mINCREMENTDECREMET.contains(mSelected)) + setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) + sizeof(void*)); +} + +void CPURegistersView::onDecrementPtrSize() +{ + if(mINCREMENTDECREMET.contains(mSelected)) + setRegister(mSelected, (* ((duint*) registerValue(&wRegDumpStruct, mSelected))) - sizeof(void*)); +} + +void CPURegistersView::onPushAction() +{ + duint csp = (* ((duint*) registerValue(&wRegDumpStruct, CSP))) - sizeof(void*); + duint regVal = 0; + regVal = * ((duint*) registerValue(&wRegDumpStruct, mSelected)); + setRegister(CSP, csp); + DbgMemWrite(csp, (const unsigned char*)®Val, sizeof(void*)); +} + +void CPURegistersView::onPopAction() +{ + duint csp = (* ((duint*) registerValue(&wRegDumpStruct, CSP))); + duint newVal; + DbgMemRead(csp, (unsigned char*)&newVal, sizeof(void*)); + setRegister(CSP, csp + sizeof(void*)); + setRegister(mSelected, newVal); +} + +void CPURegistersView::onZeroAction() +{ + if(mSETONEZEROTOGGLE.contains(mSelected)) + { + if(mSelected >= x87r0 && mSelected <= x87r7 || mSelected >= x87st0 && mSelected <= x87st7) + setRegister(mSelected, reinterpret_cast("\0\0\0\0\0\0\0\0\0")); //9 zeros and 1 terminating zero + else + setRegister(mSelected, 0); + } +} + +void CPURegistersView::onSetToOneAction() +{ + if(mSETONEZEROTOGGLE.contains(mSelected)) + { + if(mSelected >= x87r0 && mSelected <= x87r7 || mSelected >= x87st0 && mSelected <= x87st7) + setRegister(mSelected, reinterpret_cast("\0\0\0\0\0\0\0\x80\xFF\x3F")); + else + setRegister(mSelected, 1); + } +} + +void CPURegistersView::onModifyAction() +{ + if(mMODIFYDISPLAY.contains(mSelected)) + displayEditDialog(); +} + +void CPURegistersView::onToggleValueAction() +{ + if(mBOOLDISPLAY.contains(mSelected)) + { + int value = (int)(* (bool*) registerValue(&wRegDumpStruct, mSelected)); + setRegister(mSelected, value ^ 1); + } +} + +void CPURegistersView::onUndoAction() +{ + if(mUNDODISPLAY.contains(mSelected)) + { + if(mFPUMMX.contains(mSelected) || mFPUXMM.contains(mSelected) || mFPUYMM.contains(mSelected) || mFPUx87_80BITSDISPLAY.contains(mSelected)) + setRegister(mSelected, (duint)registerValue(&wCipRegDumpStruct, mSelected)); + else + setRegister(mSelected, *(duint*)registerValue(&wCipRegDumpStruct, mSelected)); + } +} + +void CPURegistersView::onCopyToClipboardAction() +{ + Bridge::CopyToClipboard(GetRegStringValueFromValue(mSelected, registerValue(&wRegDumpStruct, mSelected))); +} + +void CPURegistersView::onCopyFloatingPointToClipboardAction() +{ + Bridge::CopyToClipboard(ToLongDoubleString(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, mSelected))->data)); +} + +void CPURegistersView::onCopySymbolToClipboardAction() +{ + if(mLABELDISPLAY.contains(mSelected)) + { + QString symbol = getRegisterLabel(mSelected); + if(symbol != "") + Bridge::CopyToClipboard(symbol); + } +} + +void CPURegistersView::onHighlightSlot() +{ + Disassembly* CPUDisassemblyView = mParent->getDisasmWidget(); + if(mGPR.contains(mSelected) && mSelected != REGISTER_NAME::EFLAGS) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::GeneralRegister, mRegisterMapping.constFind(mSelected).value())); + else if(mSEGMENTREGISTER.contains(mSelected)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MemorySegment, mRegisterMapping.constFind(mSelected).value())); + else if(mFPUMMX.contains(mSelected)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::MmxRegister, mRegisterMapping.constFind(mSelected).value())); + else if(mFPUXMM.contains(mSelected)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::XmmRegister, mRegisterMapping.constFind(mSelected).value())); + else if(mFPUYMM.contains(mSelected)) + CPUDisassemblyView->hightlightToken(ZydisTokenizer::SingleToken(ZydisTokenizer::TokenType::YmmRegister, mRegisterMapping.constFind(mSelected).value())); + CPUDisassemblyView->reloadData(); +} + +void CPURegistersView::onFollowInDisassembly() +{ + if(mCANSTOREADDRESS.contains(mSelected)) + { + QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) + DbgCmdExec(QString().sprintf("disasm \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); + } +} + +void CPURegistersView::onFollowInDump() +{ + if(mCANSTOREADDRESS.contains(mSelected)) + { + QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) + DbgCmdExec(QString().sprintf("dump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); + } +} + +void CPURegistersView::onFollowInDumpN() +{ + if(mCANSTOREADDRESS.contains(mSelected)) + { + QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) + { + QAction* action = qobject_cast(sender()); + int numDump = action->data().toInt(); + DbgCmdExec(QString("dump %1, .%2").arg(addr).arg(numDump).toUtf8().constData()); + } + } +} + +void CPURegistersView::onFollowInStack() +{ + if(mCANSTOREADDRESS.contains(mSelected)) + { + QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) + DbgCmdExec(QString().sprintf("sdump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); + } +} + +void CPURegistersView::onFollowInMemoryMap() +{ + if(mCANSTOREADDRESS.contains(mSelected)) + { + QString addr = QString("%1").arg((* ((duint*) registerValue(&wRegDumpStruct, mSelected))), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr((* ((duint*) registerValue(&wRegDumpStruct, mSelected))))) + DbgCmdExec(QString().sprintf("memmapdump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); + } +} + +void CPURegistersView::displayCustomContextMenuSlot(QPoint pos) +{ + if(!isActive) + return; + QMenu wMenu(this); + QMenu* followInDumpNMenu = nullptr; + const QAction* selectedAction = nullptr; + switch(ConfigUint("Gui", "SIMDRegistersDisplayMode")) + { + case 0: + selectedAction = SIMDHex; + break; + case 1: + selectedAction = SIMDFloat; + break; + case 2: + selectedAction = SIMDDouble; + break; + case 3: + selectedAction = SIMDSWord; + break; + case 6: + selectedAction = SIMDUWord; + break; + case 9: + selectedAction = SIMDHWord; + break; + case 4: + selectedAction = SIMDSDWord; + break; + case 7: + selectedAction = SIMDUDWord; + break; + case 10: + selectedAction = SIMDHDWord; + break; + case 5: + selectedAction = SIMDSQWord; + break; + case 8: + selectedAction = SIMDUQWord; + break; + case 11: + selectedAction = SIMDHQWord; + break; + } + SIMDHex->setChecked(SIMDHex == selectedAction); + SIMDFloat->setChecked(SIMDFloat == selectedAction); + SIMDDouble->setChecked(SIMDDouble == selectedAction); + SIMDSWord->setChecked(SIMDSWord == selectedAction); + SIMDUWord->setChecked(SIMDUWord == selectedAction); + SIMDHWord->setChecked(SIMDHWord == selectedAction); + SIMDSDWord->setChecked(SIMDSDWord == selectedAction); + SIMDUDWord->setChecked(SIMDUDWord == selectedAction); + SIMDHDWord->setChecked(SIMDHDWord == selectedAction); + SIMDSQWord->setChecked(SIMDSQWord == selectedAction); + SIMDUQWord->setChecked(SIMDUQWord == selectedAction); + SIMDHQWord->setChecked(SIMDHQWord == selectedAction); + + if(mSelected != UNKNOWN) + { + if(mMODIFYDISPLAY.contains(mSelected)) + { + wMenu.addAction(wCM_Modify); + } + + if(mCANSTOREADDRESS.contains(mSelected)) + { + duint addr = (* ((duint*) registerValue(&wRegDumpStruct, mSelected))); + if(DbgMemIsValidReadPtr(addr)) + { + wMenu.addAction(wCM_FollowInDump); + followInDumpNMenu = new QMenu(tr("Follow in &Dump"), &wMenu); + CreateDumpNMenu(followInDumpNMenu); + wMenu.addMenu(followInDumpNMenu); + wMenu.addAction(wCM_FollowInDisassembly); + wMenu.addAction(wCM_FollowInMemoryMap); + duint size = 0; + duint base = DbgMemFindBaseAddr(DbgValFromString("csp"), &size); + if(addr >= base && addr < base + size) + wMenu.addAction(wCM_FollowInStack); + } + } + + wMenu.addAction(wCM_CopyToClipboard); + if(mFPUx87_80BITSDISPLAY.contains(mSelected)) + { + wMenu.addAction(wCM_CopyFloatingPointValueToClipboard); + } + wMenu.addAction(wCM_CopyAll); + if(mLABELDISPLAY.contains(mSelected)) + { + QString symbol = getRegisterLabel(mSelected); + if(symbol != "") + wMenu.addAction(wCM_CopySymbolToClipboard); + } + + if((mGPR.contains(mSelected) && mSelected != REGISTER_NAME::EFLAGS) || mSEGMENTREGISTER.contains(mSelected) || mFPUMMX.contains(mSelected) || mFPUXMM.contains(mSelected) || mFPUYMM.contains(mSelected)) + { + wMenu.addAction(wCM_Highlight); + } + + if(mUNDODISPLAY.contains(mSelected) && CompareRegisters(mSelected, &wRegDumpStruct, &wCipRegDumpStruct) != 0) + { + wMenu.addAction(wCM_Undo); + } + + if(mSETONEZEROTOGGLE.contains(mSelected)) + { + if(mSelected >= x87r0 && mSelected <= x87r7 || mSelected >= x87st0 && mSelected <= x87st7) + { + if(memcmp(registerValue(&wRegDumpStruct, mSelected), "\0\0\0\0\0\0\0\0\0", 10) != 0) + wMenu.addAction(wCM_Zero); + if(memcmp(registerValue(&wRegDumpStruct, mSelected), "\0\0\0\0\0\0\0\x80\xFF\x3F", 10) != 0) + wMenu.addAction(wCM_SetToOne); + } + else + { + if((* ((duint*) registerValue(&wRegDumpStruct, mSelected))) != 0) + wMenu.addAction(wCM_Zero); + if((* ((duint*) registerValue(&wRegDumpStruct, mSelected))) == 0) + wMenu.addAction(wCM_SetToOne); + } + } + + if(mBOOLDISPLAY.contains(mSelected)) + { + wMenu.addAction(wCM_ToggleValue); + } + + if(mFPUx87_80BITSDISPLAY.contains(mSelected)) + { + wMenu.addAction(wCM_Incrementx87Stack); + wMenu.addAction(wCM_Decrementx87Stack); + } + + if(mINCREMENTDECREMET.contains(mSelected)) + { + wMenu.addAction(wCM_Increment); + wMenu.addAction(wCM_Decrement); + wMenu.addAction(wCM_IncrementPtrSize); + wMenu.addAction(wCM_DecrementPtrSize); + } + + if(mGPR.contains(mSelected) || mSelected == CIP) + { + wMenu.addAction(wCM_Push); + wMenu.addAction(wCM_Pop); + } + + if(mFPUMMX.contains(mSelected) || mFPUXMM.contains(mSelected) || mFPUYMM.contains(mSelected)) + { + wMenu.addMenu(mSwitchSIMDDispMode); + } + + if(mFPUMMX.contains(mSelected) || mFPUx87_80BITSDISPLAY.contains(mSelected)) + { + if(mFpuMode != 0) + wMenu.addAction(mDisplaySTX); + if(mFpuMode != 1) + wMenu.addAction(mDisplayx87rX); + if(mFpuMode != 2) + wMenu.addAction(mDisplayMMX); + } + + wMenu.exec(this->mapToGlobal(pos)); + } + else + { + wMenu.addSeparator(); + wMenu.addAction(wCM_ChangeFPUView); + wMenu.addAction(wCM_CopyAll); + wMenu.addMenu(mSwitchSIMDDispMode); + if(mFpuMode != 0) + wMenu.addAction(mDisplaySTX); + if(mFpuMode != 1) + wMenu.addAction(mDisplayx87rX); + if(mFpuMode != 2) + wMenu.addAction(mDisplayMMX); + wMenu.addSeparator(); + QAction* wHwbpCsp = wMenu.addAction(DIcon("breakpoint.png"), tr("Set Hardware Breakpoint on %1").arg(ArchValue("ESP", "RSP"))); + QAction* wAction = wMenu.exec(this->mapToGlobal(pos)); + + if(wAction == wHwbpCsp) + DbgCmdExec("bphws csp,rw"); + } +} + +void CPURegistersView::onSIMDMode() +{ + Config()->setUint("Gui", "SIMDRegistersDisplayMode", dynamic_cast(sender())->data().toInt()); + emit refresh(); + GuiUpdateDisassemblyView(); // refresh display mode for data in disassembly +} + +void CPURegistersView::onFpuMode() +{ + mFpuMode = (char)(dynamic_cast(sender())->data().toInt()); + InitMappings(); + emit refresh(); +} + +void CPURegistersView::setRegister(REGISTER_NAME reg, duint value) +{ + // is register-id known? + if(mRegisterMapping.contains(reg)) + { + // map x87st0 to x87r0 + QString wRegName; + if(reg >= x87st0 && reg <= x87st7) + wRegName = QString().sprintf("st%d", reg - x87st0); + else + // map "cax" to "eax" or "rax" + wRegName = mRegisterMapping.constFind(reg).value(); + + // flags need to '_' infront + if(mFlags.contains(reg)) + wRegName = "_" + wRegName; + + // we change the value (so highlight it) + mRegisterUpdates.insert(reg); + // tell everything the compiler + if(mFPU.contains(reg)) + wRegName = "_" + wRegName; + + DbgValToString(wRegName.toUtf8().constData(), value); + + // force repaint + emit refresh(); + } +} + +void CPURegistersView::disasmSelectionChangedSlot(dsint va) +{ + mHighlightRegs = mParent->getDisasmWidget()->DisassembleAt(va - mParent->getDisasmWidget()->getBase()).regsReferenced; + emit refresh(); +} diff --git a/src/gui/Src/Gui/CPURegistersView.h b/src/gui/Src/Gui/CPURegistersView.h index 5bf0a673..94085e5e 100644 --- a/src/gui/Src/Gui/CPURegistersView.h +++ b/src/gui/Src/Gui/CPURegistersView.h @@ -1,99 +1,99 @@ -#ifndef CPUREGISTERSVIEW_H -#define CPUREGISTERSVIEW_H - -#include "RegistersView.h" - -class CPURegistersView : public RegistersView -{ - Q_OBJECT -public: - CPURegistersView(CPUWidget* parent = 0); - -public slots: - void setRegister(REGISTER_NAME reg, duint value); - void updateRegistersSlot(); - virtual void debugStateChangedSlot(DBGSTATE state); - virtual void mousePressEvent(QMouseEvent* event); - virtual void mouseDoubleClickEvent(QMouseEvent* event); - virtual void keyPressEvent(QKeyEvent* event); - virtual void refreshShortcutsSlot(); - virtual void displayCustomContextMenuSlot(QPoint pos); - -protected slots: - void onIncrementAction(); - void onDecrementAction(); - void onIncrementx87StackAction(); - void onDecrementx87StackAction(); - void onZeroAction(); - void onSetToOneAction(); - void onModifyAction(); - void onToggleValueAction(); - void onUndoAction(); - void onCopyToClipboardAction(); - void onCopyFloatingPointToClipboardAction(); - void onCopySymbolToClipboardAction(); - void onFollowInDisassembly(); - void onFollowInDump(); - void onFollowInDumpN(); - void onFollowInStack(); - void onFollowInMemoryMap(); - void onIncrementPtrSize(); - void onDecrementPtrSize(); - void onPushAction(); - void onPopAction(); - void onHighlightSlot(); - // switch SIMD display modes - void onSIMDMode(); - void onFpuMode(); - void ModifyFields(const QString & title, STRING_VALUE_TABLE_t* table, SIZE_T size); - void disasmSelectionChangedSlot(dsint va); - -private: - void CreateDumpNMenu(QMenu* dumpMenu); - void displayEditDialog(); - - CPUWidget* mParent; - // context menu actions - QMenu* mSwitchSIMDDispMode; - QAction* mDisplaySTX; - QAction* mDisplayx87rX; - QAction* mDisplayMMX; - QAction* mFollowInDump; - QAction* wCM_Increment; - QAction* wCM_Decrement; - QAction* wCM_IncrementPtrSize; - QAction* wCM_DecrementPtrSize; - QAction* wCM_Push; - QAction* wCM_Pop; - QAction* wCM_Zero; - QAction* wCM_SetToOne; - QAction* wCM_Modify; - QAction* wCM_ToggleValue; - QAction* wCM_Undo; - QAction* wCM_CopyToClipboard; - QAction* wCM_CopyFloatingPointValueToClipboard; - QAction* wCM_CopySymbolToClipboard; - QAction* wCM_CopyAll; - QAction* wCM_FollowInDisassembly; - QAction* wCM_FollowInDump; - QAction* wCM_FollowInStack; - QAction* wCM_FollowInMemoryMap; - QAction* wCM_Incrementx87Stack; - QAction* wCM_Decrementx87Stack; - QAction* wCM_ChangeFPUView; - QAction* wCM_Highlight; - QAction* SIMDHex; - QAction* SIMDFloat; - QAction* SIMDDouble; - QAction* SIMDSWord; - QAction* SIMDUWord; - QAction* SIMDHWord; - QAction* SIMDSDWord; - QAction* SIMDUDWord; - QAction* SIMDHDWord; - QAction* SIMDSQWord; - QAction* SIMDUQWord; - QAction* SIMDHQWord; -}; - -#endif // CPUREGISTERSVIEW_H +#ifndef CPUREGISTERSVIEW_H +#define CPUREGISTERSVIEW_H + +#include "RegistersView.h" + +class CPURegistersView : public RegistersView +{ + Q_OBJECT +public: + CPURegistersView(CPUWidget* parent = 0); + +public slots: + void setRegister(REGISTER_NAME reg, duint value); + void updateRegistersSlot(); + virtual void debugStateChangedSlot(DBGSTATE state); + virtual void mousePressEvent(QMouseEvent* event); + virtual void mouseDoubleClickEvent(QMouseEvent* event); + virtual void keyPressEvent(QKeyEvent* event); + virtual void refreshShortcutsSlot(); + virtual void displayCustomContextMenuSlot(QPoint pos); + +protected slots: + void onIncrementAction(); + void onDecrementAction(); + void onIncrementx87StackAction(); + void onDecrementx87StackAction(); + void onZeroAction(); + void onSetToOneAction(); + void onModifyAction(); + void onToggleValueAction(); + void onUndoAction(); + void onCopyToClipboardAction(); + void onCopyFloatingPointToClipboardAction(); + void onCopySymbolToClipboardAction(); + void onFollowInDisassembly(); + void onFollowInDump(); + void onFollowInDumpN(); + void onFollowInStack(); + void onFollowInMemoryMap(); + void onIncrementPtrSize(); + void onDecrementPtrSize(); + void onPushAction(); + void onPopAction(); + void onHighlightSlot(); + // switch SIMD display modes + void onSIMDMode(); + void onFpuMode(); + void ModifyFields(const QString & title, STRING_VALUE_TABLE_t* table, SIZE_T size); + void disasmSelectionChangedSlot(dsint va); + +private: + void CreateDumpNMenu(QMenu* dumpMenu); + void displayEditDialog(); + + CPUWidget* mParent; + // context menu actions + QMenu* mSwitchSIMDDispMode; + QAction* mDisplaySTX; + QAction* mDisplayx87rX; + QAction* mDisplayMMX; + QAction* mFollowInDump; + QAction* wCM_Increment; + QAction* wCM_Decrement; + QAction* wCM_IncrementPtrSize; + QAction* wCM_DecrementPtrSize; + QAction* wCM_Push; + QAction* wCM_Pop; + QAction* wCM_Zero; + QAction* wCM_SetToOne; + QAction* wCM_Modify; + QAction* wCM_ToggleValue; + QAction* wCM_Undo; + QAction* wCM_CopyToClipboard; + QAction* wCM_CopyFloatingPointValueToClipboard; + QAction* wCM_CopySymbolToClipboard; + QAction* wCM_CopyAll; + QAction* wCM_FollowInDisassembly; + QAction* wCM_FollowInDump; + QAction* wCM_FollowInStack; + QAction* wCM_FollowInMemoryMap; + QAction* wCM_Incrementx87Stack; + QAction* wCM_Decrementx87Stack; + QAction* wCM_ChangeFPUView; + QAction* wCM_Highlight; + QAction* SIMDHex; + QAction* SIMDFloat; + QAction* SIMDDouble; + QAction* SIMDSWord; + QAction* SIMDUWord; + QAction* SIMDHWord; + QAction* SIMDSDWord; + QAction* SIMDUDWord; + QAction* SIMDHDWord; + QAction* SIMDSQWord; + QAction* SIMDUQWord; + QAction* SIMDHQWord; +}; + +#endif // CPUREGISTERSVIEW_H diff --git a/src/gui/Src/Tracer/TraceRegisters.cpp b/src/gui/Src/Tracer/TraceRegisters.cpp index f4ef4bc4..d96c61eb 100644 --- a/src/gui/Src/Tracer/TraceRegisters.cpp +++ b/src/gui/Src/Tracer/TraceRegisters.cpp @@ -1,17 +1,17 @@ -#include "TraceRegisters.h" - -TraceRegisters::TraceRegisters(QWidget* parent) : RegistersView(parent) -{ - -} - -void TraceRegisters::setRegisters(REGDUMP* registers) -{ - this->RegistersView::setRegisters(registers); -} - -void TraceRegisters::setActive(bool isActive) -{ - this->isActive = isActive; - this->RegistersView::setRegisters(&this->wRegDumpStruct); -} +#include "TraceRegisters.h" + +TraceRegisters::TraceRegisters(QWidget* parent) : RegistersView(parent) +{ + +} + +void TraceRegisters::setRegisters(REGDUMP* registers) +{ + this->RegistersView::setRegisters(registers); +} + +void TraceRegisters::setActive(bool isActive) +{ + this->isActive = isActive; + this->RegistersView::setRegisters(&this->wRegDumpStruct); +} diff --git a/src/gui/Src/Tracer/TraceRegisters.h b/src/gui/Src/Tracer/TraceRegisters.h index 573e1577..61aeaa84 100644 --- a/src/gui/Src/Tracer/TraceRegisters.h +++ b/src/gui/Src/Tracer/TraceRegisters.h @@ -1,15 +1,15 @@ -#ifndef TRACEREGISTERS_H -#define TRACEREGISTERS_H -#include "RegistersView.h" - -class TraceRegisters : public RegistersView -{ - Q_OBJECT -public: - TraceRegisters(QWidget* parent = 0); - - void setRegisters(REGDUMP* registers); - void setActive(bool isActive); -}; - -#endif // TRACEREGISTERS_H +#ifndef TRACEREGISTERS_H +#define TRACEREGISTERS_H +#include "RegistersView.h" + +class TraceRegisters : public RegistersView +{ + Q_OBJECT +public: + TraceRegisters(QWidget* parent = 0); + + void setRegisters(REGDUMP* registers); + void setActive(bool isActive); +}; + +#endif // TRACEREGISTERS_H diff --git a/src/gui/Src/Tracer/TraceWidget.cpp b/src/gui/Src/Tracer/TraceWidget.cpp index fdc6681e..b99a3588 100644 --- a/src/gui/Src/Tracer/TraceWidget.cpp +++ b/src/gui/Src/Tracer/TraceWidget.cpp @@ -1,295 +1,295 @@ -#include "TraceWidget.h" -#include "ui_TraceWidget.h" -#include "TraceBrowser.h" -#include "TraceFileReader.h" -#include "TraceRegisters.h" -#include "StdTable.h" - -TraceWidget::TraceWidget(QWidget* parent) : - QWidget(parent), - ui(new Ui::TraceWidget) -{ - ui->setupUi(this); - - mTraceWidget = new TraceBrowser(this); - mOverview = new StdTable(this); - mInfo = new StdTable(this); - mGeneralRegs = new TraceRegisters(this); - //disasm - ui->mTopLeftUpperRightFrameLayout->addWidget(mTraceWidget); - //registers - mGeneralRegs->setFixedWidth(1000); - mGeneralRegs->ShowFPU(true); - - QScrollArea* upperScrollArea = new QScrollArea(this); - upperScrollArea->setFrameShape(QFrame::NoFrame); - upperScrollArea->setWidget(mGeneralRegs); - - upperScrollArea->horizontalScrollBar()->setStyleSheet(ConfigHScrollBarStyle()); - upperScrollArea->verticalScrollBar()->setStyleSheet(ConfigVScrollBarStyle()); - - QPushButton* button_changeview = new QPushButton("", this); - button_changeview->setStyleSheet("Text-align:left;padding: 4px;padding-left: 10px;"); - connect(button_changeview, SIGNAL(clicked()), mGeneralRegs, SLOT(onChangeFPUViewAction())); - connect(mTraceWidget, SIGNAL(selectionChanged(unsigned long long)), this, SLOT(traceSelectionChanged(unsigned long long))); - connect(Bridge::getBridge(), SIGNAL(updateTraceBrowser()), this, SLOT(updateSlot())); - - mGeneralRegs->SetChangeButton(button_changeview); - - ui->mTopRightUpperFrameLayout->addWidget(button_changeview); - ui->mTopRightUpperFrameLayout->addWidget(upperScrollArea); - //info - ui->mTopLeftLowerFrameLayout->addWidget(mInfo); - int height = (mInfo->getRowHeight() + 1) * 4; - ui->mTopLeftLowerFrame->setMinimumHeight(height + 2); - ui->mTopHSplitter->setSizes(QList({1000, 1})); - ui->mTopLeftVSplitter->setSizes(QList({1000, 1})); - - mInfo->addColumnAt(0, "", true); - mInfo->setShowHeader(false); - mInfo->setRowCount(4); - mInfo->setCellContent(0, 0, QString()); - mInfo->setCellContent(1, 0, QString()); - mInfo->setCellContent(2, 0, QString()); - mInfo->setCellContent(3, 0, QString()); - //overview - ui->mTopRightLowerFrameLayout->addWidget(mOverview); - - //set up overview - mOverview->addColumnAt(0, "", true); - mOverview->setShowHeader(false); - mOverview->setRowCount(4); - mOverview->setCellContent(0, 0, "hello"); - mOverview->setCellContent(1, 0, "world"); - mOverview->setCellContent(2, 0, "00000000"); - mOverview->setCellContent(3, 0, "here we will list all control flow transfers"); - mOverview->hide(); -} - -TraceWidget::~TraceWidget() -{ - delete ui; -} - -void TraceWidget::traceSelectionChanged(unsigned long long selection) -{ - REGDUMP registers; - TraceFileReader* traceFile; - traceFile = mTraceWidget->getTraceFile(); - if(traceFile != nullptr && traceFile->Progress() == 100) - { - if(selection < traceFile->Length()) - { - registers = traceFile->Registers(selection); - updateInfobox(selection, traceFile, registers); - } - else - memset(®isters, 0, sizeof(registers)); - } - mGeneralRegs->setRegisters(®isters); -} - -void TraceWidget::updateSlot() -{ - mGeneralRegs->setActive(mTraceWidget->isFileOpened()); -} - -TraceBrowser* TraceWidget::getTraceBrowser() -{ - return mTraceWidget; -} - -void TraceWidget::updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers) -{ - int infoline = 0; - Zydis zydis; - unsigned char opcode[16]; - QString line; - int opsize; - traceFile->OpCode(selection, opcode, &opsize); - mInfo->setRowCount(4); - mInfo->setCellContent(0, 0, QString()); - mInfo->setCellContent(1, 0, QString()); - mInfo->setCellContent(2, 0, QString()); - mInfo->setCellContent(3, 0, QString()); - auto resolveRegValue = [registers](ZydisRegister regname) - { - switch(regname) - { -#ifdef _WIN64 - case ZYDIS_REGISTER_RAX: - return registers.regcontext.cax; - case ZYDIS_REGISTER_RCX: - return registers.regcontext.ccx; - case ZYDIS_REGISTER_RDX: - return registers.regcontext.cdx; - case ZYDIS_REGISTER_RBX: - return registers.regcontext.cbx; - case ZYDIS_REGISTER_RSP: - return registers.regcontext.csp; - case ZYDIS_REGISTER_RBP: - return registers.regcontext.cbp; - case ZYDIS_REGISTER_RSI: - return registers.regcontext.csi; - case ZYDIS_REGISTER_RDI: - return registers.regcontext.cdi; - case ZYDIS_REGISTER_R8: - return registers.regcontext.r8; - case ZYDIS_REGISTER_R9: - return registers.regcontext.r9; - case ZYDIS_REGISTER_R10: - return registers.regcontext.r10; - case ZYDIS_REGISTER_R11: - return registers.regcontext.r11; - case ZYDIS_REGISTER_R12: - return registers.regcontext.r12; - case ZYDIS_REGISTER_R13: - return registers.regcontext.r13; - case ZYDIS_REGISTER_R14: - return registers.regcontext.r14; - case ZYDIS_REGISTER_R15: - return registers.regcontext.r15; - case ZYDIS_REGISTER_R8D: - return registers.regcontext.r8 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R9D: - return registers.regcontext.r9 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R10D: - return registers.regcontext.r10 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R11D: - return registers.regcontext.r11 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R12D: - return registers.regcontext.r12 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R13D: - return registers.regcontext.r13 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R15D: - return registers.regcontext.r15 & 0xFFFFFFFF; - case ZYDIS_REGISTER_R8W: - return registers.regcontext.r8 & 0xFFFF; - case ZYDIS_REGISTER_R9W: - return registers.regcontext.r9 & 0xFFFF; - case ZYDIS_REGISTER_R10W: - return registers.regcontext.r10 & 0xFFFF; - case ZYDIS_REGISTER_R11W: - return registers.regcontext.r11 & 0xFFFF; - case ZYDIS_REGISTER_R12W: - return registers.regcontext.r12 & 0xFFFF; - case ZYDIS_REGISTER_R13W: - return registers.regcontext.r13 & 0xFFFF; - case ZYDIS_REGISTER_R15W: - return registers.regcontext.r15 & 0xFFFF; - case ZYDIS_REGISTER_R8B: - return registers.regcontext.r8 & 0xFF; - case ZYDIS_REGISTER_R9B: - return registers.regcontext.r9 & 0xFF; - case ZYDIS_REGISTER_R10B: - return registers.regcontext.r10 & 0xFF; - case ZYDIS_REGISTER_R11B: - return registers.regcontext.r11 & 0xFF; - case ZYDIS_REGISTER_R12B: - return registers.regcontext.r12 & 0xFF; - case ZYDIS_REGISTER_R13B: - return registers.regcontext.r13 & 0xFF; - case ZYDIS_REGISTER_R15B: - return registers.regcontext.r15 & 0xFF; -#endif //_WIN64 - case ZYDIS_REGISTER_EAX: - return registers.regcontext.cax & 0xFFFFFFFF; - case ZYDIS_REGISTER_ECX: - return registers.regcontext.ccx & 0xFFFFFFFF; - case ZYDIS_REGISTER_EDX: - return registers.regcontext.cdx & 0xFFFFFFFF; - case ZYDIS_REGISTER_EBX: - return registers.regcontext.cbx & 0xFFFFFFFF; - case ZYDIS_REGISTER_ESP: - return registers.regcontext.csp & 0xFFFFFFFF; - case ZYDIS_REGISTER_EBP: - return registers.regcontext.cbp & 0xFFFFFFFF; - case ZYDIS_REGISTER_ESI: - return registers.regcontext.csi & 0xFFFFFFFF; - case ZYDIS_REGISTER_EDI: - return registers.regcontext.cdi & 0xFFFFFFFF; - case ZYDIS_REGISTER_AX: - return registers.regcontext.cax & 0xFFFF; - case ZYDIS_REGISTER_CX: - return registers.regcontext.ccx & 0xFFFF; - case ZYDIS_REGISTER_DX: - return registers.regcontext.cdx & 0xFFFF; - case ZYDIS_REGISTER_BX: - return registers.regcontext.cbx & 0xFFFF; - case ZYDIS_REGISTER_SP: - return registers.regcontext.csp & 0xFFFF; - case ZYDIS_REGISTER_BP: - return registers.regcontext.cbp & 0xFFFF; - case ZYDIS_REGISTER_SI: - return registers.regcontext.csi & 0xFFFF; - case ZYDIS_REGISTER_DI: - return registers.regcontext.cdi & 0xFFFF; - case ZYDIS_REGISTER_AL: - return registers.regcontext.cax & 0xFF; - case ZYDIS_REGISTER_CL: - return registers.regcontext.ccx & 0xFF; - case ZYDIS_REGISTER_DL: - return registers.regcontext.cdx & 0xFF; - case ZYDIS_REGISTER_BL: - return registers.regcontext.cbx & 0xFF; - case ZYDIS_REGISTER_AH: - return (registers.regcontext.cax & 0xFF00) >> 8; - case ZYDIS_REGISTER_CH: - return (registers.regcontext.ccx & 0xFF00) >> 8; - case ZYDIS_REGISTER_DH: - return (registers.regcontext.cdx & 0xFF00) >> 8; - case ZYDIS_REGISTER_BH: - return (registers.regcontext.cbx & 0xFF00) >> 8; - default: - return static_cast(0); - } - }; - if(zydis.Disassemble(registers.regcontext.cip, opcode, opsize)) - { - int opindex; - //Jumps - if(zydis.IsBranchType(Zydis::BTCondJmp)) - { - if(zydis.IsBranchGoingToExecute(registers.regcontext.eflags, registers.regcontext.ccx)) - { - line = tr("Jump is taken"); - } - else - { - line = tr("Jump is not taken"); - } - mInfo->setCellContent(infoline, 0, line); - infoline++; - } - //Operands - for(opindex = 0; opindex < zydis.OpCount(); opindex++) - { - line.clear(); - size_t value = zydis.ResolveOpValue(opindex, resolveRegValue); - if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_MEMORY) - { - const char* memsize = zydis.MemSizeName(zydis[opindex].size / 8); - if(memsize != nullptr) - { - line += memsize; - } - line += " ptr "; - line += zydis.RegName(zydis[opindex].mem.segment); - line += ":["; - line += ToPtrString(value); - line += "]"; - mInfo->setCellContent(infoline, 0, line); - infoline++; - } - else if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_REGISTER) - { - line += zydis.RegName(zydis[opindex].reg.value); - line += " = "; - line += ToPtrString(value); - mInfo->setCellContent(infoline, 0, line); - infoline++; - } - } - } - mInfo->reloadData(); -} +#include "TraceWidget.h" +#include "ui_TraceWidget.h" +#include "TraceBrowser.h" +#include "TraceFileReader.h" +#include "TraceRegisters.h" +#include "StdTable.h" + +TraceWidget::TraceWidget(QWidget* parent) : + QWidget(parent), + ui(new Ui::TraceWidget) +{ + ui->setupUi(this); + + mTraceWidget = new TraceBrowser(this); + mOverview = new StdTable(this); + mInfo = new StdTable(this); + mGeneralRegs = new TraceRegisters(this); + //disasm + ui->mTopLeftUpperRightFrameLayout->addWidget(mTraceWidget); + //registers + mGeneralRegs->setFixedWidth(1000); + mGeneralRegs->ShowFPU(true); + + QScrollArea* upperScrollArea = new QScrollArea(this); + upperScrollArea->setFrameShape(QFrame::NoFrame); + upperScrollArea->setWidget(mGeneralRegs); + + upperScrollArea->horizontalScrollBar()->setStyleSheet(ConfigHScrollBarStyle()); + upperScrollArea->verticalScrollBar()->setStyleSheet(ConfigVScrollBarStyle()); + + QPushButton* button_changeview = new QPushButton("", this); + button_changeview->setStyleSheet("Text-align:left;padding: 4px;padding-left: 10px;"); + connect(button_changeview, SIGNAL(clicked()), mGeneralRegs, SLOT(onChangeFPUViewAction())); + connect(mTraceWidget, SIGNAL(selectionChanged(unsigned long long)), this, SLOT(traceSelectionChanged(unsigned long long))); + connect(Bridge::getBridge(), SIGNAL(updateTraceBrowser()), this, SLOT(updateSlot())); + + mGeneralRegs->SetChangeButton(button_changeview); + + ui->mTopRightUpperFrameLayout->addWidget(button_changeview); + ui->mTopRightUpperFrameLayout->addWidget(upperScrollArea); + //info + ui->mTopLeftLowerFrameLayout->addWidget(mInfo); + int height = (mInfo->getRowHeight() + 1) * 4; + ui->mTopLeftLowerFrame->setMinimumHeight(height + 2); + ui->mTopHSplitter->setSizes(QList({1000, 1})); + ui->mTopLeftVSplitter->setSizes(QList({1000, 1})); + + mInfo->addColumnAt(0, "", true); + mInfo->setShowHeader(false); + mInfo->setRowCount(4); + mInfo->setCellContent(0, 0, QString()); + mInfo->setCellContent(1, 0, QString()); + mInfo->setCellContent(2, 0, QString()); + mInfo->setCellContent(3, 0, QString()); + //overview + ui->mTopRightLowerFrameLayout->addWidget(mOverview); + + //set up overview + mOverview->addColumnAt(0, "", true); + mOverview->setShowHeader(false); + mOverview->setRowCount(4); + mOverview->setCellContent(0, 0, "hello"); + mOverview->setCellContent(1, 0, "world"); + mOverview->setCellContent(2, 0, "00000000"); + mOverview->setCellContent(3, 0, "here we will list all control flow transfers"); + mOverview->hide(); +} + +TraceWidget::~TraceWidget() +{ + delete ui; +} + +void TraceWidget::traceSelectionChanged(unsigned long long selection) +{ + REGDUMP registers; + TraceFileReader* traceFile; + traceFile = mTraceWidget->getTraceFile(); + if(traceFile != nullptr && traceFile->Progress() == 100) + { + if(selection < traceFile->Length()) + { + registers = traceFile->Registers(selection); + updateInfobox(selection, traceFile, registers); + } + else + memset(®isters, 0, sizeof(registers)); + } + mGeneralRegs->setRegisters(®isters); +} + +void TraceWidget::updateSlot() +{ + mGeneralRegs->setActive(mTraceWidget->isFileOpened()); +} + +TraceBrowser* TraceWidget::getTraceBrowser() +{ + return mTraceWidget; +} + +void TraceWidget::updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers) +{ + int infoline = 0; + Zydis zydis; + unsigned char opcode[16]; + QString line; + int opsize; + traceFile->OpCode(selection, opcode, &opsize); + mInfo->setRowCount(4); + mInfo->setCellContent(0, 0, QString()); + mInfo->setCellContent(1, 0, QString()); + mInfo->setCellContent(2, 0, QString()); + mInfo->setCellContent(3, 0, QString()); + auto resolveRegValue = [registers](ZydisRegister regname) + { + switch(regname) + { +#ifdef _WIN64 + case ZYDIS_REGISTER_RAX: + return registers.regcontext.cax; + case ZYDIS_REGISTER_RCX: + return registers.regcontext.ccx; + case ZYDIS_REGISTER_RDX: + return registers.regcontext.cdx; + case ZYDIS_REGISTER_RBX: + return registers.regcontext.cbx; + case ZYDIS_REGISTER_RSP: + return registers.regcontext.csp; + case ZYDIS_REGISTER_RBP: + return registers.regcontext.cbp; + case ZYDIS_REGISTER_RSI: + return registers.regcontext.csi; + case ZYDIS_REGISTER_RDI: + return registers.regcontext.cdi; + case ZYDIS_REGISTER_R8: + return registers.regcontext.r8; + case ZYDIS_REGISTER_R9: + return registers.regcontext.r9; + case ZYDIS_REGISTER_R10: + return registers.regcontext.r10; + case ZYDIS_REGISTER_R11: + return registers.regcontext.r11; + case ZYDIS_REGISTER_R12: + return registers.regcontext.r12; + case ZYDIS_REGISTER_R13: + return registers.regcontext.r13; + case ZYDIS_REGISTER_R14: + return registers.regcontext.r14; + case ZYDIS_REGISTER_R15: + return registers.regcontext.r15; + case ZYDIS_REGISTER_R8D: + return registers.regcontext.r8 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R9D: + return registers.regcontext.r9 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R10D: + return registers.regcontext.r10 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R11D: + return registers.regcontext.r11 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R12D: + return registers.regcontext.r12 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R13D: + return registers.regcontext.r13 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R15D: + return registers.regcontext.r15 & 0xFFFFFFFF; + case ZYDIS_REGISTER_R8W: + return registers.regcontext.r8 & 0xFFFF; + case ZYDIS_REGISTER_R9W: + return registers.regcontext.r9 & 0xFFFF; + case ZYDIS_REGISTER_R10W: + return registers.regcontext.r10 & 0xFFFF; + case ZYDIS_REGISTER_R11W: + return registers.regcontext.r11 & 0xFFFF; + case ZYDIS_REGISTER_R12W: + return registers.regcontext.r12 & 0xFFFF; + case ZYDIS_REGISTER_R13W: + return registers.regcontext.r13 & 0xFFFF; + case ZYDIS_REGISTER_R15W: + return registers.regcontext.r15 & 0xFFFF; + case ZYDIS_REGISTER_R8B: + return registers.regcontext.r8 & 0xFF; + case ZYDIS_REGISTER_R9B: + return registers.regcontext.r9 & 0xFF; + case ZYDIS_REGISTER_R10B: + return registers.regcontext.r10 & 0xFF; + case ZYDIS_REGISTER_R11B: + return registers.regcontext.r11 & 0xFF; + case ZYDIS_REGISTER_R12B: + return registers.regcontext.r12 & 0xFF; + case ZYDIS_REGISTER_R13B: + return registers.regcontext.r13 & 0xFF; + case ZYDIS_REGISTER_R15B: + return registers.regcontext.r15 & 0xFF; +#endif //_WIN64 + case ZYDIS_REGISTER_EAX: + return registers.regcontext.cax & 0xFFFFFFFF; + case ZYDIS_REGISTER_ECX: + return registers.regcontext.ccx & 0xFFFFFFFF; + case ZYDIS_REGISTER_EDX: + return registers.regcontext.cdx & 0xFFFFFFFF; + case ZYDIS_REGISTER_EBX: + return registers.regcontext.cbx & 0xFFFFFFFF; + case ZYDIS_REGISTER_ESP: + return registers.regcontext.csp & 0xFFFFFFFF; + case ZYDIS_REGISTER_EBP: + return registers.regcontext.cbp & 0xFFFFFFFF; + case ZYDIS_REGISTER_ESI: + return registers.regcontext.csi & 0xFFFFFFFF; + case ZYDIS_REGISTER_EDI: + return registers.regcontext.cdi & 0xFFFFFFFF; + case ZYDIS_REGISTER_AX: + return registers.regcontext.cax & 0xFFFF; + case ZYDIS_REGISTER_CX: + return registers.regcontext.ccx & 0xFFFF; + case ZYDIS_REGISTER_DX: + return registers.regcontext.cdx & 0xFFFF; + case ZYDIS_REGISTER_BX: + return registers.regcontext.cbx & 0xFFFF; + case ZYDIS_REGISTER_SP: + return registers.regcontext.csp & 0xFFFF; + case ZYDIS_REGISTER_BP: + return registers.regcontext.cbp & 0xFFFF; + case ZYDIS_REGISTER_SI: + return registers.regcontext.csi & 0xFFFF; + case ZYDIS_REGISTER_DI: + return registers.regcontext.cdi & 0xFFFF; + case ZYDIS_REGISTER_AL: + return registers.regcontext.cax & 0xFF; + case ZYDIS_REGISTER_CL: + return registers.regcontext.ccx & 0xFF; + case ZYDIS_REGISTER_DL: + return registers.regcontext.cdx & 0xFF; + case ZYDIS_REGISTER_BL: + return registers.regcontext.cbx & 0xFF; + case ZYDIS_REGISTER_AH: + return (registers.regcontext.cax & 0xFF00) >> 8; + case ZYDIS_REGISTER_CH: + return (registers.regcontext.ccx & 0xFF00) >> 8; + case ZYDIS_REGISTER_DH: + return (registers.regcontext.cdx & 0xFF00) >> 8; + case ZYDIS_REGISTER_BH: + return (registers.regcontext.cbx & 0xFF00) >> 8; + default: + return static_cast(0); + } + }; + if(zydis.Disassemble(registers.regcontext.cip, opcode, opsize)) + { + int opindex; + //Jumps + if(zydis.IsBranchType(Zydis::BTCondJmp)) + { + if(zydis.IsBranchGoingToExecute(registers.regcontext.eflags, registers.regcontext.ccx)) + { + line = tr("Jump is taken"); + } + else + { + line = tr("Jump is not taken"); + } + mInfo->setCellContent(infoline, 0, line); + infoline++; + } + //Operands + for(opindex = 0; opindex < zydis.OpCount(); opindex++) + { + line.clear(); + size_t value = zydis.ResolveOpValue(opindex, resolveRegValue); + if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_MEMORY) + { + const char* memsize = zydis.MemSizeName(zydis[opindex].size / 8); + if(memsize != nullptr) + { + line += memsize; + } + line += " ptr "; + line += zydis.RegName(zydis[opindex].mem.segment); + line += ":["; + line += ToPtrString(value); + line += "]"; + mInfo->setCellContent(infoline, 0, line); + infoline++; + } + else if(zydis[opindex].type == ZYDIS_OPERAND_TYPE_REGISTER) + { + line += zydis.RegName(zydis[opindex].reg.value); + line += " = "; + line += ToPtrString(value); + mInfo->setCellContent(infoline, 0, line); + infoline++; + } + } + } + mInfo->reloadData(); +} diff --git a/src/gui/Src/Tracer/TraceWidget.h b/src/gui/Src/Tracer/TraceWidget.h index c6bec9cb..c6263c79 100644 --- a/src/gui/Src/Tracer/TraceWidget.h +++ b/src/gui/Src/Tracer/TraceWidget.h @@ -1,45 +1,45 @@ -#ifndef TRACEWIDGET_H -#define TRACEWIDGET_H - -#include -#include "Bridge.h" - -class QVBoxLayout; -class CPUWidget; -class TraceRegisters; -class TraceBrowser; -class TraceFileReader; -class StdTable; - -namespace Ui -{ - class TraceWidget; -} - -class TraceWidget : public QWidget -{ - Q_OBJECT - -public: - explicit TraceWidget(QWidget* parent); - ~TraceWidget(); - - TraceBrowser* getTraceBrowser(); - -protected slots: - void traceSelectionChanged(unsigned long long selection); - void updateSlot(); - -protected: - TraceBrowser* mTraceWidget; - TraceRegisters* mGeneralRegs; - StdTable* mInfo; - StdTable* mOverview; - - void updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers); - -private: - Ui::TraceWidget* ui; -}; - -#endif // TRACEWIDGET_H +#ifndef TRACEWIDGET_H +#define TRACEWIDGET_H + +#include +#include "Bridge.h" + +class QVBoxLayout; +class CPUWidget; +class TraceRegisters; +class TraceBrowser; +class TraceFileReader; +class StdTable; + +namespace Ui +{ + class TraceWidget; +} + +class TraceWidget : public QWidget +{ + Q_OBJECT + +public: + explicit TraceWidget(QWidget* parent); + ~TraceWidget(); + + TraceBrowser* getTraceBrowser(); + +protected slots: + void traceSelectionChanged(unsigned long long selection); + void updateSlot(); + +protected: + TraceBrowser* mTraceWidget; + TraceRegisters* mGeneralRegs; + StdTable* mInfo; + StdTable* mOverview; + + void updateInfobox(unsigned long long selection, TraceFileReader* traceFile, const REGDUMP & registers); + +private: + Ui::TraceWidget* ui; +}; + +#endif // TRACEWIDGET_H