X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fgui%2FMainwindow.cxx;h=7b207faf9504281dfa3e9b7ff2ef663ed4ddfbd6;hp=f98cd60a226888da2f780af6c3dc924cdde6a45b;hb=231dae075375e7d57982f5107b86294fbe726b33;hpb=c100e37a2dfbe6dd221e867559b473a4a5097570 diff --git a/src/gui/Mainwindow.cxx b/src/gui/Mainwindow.cxx index f98cd60..7b207fa 100644 --- a/src/gui/Mainwindow.cxx +++ b/src/gui/Mainwindow.cxx @@ -1,6 +1,7 @@ #include "Mainwindow.hxx" #include "qt.hxx" #include "disassembler/llvm/LLVMDisassembler.hxx" + #include "widgets/CFGScene.hxx" #include @@ -9,75 +10,105 @@ #include -Mainwindow::Mainwindow(const std::string& filename) -{ - openAction = new QAction(tr("&Open"), this); - // saveAction = new QAction(tr("&Save"), this); - exitAction = new QAction(tr("E&xit"), this); - - connect(openAction, SIGNAL(triggered()), this, SLOT(open())); - // connect(saveAction, SIGNAL(triggered()), this, SLOT(save())); - connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit())); - - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(openAction); - // fileMenu->addAction(saveAction); - fileMenu->addSeparator(); - fileMenu->addAction(exitAction); - - scripting = new ScriptingDock(tr("Scripting"), this); - scripting->setAllowedAreas(Qt::BottomDockWidgetArea); - addDockWidget(Qt::BottomDockWidgetArea, scripting); - - listWidget = new QListWidget(); - stackedWidget = new QStackedWidget(); - dockWidget = new QDockWidget(tr("Functions"), this); - dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | - Qt::RightDockWidgetArea); - dockWidget->setWidget(listWidget); - addDockWidget(Qt::LeftDockWidgetArea, dockWidget); - setCentralWidget(stackedWidget); - - connect(listWidget, SIGNAL(currentRowChanged(int)), - stackedWidget, SLOT(setCurrentIndex(int))); - - setWindowTitle(tr("FRIDA")); - - openBinary(filename); +namespace { + BasicBlockWidget * + local__add_basic_block(BasicBlock * block, Disassembler * dis, + std::map& known_blocks, + CFGScene * scene, uint64_t starty, uint64_t startx); +} + +Mainwindow::Mainwindow(InformationManager* mgr) + : manager(mgr) { + openAction = new QAction(tr("&Open"), this); + // saveAction = new QAction(tr("&Save"), this); + exitAction = new QAction(tr("E&xit"), this); + + connect(openAction, SIGNAL(triggered()), this, SLOT(open())); + // connect(saveAction, SIGNAL(triggered()), this, SLOT(save())); + connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + + fileMenu = menuBar()->addMenu(tr("&File")); + fileMenu->addAction(openAction); + // fileMenu->addAction(saveAction); + fileMenu->addSeparator(); + fileMenu->addAction(exitAction); + + scripting = new ScriptingDock(tr("Scripting"), this); + scripting->setAllowedAreas(Qt::BottomDockWidgetArea); + addDockWidget(Qt::BottomDockWidgetArea, scripting); + + listWidget = new QListWidget(); + stackedWidget = new QStackedWidget(); + dockWidget = new QDockWidget(tr("Functions"), this); + dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea); + dockWidget->setWidget(listWidget); + addDockWidget(Qt::LeftDockWidgetArea, dockWidget); + setCentralWidget(stackedWidget); + + connect(listWidget, SIGNAL(currentRowChanged(int)), + stackedWidget, SLOT(setCurrentIndex(int))); + + setWindowTitle(tr("FRIDA")); + + mgr->connect_new_function_signal([&] (Function* fun) {addFunction(fun);}); } void Mainwindow::quit() { - QMessageBox messageBox; - messageBox.setWindowTitle(tr("Notepad")); - messageBox.setText(tr("Do you really want to quit?")); - messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - messageBox.setDefaultButton(QMessageBox::No); - if (messageBox.exec() == QMessageBox::Yes) - qApp->quit(); + QMessageBox messageBox; + messageBox.setWindowTitle(tr("Notepad")); + messageBox.setText(tr("Do you really want to quit?")); + messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + messageBox.setDefaultButton(QMessageBox::No); + if (messageBox.exec() == QMessageBox::Yes) + qApp->quit(); } void Mainwindow::open() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", - tr("Binaries (*)")); + QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", + tr("Binaries (*)")); - openBinary(fileName.toStdString()); + manager->reset(fileName.toStdString()); } -void Mainwindow::openBinary(const std::string& filename) { - if (filename != "") { - disassembler.reset(new LLVMDisassembler(filename)); - disassembler->forEachFunction([&](uint64_t address, Function* fun) { - populateSymbolInformation(fun); - }); - } +void Mainwindow::addFunction(Function* fun) { + if (functions.find(fun) != functions.end()) + return; + + functions.insert(fun); + + QTabWidget * w = new QTabWidget(); + + // CFG + CFGScene * scene = new CFGScene; + + Disassembler * dis = manager->getDisassembler(); + std::cerr << dis << std::endl; + + BasicBlock * block = dis->getBasicBlock(fun->getStartAddress()); + + local__add_basic_block(block, manager->getDisassembler(), blocks, scene, block->getStartAddress(), 100); + + QGraphicsView * view = new QGraphicsView(scene); + w->addTab(view, "CFG"); + + // Listing + QTableWidget * t = new QTableWidget(); + t->setColumnCount(3); + t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + + w->addTab(t, "Listing"); + + listWidget->addItem(fun->getName().c_str()); + stackedWidget->addWidget(w); } namespace { BasicBlockWidget * local__add_basic_block(BasicBlock * block, Disassembler * dis, - std::map& known_blocks, - CFGScene * scene, uint64_t starty, uint64_t startx) { + std::map& known_blocks, + CFGScene * scene, uint64_t starty, uint64_t startx) { decltype(known_blocks.begin()) old; if ((old = known_blocks.find(block->getStartAddress())) != known_blocks.end()) @@ -124,27 +155,3 @@ namespace { return widget; } } - -void Mainwindow::populateSymbolInformation(Function* fun) { - QTabWidget * w = new QTabWidget(); - - // CFG - CFGScene * scene = new CFGScene; - - BasicBlock * block = disassembler->getBasicBlock(fun->getStartAddress()); - - local__add_basic_block(block, disassembler.get(), blocks, scene, block->getStartAddress(), 100); - - QGraphicsView * view = new QGraphicsView(scene); - w->addTab(view, "CFG"); - - // Listing - QTableWidget * t = new QTableWidget(); - t->setColumnCount(3); - t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - - w->addTab(t, "Listing"); - - listWidget->addItem(fun->getName().c_str()); - stackedWidget->addWidget(w); -}