diff --git a/src/Cutter.pro b/src/Cutter.pro index 7707e927..e5fff551 100644 --- a/src/Cutter.pro +++ b/src/Cutter.pro @@ -199,7 +199,8 @@ SOURCES += \ dialogs/SetToDataDialog.cpp \ dialogs/SetFunctionVarTypes.cpp \ widgets/ColorSchemePrefWidget.cpp \ - common/ColorSchemeFileSaver.cpp + common/ColorSchemeFileSaver.cpp \ + dialogs/EditFunctionDialog.cpp HEADERS += \ Cutter.h \ @@ -299,7 +300,8 @@ HEADERS += \ common/InitialOptions.h \ dialogs/SetFunctionVarTypes.h \ common/ColorSchemeFileSaver.h \ - widgets/ColorSchemePrefWidget.h + widgets/ColorSchemePrefWidget.h \ + dialogs/EditFunctionDialog.h FORMS += \ dialogs/AboutDialog.ui \ @@ -311,6 +313,7 @@ FORMS += \ dialogs/XrefsDialog.ui \ dialogs/NewfileDialog.ui \ dialogs/InitialOptionsDialog.ui \ + dialogs/EditFunctionDialog.ui \ MainWindow.ui \ widgets/CommentsWidget.ui \ widgets/ConsoleWidget.ui \ diff --git a/src/dialogs/EditFunctionDialog.cpp b/src/dialogs/EditFunctionDialog.cpp new file mode 100644 index 00000000..4c1652da --- /dev/null +++ b/src/dialogs/EditFunctionDialog.cpp @@ -0,0 +1,77 @@ +#include "EditFunctionDialog.h" +#include "ui_EditFunctionDialog.h" + +EditFunctionDialog::EditFunctionDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::EditFunctionDialog) +{ + ui->setupUi(this); + setWindowFlags(windowFlags() & (~Qt::WindowContextHelpButtonHint)); +} + +EditFunctionDialog::~EditFunctionDialog() {} + +QString EditFunctionDialog::getNameText() +{ + QString ret = ui->nameLineEdit->text(); + return ret; +} + +void EditFunctionDialog::setNameText(const QString &name) +{ + ui->nameLineEdit->setText(name); +} + +QString EditFunctionDialog::getStartAddrText() +{ + QString ret = ui->startLineEdit->text(); + return ret; +} + +void EditFunctionDialog::setStartAddrText(const QString &startAddr) +{ + ui->startLineEdit->setText(startAddr); +} + +QString EditFunctionDialog::getEndAddrText() +{ + QString ret = ui->endLineEdit->text(); + return ret; +} + +void EditFunctionDialog::setEndAddrText(const QString &endAddr) +{ + ui->endLineEdit->setText(endAddr); +} + +QString EditFunctionDialog::getStackSizeText() +{ + QString ret = ui->stackSizeLineEdit->text(); + return ret; +} + +void EditFunctionDialog::setStackSizeText(const QString &stackSize) +{ + ui->stackSizeLineEdit->setText(stackSize); +} + +void EditFunctionDialog::setCallConList(const QStringList callConList) { + ui->callConComboBox->addItems(callConList); +} + +void EditFunctionDialog::setCallConSelected(const QString selected) { + ui->callConComboBox->setCurrentText(selected); +} + +QString EditFunctionDialog::getCallConSelected() { + return ui->callConComboBox->currentText(); +} + +void EditFunctionDialog::on_buttonBox_accepted() +{ +} + +void EditFunctionDialog::on_buttonBox_rejected() +{ + close(); +} diff --git a/src/dialogs/EditFunctionDialog.h b/src/dialogs/EditFunctionDialog.h new file mode 100644 index 00000000..9e6ca651 --- /dev/null +++ b/src/dialogs/EditFunctionDialog.h @@ -0,0 +1,39 @@ +#ifndef EDITFUNCTIONDIALOG_H +#define EDITFUNCTIONDIALOG_H + +#include <QDialog> +#include <memory> + +namespace Ui { +class EditFunctionDialog; +} + +class EditFunctionDialog : public QDialog +{ + Q_OBJECT + +public: + explicit EditFunctionDialog(QWidget *parent = nullptr); + ~EditFunctionDialog(); + QString getNameText(); + void setNameText(const QString &name); + QString getStartAddrText(); + void setStartAddrText(const QString &startAddr); + QString getEndAddrText(); + void setEndAddrText(const QString &endAddr); + QString getStackSizeText(); + void setStackSizeText(const QString &stackSize); + void setCallConList(const QStringList callConList); + void setCallConSelected(const QString selected); + QString getCallConSelected(); + +private slots: + void on_buttonBox_accepted(); + + void on_buttonBox_rejected(); + +private: + std::unique_ptr<Ui::EditFunctionDialog> ui; +}; + +#endif // EDITFUNCTIONDIALOG_H diff --git a/src/dialogs/EditFunctionDialog.ui b/src/dialogs/EditFunctionDialog.ui new file mode 100644 index 00000000..0a363d60 --- /dev/null +++ b/src/dialogs/EditFunctionDialog.ui @@ -0,0 +1,139 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>EditFunctionDialog</class> + <widget class="QDialog" name="EditFunctionDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>318</width> + <height>192</height> + </rect> + </property> + <property name="windowTitle"> + <string>Edit Function</string> + </property> + <property name="toolTipDuration"> + <number>0</number> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>2</number> + </property> + <property name="leftMargin"> + <number>2</number> + </property> + <property name="topMargin"> + <number>5</number> + </property> + <property name="rightMargin"> + <number>2</number> + </property> + <property name="bottomMargin"> + <number>2</number> + </property> + <item> + <layout class="QFormLayout" name="formLayout"> + <property name="topMargin"> + <number>0</number> + </property> + <item row="2" column="0"> + <widget class="QLabel" name="nameLabel"> + <property name="text"> + <string>Name of function</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="nameLineEdit"/> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="startLabel"> + <property name="text"> + <string>Start address</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="startLineEdit"/> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="endLabel"> + <property name="text"> + <string>End address</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QLineEdit" name="endLineEdit"/> + </item> + <item row="6" column="0"> + <widget class="QLabel" name="stackSizeLabel"> + <property name="text"> + <string>Stack size</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <widget class="QLineEdit" name="stackSizeLineEdit"/> + </item> + <item row="7" column="0"> + <widget class="QLabel" name="callConLabel"> + <property name="text"> + <string>Calling convention</string> + </property> + </widget> + </item> + <item row="7" column="1"> + <widget class="QComboBox" name="callConComboBox"/> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>EditFunctionDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>158</x> + <y>142</y> + </hint> + <hint type="destinationlabel"> + <x>158</x> + <y>78</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>EditFunctionDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>158</x> + <y>142</y> + </hint> + <hint type="destinationlabel"> + <x>158</x> + <y>78</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/menus/DisassemblyContextMenu.cpp b/src/menus/DisassemblyContextMenu.cpp index ab53c839..bcf505f4 100644 --- a/src/menus/DisassemblyContextMenu.cpp +++ b/src/menus/DisassemblyContextMenu.cpp @@ -7,6 +7,7 @@ #include "dialogs/XrefsDialog.h" #include "dialogs/SetFunctionVarTypes.h" #include "dialogs/SetToDataDialog.h" +#include "dialogs/EditFunctionDialog.h" #include <QtCore> #include <QShortcut> #include <QJsonArray> @@ -38,6 +39,10 @@ DisassemblyContextMenu::DisassemblyContextMenu(QWidget *parent) SLOT(on_actionRename_triggered()), getRenameSequence()); addAction(&actionRename); + initAction(&actionEditFunction, tr("Edit function"), + SLOT(on_actionEditFunction_triggered())); + addAction(&actionEditFunction); + initAction(&actionRenameUsedHere, tr("Rename Flag/Fcn/Var Used Here"), SLOT(on_actionRenameUsedHere_triggered()), getRenameUsedHereSequence()); addAction(&actionRenameUsedHere); @@ -60,6 +65,7 @@ DisassemblyContextMenu::DisassemblyContextMenu(QWidget *parent) SLOT(on_actionAnalyzeFunction_triggered())); addAction(&actionAnalyzeFunction); + addSetBaseMenu(); addSetBitsMenu(); @@ -261,6 +267,8 @@ void DisassemblyContextMenu::aboutToShowSlot() actionAnalyzeFunction.setVisible(false); actionRename.setVisible(true); actionRename.setText(tr("Rename function \"%1\"").arg(fcn->name)); + actionEditFunction.setVisible(true); + actionEditFunction.setText(tr("Edit function \"%1\"").arg(fcn->name)); } else if (f) { actionRename.setVisible(true); actionRename.setText(tr("Rename flag \"%1\"").arg(f->name)); @@ -681,6 +689,45 @@ void DisassemblyContextMenu::on_actionDeleteFunction_triggered() Core()->delFunction(offset); } +void DisassemblyContextMenu::on_actionEditFunction_triggered() +{ + RCore *core = Core()->core(); + EditFunctionDialog *dialog = new EditFunctionDialog(this); + RAnalFunction *fcn = r_anal_get_fcn_at (core->anal, offset, R_ANAL_FCN_TYPE_NULL); + + dialog->setWindowTitle(tr("Edit function %1").arg(fcn->name)); + dialog->setNameText(fcn->name); + + QString startAddrText = "0x" + QString::number(fcn->addr, 16); + dialog->setStartAddrText(startAddrText); + + QString endAddrText = "0x" + QString::number(fcn->addr + fcn->_size, 16); + dialog->setEndAddrText(endAddrText); + + QString stackSizeText; + stackSizeText.sprintf("%d", fcn->stack); + dialog->setStackSizeText(stackSizeText); + + QStringList callConList = Core()->cmd("afcl").split("\n"); + callConList.removeLast(); + dialog->setCallConList(callConList); + dialog->setCallConSelected(fcn->cc); + + + if (dialog->exec()) { + QString new_name = dialog->getNameText(); + Core()->renameFunction(fcn->name, new_name); + QString new_start_addr = dialog->getStartAddrText(); + fcn->addr = Core()->math(new_start_addr); + QString new_end_addr = dialog->getEndAddrText(); + Core()->cmd("afu " + new_end_addr); + QString new_stack_size = dialog->getStackSizeText(); + fcn->stack = int(Core()->math(new_stack_size)); + Core()->cmd("afc " + dialog->getCallConSelected()); + emit Core()->functionsChanged(); + } +} + void DisassemblyContextMenu::setBase(QString base) { Core()->setImmediateBase(base, offset); diff --git a/src/menus/DisassemblyContextMenu.h b/src/menus/DisassemblyContextMenu.h index f927b749..360d28a0 100644 --- a/src/menus/DisassemblyContextMenu.h +++ b/src/menus/DisassemblyContextMenu.h @@ -23,6 +23,7 @@ public slots: private slots: void aboutToShowSlot(); + void on_actionEditFunction_triggered(); void on_actionEditInstruction_triggered(); void on_actionNopInstruction_triggered(); void on_actionJmpReverse_triggered(); @@ -86,6 +87,7 @@ private: QAction actionAddComment; QAction actionAddFlag; QAction actionAnalyzeFunction; + QAction actionEditFunction; QAction actionRename; QAction actionRenameUsedHere; QAction actionSetFunctionVarTypes;