From f47656945821610f8086cba59bbe53b30a648810 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 24 Apr 2014 00:49:27 +0200
Subject: [PATCH 001/676] DBG: added pattern finder
DBG: added 'find' command
---
x64_dbg_dbg/instruction.cpp | 43 +++++++++++++++++++
x64_dbg_dbg/instruction.h | 2 +
x64_dbg_dbg/memory.cpp | 83 +++++++++++++++++++++++++++++++++++++
x64_dbg_dbg/memory.h | 14 ++++++-
x64_dbg_dbg/x64_dbg.cpp | 2 +
5 files changed, 143 insertions(+), 1 deletion(-)
diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp
index c7ad2f8d..3704c818 100644
--- a/x64_dbg_dbg/instruction.cpp
+++ b/x64_dbg_dbg/instruction.cpp
@@ -918,3 +918,46 @@ CMDRESULT cbInstrGetstr(int argc, char* argv[])
efree(string, "cbInstrGetstr:string");
return STATUS_CONTINUE;
}
+
+CMDRESULT cbInstrFind(int argc, char* argv[])
+{
+ if(argc<3)
+ {
+ dputs("not enough arguments!");
+ return STATUS_ERROR;
+ }
+ uint addr=0;
+ if(!valfromstring(argv[1], &addr, false))
+ return STATUS_ERROR;
+ char pattern[deflen]="";
+ //remove # from the start and end of the pattern (ODBGScript support)
+ if(argv[2][0]=='#')
+ strcpy(pattern, argv[2]+1);
+ else
+ strcpy(pattern, argv[2]);
+ int len=strlen(pattern);
+ if(pattern[len-1]=='#')
+ pattern[len-1]='\0';
+ uint size=0;
+ uint base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &size);
+ if(!base)
+ {
+ dprintf("invalid memory address "fhex"!\n", addr);
+ return STATUS_ERROR;
+ }
+ unsigned char* data=(unsigned char*)emalloc(size, "cbInstrFind:data");
+ if(!memread(fdProcessInfo->hProcess, (const void*)base, data, size, 0))
+ {
+ efree(data, "cbInstrFind:data");
+ dputs("failed to read memory!");
+ return STATUS_ERROR;
+ }
+ uint start=addr-base;
+ uint foundoffset=memfindpattern(data+start, size-start, pattern);
+ uint result=0;
+ if(foundoffset!=-1)
+ result=addr+foundoffset;
+ varset("$result", result, false);
+ DbgCmdExec("$result");
+ return STATUS_CONTINUE;
+}
diff --git a/x64_dbg_dbg/instruction.h b/x64_dbg_dbg/instruction.h
index e84e6551..888be819 100644
--- a/x64_dbg_dbg/instruction.h
+++ b/x64_dbg_dbg/instruction.h
@@ -50,4 +50,6 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[]);
CMDRESULT cbInstrSetstr(int argc, char* argv[]);
CMDRESULT cbInstrGetstr(int argc, char* argv[]);
+CMDRESULT cbInstrFind(int argc, char* argv[]);
+
#endif // _INSTRUCTIONS_H
diff --git a/x64_dbg_dbg/memory.cpp b/x64_dbg_dbg/memory.cpp
index 62181568..3b9474b0 100644
--- a/x64_dbg_dbg/memory.cpp
+++ b/x64_dbg_dbg/memory.cpp
@@ -98,3 +98,86 @@ void memfree(HANDLE hProcess, uint addr)
{
VirtualFreeEx(hProcess, (void*)addr, 0, MEM_RELEASE);
}
+
+static bool patterntransform(const char* text, std::vector* pattern)
+{
+ if(!text or !pattern)
+ return false;
+ pattern->clear();
+ int len=strlen(text);
+ if(!len)
+ return false;
+ char* newtext=(char*)emalloc(len+2, "transformpattern:newtext");
+ strcpy(newtext, text);
+ if(len%2) //not a multiple of 2
+ {
+ newtext[len]='?';
+ newtext[len+1]='\0';
+ len++;
+ }
+ PATTERNBYTE newByte;
+ for(int i=0,j=0; ipush_back(newByte);
+ }
+ }
+ efree(newtext, "transformpattern:newtext");
+ return true;
+}
+
+static bool patternmatchbyte(unsigned char byte, PATTERNBYTE* pbyte)
+{
+ unsigned char n1=(byte>>4)&0xF;
+ unsigned char n2=byte&0xF;
+ int matched=0;
+ if(pbyte->n[0].all)
+ matched++;
+ else if(pbyte->n[0].n==n1)
+ matched++;
+ if(pbyte->n[1].all)
+ matched++;
+ else if(pbyte->n[1].n==n2)
+ matched++;
+ return (matched==2);
+}
+
+uint memfindpattern(unsigned char* data, uint size, const char* pattern)
+{
+ std::vector searchpattern;
+ if(!patterntransform(pattern, &searchpattern))
+ return -1;
+ int searchpatternsize=searchpattern.size();
+ for(uint i=0,pos=0; i
Date: Thu, 24 Apr 2014 17:24:24 -0400
Subject: [PATCH 002/676] GUI: Add detachable tabs
---
x64_dbg_gui/Project/DebuggerX64.pro | 8 +-
x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 4 +-
x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 152 +++++++++++++++++++++
x64_dbg_gui/Project/Src/Gui/tabbar.h | 43 ++++++
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 105 ++++++++++++++
x64_dbg_gui/Project/Src/Gui/tabwidget.h | 63 +++++++++
6 files changed, 371 insertions(+), 4 deletions(-)
create mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.cpp
create mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.h
create mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
create mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.h
diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro
index 94e48562..125b7e6a 100644
--- a/x64_dbg_gui/Project/DebuggerX64.pro
+++ b/x64_dbg_gui/Project/DebuggerX64.pro
@@ -59,7 +59,9 @@ SOURCES += \
Src/BasicView/ReferenceView.cpp \
Src/BasicView/ThreadView.cpp \
Src/Gui/SettingsDialog.cpp \
- Src/Gui/ExceptionRangeDialog.cpp
+ Src/Gui/ExceptionRangeDialog.cpp \
+ Src/Gui/tabbar.cpp \
+ Src/Gui/tabwidget.cpp
HEADERS += \
@@ -99,7 +101,9 @@ HEADERS += \
Src/BasicView/ReferenceView.h \
Src/BasicView/ThreadView.h \
Src/Gui/SettingsDialog.h \
- Src/Gui/ExceptionRangeDialog.h
+ Src/Gui/ExceptionRangeDialog.h \
+ Src/Gui/tabbar.h \
+ Src/Gui/tabwidget.h
INCLUDEPATH += \
Src \
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
index d55684f3..80427632 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
@@ -1,5 +1,6 @@
#include "MainWindow.h"
#include "ui_MainWindow.h"
+#include "tabbar.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
@@ -72,8 +73,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
mThreadView->setWindowIcon(QIcon(":/icons/images/arrow-threads.png"));
//Create the tab widget
- mTabWidget = new QTabWidget();
- mTabWidget->setMovable(true);
+ mTabWidget = new MHTabBar(NULL);
//Setup tabs
mTabWidget->addTab(mCpuWidget, mCpuWidget->windowIcon(), mCpuWidget->windowTitle());
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
new file mode 100644
index 00000000..8a09feb3
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
@@ -0,0 +1,152 @@
+// Qt includes
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "tabbar.h"
+#include "tabwidget.h"
+
+//////////////////////////////////////////////////////////////
+// Default Constructor
+//////////////////////////////////////////////////////////////
+MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent)
+{
+ setAcceptDrops(true);
+ setElideMode(Qt::ElideRight);
+ setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab);
+ setMovable(true);
+}
+
+//////////////////////////////////////////////////////////////
+// Default Destructor
+//////////////////////////////////////////////////////////////
+MHTabBar::~MHTabBar(void)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::mousePressEvent(QMouseEvent* event)
+{
+ if (event->button() == Qt::LeftButton)
+ m_dragStartPos = event->pos();
+
+ m_dragDropedPos.setX(0);
+ m_dragDropedPos.setY(0);
+ m_dragMovedPos.setX(0);
+ m_dragMovedPos.setY(0);
+
+ m_dragInitiated = false;
+
+ QTabBar::mousePressEvent(event);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::mouseMoveEvent(QMouseEvent* event)
+{
+ // Distinguish a drag
+ if ( !m_dragStartPos.isNull () &&
+ ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
+ {
+ m_dragInitiated = true;
+ }
+
+ // The left button is pressed
+ // And the move could also be a drag
+ // And the mouse moved outside the tab bar
+ if ( ((event->buttons() & Qt::LeftButton)) &&
+ m_dragInitiated &&
+ (!geometry ().contains (event->pos ())))
+ {
+ // Stop the move to be able to convert to a drag
+ {
+ QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+ QTabBar::mouseMoveEvent(&finishMoveEvent);
+ }
+
+ // Initiate Drag
+ QDrag* drag = new QDrag(this);
+ QMimeData* mimeData = new QMimeData;
+ // a crude way to distinguish tab-reordering drops from other ones
+ mimeData->setData("action", "application/tab-detach");
+ drag->setMimeData(mimeData);
+
+ // Create transparent screen dump
+ QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled (640, 480, Qt::KeepAspectRatio);
+ QPixmap targetPixmap(pixmap.size());
+
+ QPainter painter(&targetPixmap);
+ painter.setOpacity(0.5);
+ painter.drawPixmap(0, 0, pixmap);
+ painter.end();
+
+ drag->setPixmap(targetPixmap);
+
+ // Handle Detach and Move
+ Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction);
+
+ if (dragged == Qt::IgnoreAction)
+ {
+ event->accept();
+ OnDetachTab(tabAt(m_dragStartPos), m_dragDropedPos);
+ }
+ else if (dragged == Qt::MoveAction)
+ {
+ if (!m_dragDropedPos.isNull())
+ {
+ event->accept();
+ OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDropedPos));
+ }
+ }
+
+ delete drag;
+ }
+ else
+ {
+ QTabBar::mouseMoveEvent(event);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
+{
+ // Only accept if it's an tab-reordering request
+ const QMimeData* m = event->mimeData();
+
+ if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
+ event->acceptProposedAction();
+
+ QTabBar::dragEnterEvent(event);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
+{
+ // Only accept if it's an tab-reordering request
+ const QMimeData* m = event->mimeData();
+
+ if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
+ {
+ m_dragMovedPos = event->pos();
+ event->acceptProposedAction();
+ }
+
+ QTabBar::dragMoveEvent(event);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::dropEvent(QDropEvent* event)
+{
+ // If a dragged Event is dropped within this widget it is not a drag but a move.
+ m_dragDropedPos = event->pos();
+
+ QTabBar::dropEvent(event);
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.h b/x64_dbg_gui/Project/Src/Gui/tabbar.h
new file mode 100644
index 00000000..360f48ac
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/Gui/tabbar.h
@@ -0,0 +1,43 @@
+#ifndef __MHTABBAR_H__
+#define __MHTABBAR_H__
+
+// Qt includes
+#include
+
+// Qt forward class definitions
+class MHTabBar;
+class QMainWindow;
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHTabBar implements the a Tab Bar with tear-off functionality.
+//////////////////////////////////////////////////////////////////////////////
+class MHTabBar: public QTabBar
+{
+Q_OBJECT
+public:
+ MHTabBar (QWidget* parent);
+ ~MHTabBar (void);
+
+protected:
+ void mousePressEvent(QMouseEvent* event);
+ void mouseMoveEvent(QMouseEvent* event);
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dragMoveEvent(QDragMoveEvent* event);
+ void dropEvent(QDropEvent* event);
+
+signals:
+ // Detach Tab
+ void OnDetachTab (int index, QPoint& dropPoint);
+ // Move Tab
+ void OnMoveTab (int fromIndex, int toIndex);
+
+private:
+ QPoint m_dragStartPos;
+ QPoint m_dragMovedPos;
+ QPoint m_dragDropedPos;
+ bool m_dragInitiated;
+ int m_dragCurrentIndex;
+};
+
+#endif // __MHTABBAR_H__
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
new file mode 100644
index 00000000..e9d65f60
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
@@ -0,0 +1,105 @@
+// Qt includes
+#include "tabbar.h"
+#include "tabwidget.h"
+
+//////////////////////////////////////////////////////////////
+// Default Constructor
+//////////////////////////////////////////////////////////////
+MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
+{
+ m_tabBar = new MHTabBar(this);
+ connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
+ connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
+
+ setTabBar(m_tabBar);
+ setMovable(true);
+}
+
+//////////////////////////////////////////////////////////////
+// Default Destructor
+//////////////////////////////////////////////////////////////
+MHTabWidget::~MHTabWidget(void)
+{
+ disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
+ disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
+ delete m_tabBar;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabWidget::MoveTab(int fromIndex, int toIndex)
+{
+ removeTab(fromIndex);
+ insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex));
+ setCurrentIndex(toIndex);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/)
+{
+ // Create the window
+ MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget());
+ detachedWidget->setWindowModality(Qt::NonModal);
+
+ // Find Widget and connect
+ connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
+
+ detachedWidget->setWindowTitle(tabText (index));
+ detachedWidget->setWindowIcon(tabIcon(index));
+
+ // Remove from tab bar
+ QWidget* tearOffWidget = widget(index);
+ tearOffWidget->setParent(detachedWidget);
+
+ // Make first active
+ if (count() > 0)
+ setCurrentIndex(0);
+
+ // Create and show
+ detachedWidget->setCentralWidget(tearOffWidget);
+
+ // Needs to be done explicitly
+ tearOffWidget->show();
+ detachedWidget->resize(640, 480);
+ detachedWidget->show();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabWidget::AttachTab(QWidget *parent)
+{
+ // Retrieve widget
+ MHDetachedWindow* detachedWidget = dynamic_cast(parent);
+ QWidget* tearOffWidget = detachedWidget->centralWidget();
+
+ // Change parent
+ tearOffWidget->setParent(this);
+
+ // Reattach the tab
+ int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
+
+ // Make Active
+ if (newIndex != -1)
+ setCurrentIndex(newIndex);
+
+ // Cleanup Window
+ disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
+ delete detachedWidget;
+}
+
+//----------------------------------------------------------------------------
+
+//////////////////////////////////////////////////////////////////////////////
+MHDetachedWindow::MHDetachedWindow(QWidget *parent) : QMainWindow(parent)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+MHDetachedWindow::~MHDetachedWindow(void)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/)
+{
+ emit OnClose(this);
+}
+
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
new file mode 100644
index 00000000..f40fd96e
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
@@ -0,0 +1,63 @@
+#ifndef __MHTABWIDGET_H__
+#define __MHTABWIDGET_H__
+
+// Qt includes
+#include
+#include
+#include
+
+// Qt forward class definitions
+class MHTabBar;
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHTabWidget implements the a Tab Widget with detach and attach
+// functionality.
+//////////////////////////////////////////////////////////////////////////////
+class MHTabWidget: public QTabWidget
+{
+ Q_OBJECT
+
+public:
+ MHTabWidget(QWidget *parent);
+ virtual ~MHTabWidget(void);
+
+public slots:
+ // Move Tab
+ void MoveTab(int fromIndex, int toIndex);
+
+ // Detach Tab
+ void DetachTab(int index, QPoint&);
+
+ // Attach Tab
+ void AttachTab(QWidget *parent);
+
+protected:
+
+private:
+ MHTabBar* m_tabBar;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHDetachedWindow implements the WindowContainer for the Detached Widget
+//
+// Conditions:
+// Header : MHTabWidget.h
+//////////////////////////////////////////////////////////////////////////////
+class MHDetachedWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MHDetachedWindow(QWidget *parent = 0);
+ ~MHDetachedWindow(void);
+
+protected:
+ void closeEvent(QCloseEvent *event);
+
+signals:
+ void OnClose (QWidget* widget);
+};
+
+#endif // __MHTABWIDGET_H__
+
From 9b36423cdc534e285318b69b865395e8e51abfe1 Mon Sep 17 00:00:00 2001
From: Nukem
Date: Thu, 24 Apr 2014 23:26:59 -0400
Subject: [PATCH 003/676] GUI: Make 'View' work with windowed tabs
Detached tabs now open at cursor location
---
x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 15 +++---
x64_dbg_gui/Project/Src/Gui/MainWindow.h | 3 +-
x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 45 ++++++++---------
x64_dbg_gui/Project/Src/Gui/tabbar.h | 2 +-
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 56 ++++++++++++++++++++--
x64_dbg_gui/Project/Src/Gui/tabwidget.h | 9 ++++
6 files changed, 92 insertions(+), 38 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
index 80427632..01d38526 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
@@ -1,6 +1,5 @@
#include "MainWindow.h"
#include "ui_MainWindow.h"
-#include "tabbar.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
@@ -73,7 +72,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
mThreadView->setWindowIcon(QIcon(":/icons/images/arrow-threads.png"));
//Create the tab widget
- mTabWidget = new MHTabBar(NULL);
+ mTabWidget = new MHTabWidget(NULL);
//Setup tabs
mTabWidget->addTab(mCpuWidget, mCpuWidget->windowIcon(), mCpuWidget->windowTitle());
@@ -154,12 +153,12 @@ MainWindow::~MainWindow()
void MainWindow::setTab(QWidget* widget)
{
- for(int i=0; icount(); i++)
- if(mTabWidget->widget(i)==widget)
- {
- mTabWidget->setCurrentIndex(i);
- break;
- }
+ for(int i=0; icount(); i++)
+ if(mTabWidget->widget(i)==widget)
+ {
+ mTabWidget->setCurrentIndex(i);
+ break;
+ }
}
//Reads recent files list from settings
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h
index 9a78ed6b..d40c9f5b 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h
@@ -17,6 +17,7 @@
#include "ReferenceView.h"
#include "ThreadView.h"
#include "SettingsDialog.h"
+#include "tabwidget.h"
namespace Ui {
class MainWindow;
@@ -71,7 +72,7 @@ private:
Ui::MainWindow *ui;
CommandLineEdit* mCmdLineEdit;
- QTabWidget* mTabWidget;
+ MHTabWidget* mTabWidget;
CPUWidget* mCpuWidget;
MemoryMapView* mMemMapView;
LogView* mLogView;
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
index 8a09feb3..2ebbdb06 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
@@ -1,15 +1,11 @@
// Qt includes
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
#include "tabbar.h"
@@ -39,8 +35,8 @@ void MHTabBar::mousePressEvent(QMouseEvent* event)
if (event->button() == Qt::LeftButton)
m_dragStartPos = event->pos();
- m_dragDropedPos.setX(0);
- m_dragDropedPos.setY(0);
+ m_dragDroppedPos.setX(0);
+ m_dragDroppedPos.setY(0);
m_dragMovedPos.setX(0);
m_dragMovedPos.setY(0);
@@ -53,7 +49,7 @@ void MHTabBar::mousePressEvent(QMouseEvent* event)
void MHTabBar::mouseMoveEvent(QMouseEvent* event)
{
// Distinguish a drag
- if ( !m_dragStartPos.isNull () &&
+ if ( !m_dragStartPos.isNull() &&
((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
{
m_dragInitiated = true;
@@ -62,9 +58,7 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event)
// The left button is pressed
// And the move could also be a drag
// And the mouse moved outside the tab bar
- if ( ((event->buttons() & Qt::LeftButton)) &&
- m_dragInitiated &&
- (!geometry ().contains (event->pos ())))
+ if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos()))
{
// Stop the move to be able to convert to a drag
{
@@ -72,15 +66,16 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event)
QTabBar::mouseMoveEvent(&finishMoveEvent);
}
+ // A crude way to distinguish tab-reordering drops from other ones
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData("action", "application/tab-detach");
+
// Initiate Drag
QDrag* drag = new QDrag(this);
- QMimeData* mimeData = new QMimeData;
- // a crude way to distinguish tab-reordering drops from other ones
- mimeData->setData("action", "application/tab-detach");
drag->setMimeData(mimeData);
// Create transparent screen dump
- QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled (640, 480, Qt::KeepAspectRatio);
+ QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio);
QPixmap targetPixmap(pixmap.size());
QPainter painter(&targetPixmap);
@@ -96,14 +91,14 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event)
if (dragged == Qt::IgnoreAction)
{
event->accept();
- OnDetachTab(tabAt(m_dragStartPos), m_dragDropedPos);
+ OnDetachTab(tabAt(m_dragStartPos), QCursor::pos());
}
else if (dragged == Qt::MoveAction)
{
- if (!m_dragDropedPos.isNull())
+ if (!m_dragDroppedPos.isNull())
{
event->accept();
- OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDropedPos));
+ OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos));
}
}
@@ -146,7 +141,7 @@ void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
void MHTabBar::dropEvent(QDropEvent* event)
{
// If a dragged Event is dropped within this widget it is not a drag but a move.
- m_dragDropedPos = event->pos();
+ m_dragDroppedPos = event->pos();
QTabBar::dropEvent(event);
}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.h b/x64_dbg_gui/Project/Src/Gui/tabbar.h
index 360f48ac..cfc9627a 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabbar.h
+++ b/x64_dbg_gui/Project/Src/Gui/tabbar.h
@@ -35,7 +35,7 @@ signals:
private:
QPoint m_dragStartPos;
QPoint m_dragMovedPos;
- QPoint m_dragDropedPos;
+ QPoint m_dragDroppedPos;
bool m_dragInitiated;
int m_dragCurrentIndex;
};
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
index e9d65f60..faae5b72 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
@@ -13,6 +13,8 @@ MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
setTabBar(m_tabBar);
setMovable(true);
+
+ m_Windows.clear();
}
//////////////////////////////////////////////////////////////
@@ -25,6 +27,44 @@ MHTabWidget::~MHTabWidget(void)
delete m_tabBar;
}
+int MHTabWidget::count() const
+{
+ return QTabWidget::count() + m_Windows.size();
+}
+
+QWidget *MHTabWidget::widget(int index) const
+{
+ int baseCount = QTabWidget::count();
+
+ // Check if it's just a normal tab
+ if (index < baseCount)
+ return QTabWidget::widget(index);
+
+ // Otherwise it's going to be a window
+ return m_Windows.at(index - baseCount);
+}
+
+void MHTabWidget::setCurrentIndex(int index)
+{
+ // Check if it's just a normal tab
+ if (index < QTabWidget::count())
+ {
+ QTabWidget::setCurrentIndex(index);
+ }
+ else
+ {
+ // Otherwise it's going to be a window (just bring it up)
+ MHDetachedWindow* window = dynamic_cast(widget(index)->parent());
+ window->activateWindow();
+ }
+}
+
+void MHTabWidget::setCurrentWidget(QWidget *widget)
+{
+ widget = 0;
+ // To be implemented.
+}
+
//////////////////////////////////////////////////////////////////////////////
void MHTabWidget::MoveTab(int fromIndex, int toIndex)
{
@@ -34,7 +74,7 @@ void MHTabWidget::MoveTab(int fromIndex, int toIndex)
}
//////////////////////////////////////////////////////////////////////////////
-void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/)
+void MHTabWidget::DetachTab(int index, QPoint& dropPoint)
{
// Create the window
MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget());
@@ -43,13 +83,16 @@ void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/)
// Find Widget and connect
connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
- detachedWidget->setWindowTitle(tabText (index));
+ detachedWidget->setWindowTitle(tabText(index));
detachedWidget->setWindowIcon(tabIcon(index));
// Remove from tab bar
QWidget* tearOffWidget = widget(index);
tearOffWidget->setParent(detachedWidget);
+ // Add it to the windows list
+ m_Windows.append(tearOffWidget);
+
// Make first active
if (count() > 0)
setCurrentIndex(0);
@@ -59,7 +102,7 @@ void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/)
// Needs to be done explicitly
tearOffWidget->show();
- detachedWidget->resize(640, 480);
+ detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480);
detachedWidget->show();
}
@@ -76,6 +119,13 @@ void MHTabWidget::AttachTab(QWidget *parent)
// Reattach the tab
int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
+ // Remove it from the windows list
+ for(int i = 0; i < m_Windows.size(); i++)
+ {
+ if (m_Windows.at(i) == tearOffWidget)
+ m_Windows.removeAt(i);
+ }
+
// Make Active
if (newIndex != -1)
setCurrentIndex(newIndex);
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
index f40fd96e..5e134f04 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
@@ -23,6 +23,9 @@ public:
virtual ~MHTabWidget(void);
public slots:
+ int count() const;
+ QWidget *widget(int index) const;
+
// Move Tab
void MoveTab(int fromIndex, int toIndex);
@@ -32,10 +35,16 @@ public slots:
// Attach Tab
void AttachTab(QWidget *parent);
+public Q_SLOTS:
+ void setCurrentIndex(int index);
+ void setCurrentWidget(QWidget *widget);
+
protected:
private:
MHTabBar* m_tabBar;
+
+ QList m_Windows;
};
//////////////////////////////////////////////////////////////////////////////
From 5f9f3f88f960ed6582a9b054f87cca3e332b29ba Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 26 Apr 2014 20:41:03 +0200
Subject: [PATCH 004/676] BRIDGE: added DbgScriptGetBranchInfo
DBG: added branch info
DBG: fixed a bug with comments in scripts
DBG: fixed a bug with prepended spaces in scripts
DBG: added script command 'nop'
GUI: separate class RichTextPainter
GUI: script syntax highlighting (jumps+calls+rets+comments)
GUI: backgroundColor property in AbstractTableView
GUI: added keyPressEvent handler (enter follows jumps & arrows select next command) in ScriptView
---
x64_dbg_bridge/bridgemain.cpp | 5 +
x64_dbg_bridge/bridgemain.h | 22 ++
x64_dbg_dbg/_exports.cpp | 8 +-
x64_dbg_dbg/simplescript.cpp | 100 ++++++---
x64_dbg_dbg/simplescript.h | 21 +-
x64_dbg_gui/Project/DebuggerX64.pro | 7 +-
.../Src/BasicView/AbstractTableView.cpp | 3 +-
.../Project/Src/BasicView/AbstractTableView.h | 4 +-
.../Project/Src/BasicView/Disassembly.cpp | 51 +----
.../Project/Src/BasicView/Disassembly.h | 4 +-
.../Project/Src/BasicView/RichTextPainter.cpp | 44 ++++
.../Project/Src/BasicView/RichTextPainter.h | 31 +++
.../Project/Src/BasicView/ScriptView.cpp | 212 +++++++++++++++++-
.../Project/Src/BasicView/ScriptView.h | 3 +
.../Project/Src/Disassembler/BeaHighlight.cpp | 4 -
.../Project/Src/Disassembler/BeaHighlight.h | 18 +-
16 files changed, 401 insertions(+), 136 deletions(-)
create mode 100644 x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp
create mode 100644 x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h
diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp
index 92cc35f1..6f747860 100644
--- a/x64_dbg_bridge/bridgemain.cpp
+++ b/x64_dbg_bridge/bridgemain.cpp
@@ -534,6 +534,11 @@ BRIDGE_IMPEXP void DbgScriptSetIp(int line)
_dbg_sendmessage(DBG_SCRIPT_SETIP, (void*)(duint)line, 0);
}
+BRIDGE_IMPEXP bool DbgScriptGetBranchInfo(int line, SCRIPTBRANCH* info)
+{
+ return (bool)(duint)_dbg_sendmessage(DBG_SCRIPT_GETBRANCHINFO, (void*)(duint)line, info);
+}
+
BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user)
{
SYMBOLCBINFO cbInfo;
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 32bb83d5..5557a0d9 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -117,6 +117,7 @@ enum DBGMSG
DBG_SCRIPT_ABORT, // param1=unused, param2=unused
DBG_SCRIPT_GETLINETYPE, // param1=int line, param2=unused
DBG_SCRIPT_SETIP, // param1=int line, param2=unused
+ DBG_SCRIPT_GETBRANCHINFO, // param1=int line, param2=SCRIPTBRANCH* info
DBG_SYMBOL_ENUM, // param1=SYMBOLCBINFO* cbInfo, param2=unused
DBG_ASSEMBLE_AT, // param1=duint addr, param2=const char* instruction
DBG_MODBASE_FROM_NAME, // param1=const char* modname, param2=unused
@@ -137,6 +138,19 @@ enum SCRIPTLINETYPE
lineempty,
};
+enum SCRIPTBRANCHTYPE
+{
+ scriptnobranch,
+ scriptjmp,
+ scriptjnejnz,
+ scriptjejz,
+ scriptjbjl,
+ scriptjajg,
+ scriptjbejle,
+ scriptjaejge,
+ scriptcall
+};
+
enum DISASM_INSTRTYPE
{
instr_normal,
@@ -414,6 +428,13 @@ struct BASIC_INSTRUCTION_INFO
bool branch; //jumps/calls
};
+struct SCRIPTBRANCH
+{
+ SCRIPTBRANCHTYPE type;
+ int dest;
+ char branchlabel[256];
+};
+
//Debugger functions
BRIDGE_IMPEXP const char* DbgInit();
BRIDGE_IMPEXP bool DbgMemRead(duint va, unsigned char* dest, duint size);
@@ -454,6 +475,7 @@ BRIDGE_IMPEXP bool DbgScriptCmdExec(const char* command);
BRIDGE_IMPEXP void DbgScriptAbort();
BRIDGE_IMPEXP SCRIPTLINETYPE DbgScriptGetLineType(int line);
BRIDGE_IMPEXP void DbgScriptSetIp(int line);
+BRIDGE_IMPEXP bool DbgScriptGetBranchInfo(int line, SCRIPTBRANCH* info);
BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user);
BRIDGE_IMPEXP bool DbgAssembleAt(duint addr, const char* instruction);
BRIDGE_IMPEXP duint DbgModBaseFromName(const char* name);
diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp
index edee621f..c5522288 100644
--- a/x64_dbg_dbg/_exports.cpp
+++ b/x64_dbg_dbg/_exports.cpp
@@ -596,6 +596,12 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par
}
break;
+ case DBG_SCRIPT_GETBRANCHINFO:
+ {
+ return (duint)scriptgetbranchinfo((int)(duint)param1, (SCRIPTBRANCH*)param2);
+ }
+ break;
+
case DBG_SYMBOL_ENUM:
{
SYMBOLCBINFO* cbInfo=(SYMBOLCBINFO*)param1;
@@ -716,7 +722,7 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par
int hEntry=(int)(uint)param1;
pluginmenucall(hEntry);
}
- break;
+ break;
}
return 0;
}
diff --git a/x64_dbg_dbg/simplescript.cpp b/x64_dbg_dbg/simplescript.cpp
index ed794250..98409614 100644
--- a/x64_dbg_dbg/simplescript.cpp
+++ b/x64_dbg_dbg/simplescript.cpp
@@ -49,9 +49,19 @@ static int scriptlabelfind(const char* labelname)
return 0;
}
+static int scriptinternalstep(int fromIp) //internal step routine
+{
+ int maxIp=linemap.size(); //maximum ip
+ if(fromIp>=maxIp) //script end
+ return fromIp;
+ while((linemap.at(fromIp).type==lineempty or linemap.at(fromIp).type==linecomment or linemap.at(fromIp).type==linelabel) and fromIp=254)
{
memset(&entry, 0, sizeof(entry));
- strcpy(entry.raw, temp);
+ int add=0;
+ while(temp[add]==' ')
+ add++;
+ strcpy(entry.raw, temp+add);
*temp=0;
j=0;
linemap.push_back(entry);
@@ -113,7 +132,7 @@ static bool scriptcreatelinemap(const char* filename)
}
efree(filedata, "createlinemap:filedata");
unsigned int linemapsize=linemap.size();
- while(!*linemap.at(linemapsize-1).raw) //remove empty lines
+ while(!*linemap.at(linemapsize-1).raw) //remove empty lines from the end
{
linemapsize--;
linemap.pop_back();
@@ -121,6 +140,24 @@ static bool scriptcreatelinemap(const char* filename)
for(unsigned int i=0; i().swap(linemap);
- return false;
+ int labelline=scriptlabelfind(linemap.at(i).u.branch.branchlabel);
+ if(!labelline) //invalid branch label
+ {
+ char message[256]="";
+ sprintf(message, "Invalid branch label \"%s\" detected on line %d!", linemap.at(i).u.branch.branchlabel, i+1);
+ GuiScriptError(0, message);
+ std::vector().swap(linemap);
+ return false;
+ }
+ else //set the branch destination line
+ linemap.at(i).u.branch.dest=scriptinternalstep(labelline);
}
}
if(linemap.at(linemapsize-1).type==linecomment or linemap.at(linemapsize-1).type==linelabel) //label/comment on the end
@@ -202,21 +244,9 @@ static bool scriptcreatelinemap(const char* filename)
strcpy(entry.u.command, "ret");
linemap.push_back(entry);
}
- dprintf("%ums to parse the script\n", GetTickCount()-ticks);
return true;
}
-static int scriptinternalstep(int fromIp) //internal step routine
-{
- int maxIp=linemap.size(); //maximum ip
- if(fromIp>=maxIp) //script end
- return fromIp;
- while((linemap.at(fromIp).type==lineempty or linemap.at(fromIp).type==linecomment or linemap.at(fromIp).type==linelabel) and fromIp(int)linemap.size()) //invalid line
+ return false;
+ if(linemap.at(line-1).type!=linebranch) //no branch
+ return false;
+ memcpy(info, &linemap.at(line-1).u.branch, sizeof(SCRIPTBRANCH));
+ return true;
+}
+
CMDRESULT cbScriptLoad(int argc, char* argv[])
{
if(argc<2)
diff --git a/x64_dbg_dbg/simplescript.h b/x64_dbg_dbg/simplescript.h
index 6420c823..4b847d54 100644
--- a/x64_dbg_dbg/simplescript.h
+++ b/x64_dbg_dbg/simplescript.h
@@ -3,20 +3,6 @@
#include "command.h"
-//enums
-enum SCRIPTBRANCHTYPE
-{
- scriptnobranch,
- scriptjmp,
- scriptjnejnz,
- scriptjejz,
- scriptjbjl,
- scriptjajg,
- scriptjbejle,
- scriptjaejge,
- scriptcall
-};
-
//structures
struct SCRIPTBP
{
@@ -24,12 +10,6 @@ struct SCRIPTBP
bool silent; //do not show in GUI
};
-struct SCRIPTBRANCH
-{
- SCRIPTBRANCHTYPE type;
- char branchlabel[256];
-};
-
struct LINEMAPENTRY
{
SCRIPTLINETYPE type;
@@ -55,6 +35,7 @@ void scriptabort();
SCRIPTLINETYPE scriptgetlinetype(int line);
void scriptsetip(int line);
void scriptreset();
+bool scriptgetbranchinfo(int line, SCRIPTBRANCH* info);
//script commands
CMDRESULT cbScriptLoad(int argc, char* argv[]);
diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro
index 125b7e6a..12d16589 100644
--- a/x64_dbg_gui/Project/DebuggerX64.pro
+++ b/x64_dbg_gui/Project/DebuggerX64.pro
@@ -61,7 +61,8 @@ SOURCES += \
Src/Gui/SettingsDialog.cpp \
Src/Gui/ExceptionRangeDialog.cpp \
Src/Gui/tabbar.cpp \
- Src/Gui/tabwidget.cpp
+ Src/Gui/tabwidget.cpp \
+ Src/BasicView/RichTextPainter.cpp
HEADERS += \
@@ -103,7 +104,9 @@ HEADERS += \
Src/Gui/SettingsDialog.h \
Src/Gui/ExceptionRangeDialog.h \
Src/Gui/tabbar.h \
- Src/Gui/tabwidget.h
+ Src/Gui/tabwidget.h \
+ Src/BasicView/RichTextPainter.h
+
INCLUDEPATH += \
Src \
diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
index 1b017a26..cb97f505 100644
--- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
@@ -19,6 +19,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare
font.setStyleHint(QFont::Monospace);
this->setFont(font);
+ backgroundColor=QColor(255, 251, 240);
int wRowsHeight = QFontMetrics(this->font()).height();
wRowsHeight = (wRowsHeight * 105) / 100;
@@ -75,7 +76,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event)
}
// Paints background
- wPainter.fillRect(wPainter.viewport(), QBrush(QColor(255, 251, 240)));
+ wPainter.fillRect(wPainter.viewport(), QBrush(backgroundColor));
// Paints header
if(mHeader.isVisible == true)
diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h
index 7834fbf3..ddfb7187 100644
--- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h
+++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h
@@ -10,7 +10,6 @@
#include
#include
-
class AbstractTableView : public QAbstractScrollArea
{
Q_OBJECT
@@ -144,6 +143,9 @@ private:
bool mShouldReload;
ScrollBar64_t mScrollBarAttributes;
+
+protected:
+ QColor backgroundColor;
};
#endif // ABSTRACTTABLEVIEW_H
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
index dc80f691..5738e257 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
@@ -37,55 +37,6 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent)
connect(Bridge::getBridge(), SIGNAL(repaintGui()), this, SLOT(reloadData()));
}
-/************************************************************************************
- Private Functions
-************************************************************************************/
-
-void Disassembly::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText)
-{
- int len=richText->size();
- int charwidth=QFontMetrics(this->font()).width(QChar(' '));
- for(int i=0; iat(i);
- int curRichTextLength=curRichText.text.length();
- int backgroundWidth=charwidth*curRichTextLength;
- if(backgroundWidth+xinc>w)
- backgroundWidth=w-xinc;
- if(backgroundWidth<=0) //stop drawing when going outside the specified width
- break;
- switch(curRichText.flags)
- {
- case FlagNone: //defaults
- painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
- break;
- case FlagColor: //color only
- painter->save();
- painter->setPen(QPen(curRichText.textColor));
- painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
- painter->restore();
- break;
- case FlagBackground: //background only
- painter->save();
- if(backgroundWidth>0)
- painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground));
- painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
- painter->restore();
- break;
- case FlagAll: //color+background
- painter->save();
- if(backgroundWidth>0)
- painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground));
- painter->setPen(QPen(curRichText.textColor));
- painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
- painter->restore();
- break;
- }
- xinc+=charwidth*curRichTextLength;
- }
-}
-
-
/************************************************************************************
Reimplemented Functions
************************************************************************************/
@@ -286,7 +237,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
QList richText;
BeaHighlight::PrintRtfInstruction(&richText, &mInstBuffer.at(rowOffset).disasm);
- Disassembly::paintRichText(painter, x + loopsize, y, getColumnWidth(col) - loopsize, getRowHeight(), 4, &richText);
+ RichTextPainter::paintRichText(painter, x + loopsize, y, getColumnWidth(col) - loopsize, getRowHeight(), 4, &richText, QFontMetrics(this->font()).width(QChar(' ')));
break;
}
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
index 42f33e88..0f135e5f 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
@@ -8,6 +8,7 @@
#include "AbstractTableView.h"
#include "QBeaEngine.h"
#include "BeaHighlight.h"
+#include "RichTextPainter.h"
class Disassembly : public AbstractTableView
{
@@ -15,9 +16,6 @@ class Disassembly : public AbstractTableView
public:
explicit Disassembly(QWidget *parent = 0);
- // Private Functions
- void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText);
-
// Reimplemented Functions
QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h);
diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp
new file mode 100644
index 00000000..a7b71151
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp
@@ -0,0 +1,44 @@
+#include "RichTextPainter.h"
+
+void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth)
+{
+ int len=richText->size();
+ for(int i=0; iat(i);
+ int curRichTextLength=curRichText.text.length();
+ int backgroundWidth=charwidth*curRichTextLength;
+ if(backgroundWidth+xinc>w)
+ backgroundWidth=w-xinc;
+ if(backgroundWidth<=0) //stop drawing when going outside the specified width
+ break;
+ switch(curRichText.flags)
+ {
+ case FlagNone: //defaults
+ painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
+ break;
+ case FlagColor: //color only
+ painter->save();
+ painter->setPen(QPen(curRichText.textColor));
+ painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
+ painter->restore();
+ break;
+ case FlagBackground: //background only
+ painter->save();
+ if(backgroundWidth>0)
+ painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground));
+ painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
+ painter->restore();
+ break;
+ case FlagAll: //color+background
+ painter->save();
+ if(backgroundWidth>0)
+ painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground));
+ painter->setPen(QPen(curRichText.textColor));
+ painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text);
+ painter->restore();
+ break;
+ }
+ xinc+=charwidth*curRichTextLength;
+ }
+}
diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h
new file mode 100644
index 00000000..a3b64137
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h
@@ -0,0 +1,31 @@
+#ifndef RICHTEXTPAINTER_H
+#define RICHTEXTPAINTER_H
+
+#include
+#include
+
+//structures
+enum CustomRichTextFlags
+{
+ FlagNone,
+ FlagColor,
+ FlagBackground,
+ FlagAll
+};
+
+typedef struct _CustomRichText_t
+{
+ QString text;
+ QColor textColor;
+ QColor textBackground;
+ CustomRichTextFlags flags;
+} CustomRichText_t;
+
+class RichTextPainter
+{
+public:
+ //functions
+ static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth);
+};
+
+#endif // RICHTEXTPAINTER_H
diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
index 673eb954..449004ea 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
@@ -67,17 +67,150 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
case 1: //command
{
+ //initialize
painter->save();
- if(linetype==linecomment || linetype==linelabel)
- painter->setPen(QPen(QColor("#808080"))); //grey text
- if(linetype!=linelabel)
- returnString=QString(" ") + getCellContent(rowBase+rowOffset, col);
- else //label
+ int charwidth=QFontMetrics(this->font()).width(QChar(' '));
+ int xadd=charwidth; //for testing
+ QList richText;
+ CustomRichText_t newRichText;
+ QString command=getCellContent(rowBase+rowOffset, col);
+
+ //handle comments
+ int comment_idx=command.indexOf("//"); //find the index of the space
+ QString comment="";
+ if(comment_idx!=-1 && command.at(0)!=QChar('/')) //there is a comment
{
- returnString=getCellContent(rowBase+rowOffset, col);
- painter->drawLine(QPoint(x+2, y+h-2), QPoint(x+w-4, y+h-2));
+ comment=command.right(command.length()-comment_idx);
+ if(command.at(comment_idx-1)==QChar(' '))
+ command.truncate(comment_idx-1);
+ else
+ command.truncate(comment_idx);
}
- painter->drawText(QRect(x+1, y , w , h), Qt::AlignVCenter | Qt::AlignLeft, returnString);
+
+ //setup the richText list
+ switch(linetype)
+ {
+ case linecommand:
+ {
+ if(isScriptCommand(command, "ret"))
+ {
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor(0,255,255);
+ newRichText.text="ret";
+ richText.push_back(newRichText);
+ QString remainder=command.right(command.length()-3);
+ if(remainder.length())
+ {
+ newRichText.flags=FlagNone;
+ newRichText.text=remainder;
+ richText.push_back(newRichText);
+ }
+ }
+ else
+ {
+ newRichText.flags=FlagNone;
+ newRichText.text=command;
+ richText.push_back(newRichText);
+ }
+ }
+ break;
+
+ case linebranch:
+ {
+ SCRIPTBRANCH branchinfo;
+ DbgScriptGetBranchInfo(line, &branchinfo);
+ //jumps
+ int i=command.indexOf(" "); //find the index of the space
+ switch(branchinfo.type)
+ {
+ case scriptjmp: //unconditional jumps
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor(255,255,0);
+ break;
+
+ case scriptjnejnz: //conditional jumps
+ case scriptjejz:
+ case scriptjbjl:
+ case scriptjajg:
+ case scriptjbejle:
+ case scriptjaejge:
+ newRichText.flags=FlagAll;
+ newRichText.textBackground=QColor(255,255,0);
+ newRichText.textColor=QColor(255,0,0);
+ break;
+
+ case scriptcall: //calls
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor(0,255,255);
+ break;
+
+ default:
+ newRichText.flags=FlagNone;
+ break;
+ }
+ newRichText.text=command.left(i);
+ richText.push_back(newRichText);
+ //space
+ newRichText.flags=FlagNone;
+ newRichText.text=" ";
+ richText.push_back(newRichText);
+ //label
+ QString label=branchinfo.branchlabel;
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor(255,255,0);
+ newRichText.text=label;
+ richText.push_back(newRichText);
+ //remainder
+ QString remainder=command.right(command.length()-command.indexOf(label)-label.length());
+ if(remainder.length())
+ {
+ newRichText.flags=FlagNone;
+ newRichText.text=remainder;
+ richText.push_back(newRichText);
+ }
+ }
+ break;
+
+ case linelabel:
+ {
+ newRichText.flags=FlagColor;
+ newRichText.textColor=QColor("#808080");
+ newRichText.text=command;
+ richText.push_back(newRichText);
+ painter->drawLine(QPoint(x+xadd+2, y+h-2), QPoint(x+w-4, y+h-2));
+ }
+ break;
+
+ case linecomment:
+ {
+ newRichText.flags=FlagColor;
+ newRichText.textColor=QColor("#808080");
+ newRichText.text=command;
+ richText.push_back(newRichText);
+ }
+ break;
+
+ case lineempty:
+ {
+ }
+ break;
+ }
+
+ //append the comment (when present)
+ if(comment.length())
+ {
+ CustomRichText_t newRichText;
+ newRichText.flags=FlagNone;
+ newRichText.text=" ";
+ richText.push_back(newRichText); //space
+ newRichText.flags=FlagColor;
+ newRichText.textColor=QColor("#808080");
+ newRichText.text=comment;
+ richText.push_back(newRichText); //comment
+ }
+
+ //paint the rich text
+ RichTextPainter::paintRichText(painter, x+1, y, w, h, xadd, &richText, charwidth);
painter->restore();
returnString="";
}
@@ -119,6 +252,41 @@ void ScriptView::mouseDoubleClickEvent(QMouseEvent* event)
newIp();
}
+void ScriptView::keyPressEvent(QKeyEvent* event)
+{
+ int key = event->key();
+ if(key == Qt::Key_Up || key == Qt::Key_Down)
+ {
+ int_t botRVA = getTableOffset();
+ int_t topRVA = botRVA + getNbrOfLineToPrint() - 1;
+ if(key == Qt::Key_Up)
+ selectPrevious();
+ else
+ selectNext();
+ if(getInitialSelection() < botRVA)
+ {
+ setTableOffset(getInitialSelection());
+ }
+ else if(getInitialSelection() >= topRVA)
+ {
+ setTableOffset(getInitialSelection() - getNbrOfLineToPrint() + 2);
+ }
+ repaint();
+ }
+ else if(key == Qt::Key_Return || key == Qt::Key_Enter)
+ {
+ int line=getInitialSelection()+1;
+ SCRIPTBRANCH branchinfo;
+ memset(&branchinfo, 0, sizeof(SCRIPTBRANCH));
+ if(DbgScriptGetBranchInfo(line, &branchinfo))
+ setSelection(branchinfo.dest);
+ }
+ else
+ {
+ AbstractTableView::keyPressEvent(event);
+ }
+}
+
void ScriptView::setupContextMenu()
{
mLoadMenu = new QMenu("Load Script", this);
@@ -178,6 +346,19 @@ void ScriptView::setupContextMenu()
connect(mScriptNewIp, SIGNAL(triggered()), this, SLOT(newIp()));
}
+bool ScriptView::isScriptCommand(QString text, QString cmd)
+{
+ int len=text.length();
+ int cmdlen=cmd.length();
+ if(cmdlen>len)
+ return false;
+ else if(cmdlen==len)
+ return (text.compare(cmd, Qt::CaseInsensitive)==0);
+ else if(text.at(cmdlen)==' ')
+ return (text.left(cmdlen).compare(cmd, Qt::CaseInsensitive)==0);
+ return false;
+}
+
//slots
void ScriptView::add(int count, const char** lines)
{
@@ -215,6 +396,21 @@ void ScriptView::setIp(int line)
reloadData(); //repaint
}
+void ScriptView::setSelection(int line)
+{
+ int offset=line-1;
+ if(!isValidIndex(offset, 0))
+ return;
+ int rangefrom=getTableOffset();
+ int rangeto=rangefrom+getViewableRowsCount()-1;
+ if(offset(rangeto-1)) //ip lays after the current view
+ setTableOffset(offset-getViewableRowsCount()+2);
+ setSingleSelection(offset);
+ reloadData(); //repaint
+}
+
void ScriptView::error(int line, QString message)
{
QString title;
diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h
index defd6f66..a045bba6 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h
+++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h
@@ -20,6 +20,7 @@ public:
QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h);
void contextMenuEvent(QContextMenuEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
+ void keyPressEvent(QKeyEvent* event);
public slots:
void add(int count, const char** lines);
@@ -43,6 +44,8 @@ public slots:
private:
//private functions
void setupContextMenu();
+ void setSelection(int line);
+ bool isScriptCommand(QString text, QString cmd);
//private variables
int mIpLine;
diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
index 2b644096..7381393b 100644
--- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
+++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
@@ -1,9 +1,5 @@
#include "BeaHighlight.h"
-BeaHighlight::BeaHighlight()
-{
-}
-
SEGMENTREG BeaHighlight::ConvertBeaSeg(int beaSeg)
{
switch(beaSeg)
diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h
index c09164c3..10ec7d12 100644
--- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h
+++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h
@@ -2,27 +2,11 @@
#define BEAHIGHLIGHT_H
#include "QBeaEngine.h"
-
-enum CustomRichTextFlags
-{
- FlagNone,
- FlagColor,
- FlagBackground,
- FlagAll
-};
-
-typedef struct _CustomRichText_t
-{
- QString text;
- QColor textColor;
- QColor textBackground;
- CustomRichTextFlags flags;
-} CustomRichText_t;
+#include "RichTextPainter.h"
class BeaHighlight
{
public:
- BeaHighlight();
static void PrintRtfInstruction(QList* richText, const DISASM* MyDisasm);
private:
static SEGMENTREG ConvertBeaSeg(int beaSeg);
From 8eb711459e590644ff9851eea4a68cbf9a38b788 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 26 Apr 2014 20:47:25 +0200
Subject: [PATCH 005/676] GUI: solved some merge conflicts
---
x64_dbg_gui/Project/DebuggerX64.pro | 12 +-
x64_dbg_gui/Project/Src/Gui/TabBar.h | 43 ++++++
x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 158 +++++++++++-----------
x64_dbg_gui/Project/Src/Gui/tabbar.h | 43 ------
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 146 ++++++++++----------
x64_dbg_gui/Project/Src/Gui/tabwidget.h | 40 +++---
6 files changed, 221 insertions(+), 221 deletions(-)
create mode 100644 x64_dbg_gui/Project/Src/Gui/TabBar.h
delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.h
diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro
index 12d16589..f94b121c 100644
--- a/x64_dbg_gui/Project/DebuggerX64.pro
+++ b/x64_dbg_gui/Project/DebuggerX64.pro
@@ -60,9 +60,9 @@ SOURCES += \
Src/BasicView/ThreadView.cpp \
Src/Gui/SettingsDialog.cpp \
Src/Gui/ExceptionRangeDialog.cpp \
- Src/Gui/tabbar.cpp \
- Src/Gui/tabwidget.cpp \
- Src/BasicView/RichTextPainter.cpp
+ Src/BasicView/RichTextPainter.cpp \
+ Src/Gui/TabBar.cpp \
+ Src/Gui/TabWidget.cpp
HEADERS += \
@@ -103,9 +103,9 @@ HEADERS += \
Src/BasicView/ThreadView.h \
Src/Gui/SettingsDialog.h \
Src/Gui/ExceptionRangeDialog.h \
- Src/Gui/tabbar.h \
- Src/Gui/tabwidget.h \
- Src/BasicView/RichTextPainter.h
+ Src/BasicView/RichTextPainter.h \
+ Src/Gui/TabBar.h \
+ Src/Gui/TabWidget.h
INCLUDEPATH += \
diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h
new file mode 100644
index 00000000..744c2e7e
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/Gui/TabBar.h
@@ -0,0 +1,43 @@
+#ifndef __MHTABBAR_H__
+#define __MHTABBAR_H__
+
+// Qt includes
+#include
+
+// Qt forward class definitions
+class MHTabBar;
+class QMainWindow;
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHTabBar implements the a Tab Bar with tear-off functionality.
+//////////////////////////////////////////////////////////////////////////////
+class MHTabBar: public QTabBar
+{
+ Q_OBJECT
+public:
+ MHTabBar (QWidget* parent);
+ ~MHTabBar (void);
+
+protected:
+ void mousePressEvent(QMouseEvent* event);
+ void mouseMoveEvent(QMouseEvent* event);
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dragMoveEvent(QDragMoveEvent* event);
+ void dropEvent(QDropEvent* event);
+
+signals:
+ // Detach Tab
+ void OnDetachTab (int index, QPoint& dropPoint);
+ // Move Tab
+ void OnMoveTab (int fromIndex, int toIndex);
+
+private:
+ QPoint m_dragStartPos;
+ QPoint m_dragMovedPos;
+ QPoint m_dragDroppedPos;
+ bool m_dragInitiated;
+ int m_dragCurrentIndex;
+};
+
+#endif // __MHTABBAR_H__
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
index 2ebbdb06..8ee99d4f 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
@@ -16,10 +16,10 @@
//////////////////////////////////////////////////////////////
MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent)
{
- setAcceptDrops(true);
- setElideMode(Qt::ElideRight);
- setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab);
- setMovable(true);
+ setAcceptDrops(true);
+ setElideMode(Qt::ElideRight);
+ setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab);
+ setMovable(true);
}
//////////////////////////////////////////////////////////////
@@ -32,116 +32,116 @@ MHTabBar::~MHTabBar(void)
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::mousePressEvent(QMouseEvent* event)
{
- if (event->button() == Qt::LeftButton)
- m_dragStartPos = event->pos();
+ if (event->button() == Qt::LeftButton)
+ m_dragStartPos = event->pos();
- m_dragDroppedPos.setX(0);
- m_dragDroppedPos.setY(0);
- m_dragMovedPos.setX(0);
- m_dragMovedPos.setY(0);
+ m_dragDroppedPos.setX(0);
+ m_dragDroppedPos.setY(0);
+ m_dragMovedPos.setX(0);
+ m_dragMovedPos.setY(0);
- m_dragInitiated = false;
+ m_dragInitiated = false;
- QTabBar::mousePressEvent(event);
+ QTabBar::mousePressEvent(event);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::mouseMoveEvent(QMouseEvent* event)
{
- // Distinguish a drag
- if ( !m_dragStartPos.isNull() &&
- ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
- {
- m_dragInitiated = true;
- }
+ // Distinguish a drag
+ if ( !m_dragStartPos.isNull() &&
+ ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
+ {
+ m_dragInitiated = true;
+ }
- // The left button is pressed
- // And the move could also be a drag
- // And the mouse moved outside the tab bar
- if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos()))
- {
- // Stop the move to be able to convert to a drag
- {
- QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
- QTabBar::mouseMoveEvent(&finishMoveEvent);
- }
+ // The left button is pressed
+ // And the move could also be a drag
+ // And the mouse moved outside the tab bar
+ if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos()))
+ {
+ // Stop the move to be able to convert to a drag
+ {
+ QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+ QTabBar::mouseMoveEvent(&finishMoveEvent);
+ }
- // A crude way to distinguish tab-reordering drops from other ones
- QMimeData* mimeData = new QMimeData;
- mimeData->setData("action", "application/tab-detach");
+ // A crude way to distinguish tab-reordering drops from other ones
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData("action", "application/tab-detach");
- // Initiate Drag
- QDrag* drag = new QDrag(this);
- drag->setMimeData(mimeData);
+ // Initiate Drag
+ QDrag* drag = new QDrag(this);
+ drag->setMimeData(mimeData);
- // Create transparent screen dump
- QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio);
- QPixmap targetPixmap(pixmap.size());
+ // Create transparent screen dump
+ QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio);
+ QPixmap targetPixmap(pixmap.size());
- QPainter painter(&targetPixmap);
- painter.setOpacity(0.5);
- painter.drawPixmap(0, 0, pixmap);
- painter.end();
+ QPainter painter(&targetPixmap);
+ painter.setOpacity(0.5);
+ painter.drawPixmap(0, 0, pixmap);
+ painter.end();
- drag->setPixmap(targetPixmap);
+ drag->setPixmap(targetPixmap);
- // Handle Detach and Move
- Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction);
+ // Handle Detach and Move
+ Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction);
- if (dragged == Qt::IgnoreAction)
- {
- event->accept();
- OnDetachTab(tabAt(m_dragStartPos), QCursor::pos());
- }
- else if (dragged == Qt::MoveAction)
- {
- if (!m_dragDroppedPos.isNull())
- {
- event->accept();
- OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos));
- }
- }
+ if (dragged == Qt::IgnoreAction)
+ {
+ event->accept();
+ OnDetachTab(tabAt(m_dragStartPos), QCursor::pos());
+ }
+ else if (dragged == Qt::MoveAction)
+ {
+ if (!m_dragDroppedPos.isNull())
+ {
+ event->accept();
+ OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos));
+ }
+ }
- delete drag;
- }
- else
- {
- QTabBar::mouseMoveEvent(event);
- }
+ delete drag;
+ }
+ else
+ {
+ QTabBar::mouseMoveEvent(event);
+ }
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
{
- // Only accept if it's an tab-reordering request
- const QMimeData* m = event->mimeData();
+ // Only accept if it's an tab-reordering request
+ const QMimeData* m = event->mimeData();
- if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
- event->acceptProposedAction();
+ if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
+ event->acceptProposedAction();
- QTabBar::dragEnterEvent(event);
+ QTabBar::dragEnterEvent(event);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
{
- // Only accept if it's an tab-reordering request
- const QMimeData* m = event->mimeData();
+ // Only accept if it's an tab-reordering request
+ const QMimeData* m = event->mimeData();
- if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
- {
- m_dragMovedPos = event->pos();
- event->acceptProposedAction();
- }
+ if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
+ {
+ m_dragMovedPos = event->pos();
+ event->acceptProposedAction();
+ }
- QTabBar::dragMoveEvent(event);
+ QTabBar::dragMoveEvent(event);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dropEvent(QDropEvent* event)
{
- // If a dragged Event is dropped within this widget it is not a drag but a move.
- m_dragDroppedPos = event->pos();
+ // If a dragged Event is dropped within this widget it is not a drag but a move.
+ m_dragDroppedPos = event->pos();
- QTabBar::dropEvent(event);
+ QTabBar::dropEvent(event);
}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.h b/x64_dbg_gui/Project/Src/Gui/tabbar.h
deleted file mode 100644
index cfc9627a..00000000
--- a/x64_dbg_gui/Project/Src/Gui/tabbar.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef __MHTABBAR_H__
-#define __MHTABBAR_H__
-
-// Qt includes
-#include
-
-// Qt forward class definitions
-class MHTabBar;
-class QMainWindow;
-
-//////////////////////////////////////////////////////////////////////////////
-// Summary:
-// MHTabBar implements the a Tab Bar with tear-off functionality.
-//////////////////////////////////////////////////////////////////////////////
-class MHTabBar: public QTabBar
-{
-Q_OBJECT
-public:
- MHTabBar (QWidget* parent);
- ~MHTabBar (void);
-
-protected:
- void mousePressEvent(QMouseEvent* event);
- void mouseMoveEvent(QMouseEvent* event);
- void dragEnterEvent(QDragEnterEvent* event);
- void dragMoveEvent(QDragMoveEvent* event);
- void dropEvent(QDropEvent* event);
-
-signals:
- // Detach Tab
- void OnDetachTab (int index, QPoint& dropPoint);
- // Move Tab
- void OnMoveTab (int fromIndex, int toIndex);
-
-private:
- QPoint m_dragStartPos;
- QPoint m_dragMovedPos;
- QPoint m_dragDroppedPos;
- bool m_dragInitiated;
- int m_dragCurrentIndex;
-};
-
-#endif // __MHTABBAR_H__
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
index faae5b72..4c0d65f2 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
@@ -7,14 +7,14 @@
//////////////////////////////////////////////////////////////
MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
{
- m_tabBar = new MHTabBar(this);
- connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
- connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
+ m_tabBar = new MHTabBar(this);
+ connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
+ connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
- setTabBar(m_tabBar);
- setMovable(true);
+ setTabBar(m_tabBar);
+ setMovable(true);
- m_Windows.clear();
+ m_Windows.clear();
}
//////////////////////////////////////////////////////////////
@@ -22,117 +22,117 @@ MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
//////////////////////////////////////////////////////////////
MHTabWidget::~MHTabWidget(void)
{
- disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
- disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
- delete m_tabBar;
+ disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
+ disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
+ delete m_tabBar;
}
int MHTabWidget::count() const
{
- return QTabWidget::count() + m_Windows.size();
+ return QTabWidget::count() + m_Windows.size();
}
QWidget *MHTabWidget::widget(int index) const
{
- int baseCount = QTabWidget::count();
+ int baseCount = QTabWidget::count();
- // Check if it's just a normal tab
- if (index < baseCount)
- return QTabWidget::widget(index);
+ // Check if it's just a normal tab
+ if (index < baseCount)
+ return QTabWidget::widget(index);
- // Otherwise it's going to be a window
- return m_Windows.at(index - baseCount);
+ // Otherwise it's going to be a window
+ return m_Windows.at(index - baseCount);
}
void MHTabWidget::setCurrentIndex(int index)
{
- // Check if it's just a normal tab
- if (index < QTabWidget::count())
- {
- QTabWidget::setCurrentIndex(index);
- }
- else
- {
- // Otherwise it's going to be a window (just bring it up)
- MHDetachedWindow* window = dynamic_cast(widget(index)->parent());
- window->activateWindow();
- }
+ // Check if it's just a normal tab
+ if (index < QTabWidget::count())
+ {
+ QTabWidget::setCurrentIndex(index);
+ }
+ else
+ {
+ // Otherwise it's going to be a window (just bring it up)
+ MHDetachedWindow* window = dynamic_cast(widget(index)->parent());
+ window->activateWindow();
+ }
}
void MHTabWidget::setCurrentWidget(QWidget *widget)
{
- widget = 0;
- // To be implemented.
+ widget = 0;
+ // To be implemented.
}
//////////////////////////////////////////////////////////////////////////////
void MHTabWidget::MoveTab(int fromIndex, int toIndex)
{
- removeTab(fromIndex);
- insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex));
- setCurrentIndex(toIndex);
+ removeTab(fromIndex);
+ insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex));
+ setCurrentIndex(toIndex);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabWidget::DetachTab(int index, QPoint& dropPoint)
{
- // Create the window
- MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget());
- detachedWidget->setWindowModality(Qt::NonModal);
+ // Create the window
+ MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget());
+ detachedWidget->setWindowModality(Qt::NonModal);
- // Find Widget and connect
- connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
+ // Find Widget and connect
+ connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
- detachedWidget->setWindowTitle(tabText(index));
- detachedWidget->setWindowIcon(tabIcon(index));
+ detachedWidget->setWindowTitle(tabText(index));
+ detachedWidget->setWindowIcon(tabIcon(index));
- // Remove from tab bar
- QWidget* tearOffWidget = widget(index);
- tearOffWidget->setParent(detachedWidget);
+ // Remove from tab bar
+ QWidget* tearOffWidget = widget(index);
+ tearOffWidget->setParent(detachedWidget);
- // Add it to the windows list
- m_Windows.append(tearOffWidget);
+ // Add it to the windows list
+ m_Windows.append(tearOffWidget);
- // Make first active
- if (count() > 0)
- setCurrentIndex(0);
+ // Make first active
+ if (count() > 0)
+ setCurrentIndex(0);
- // Create and show
- detachedWidget->setCentralWidget(tearOffWidget);
+ // Create and show
+ detachedWidget->setCentralWidget(tearOffWidget);
- // Needs to be done explicitly
- tearOffWidget->show();
- detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480);
- detachedWidget->show();
+ // Needs to be done explicitly
+ tearOffWidget->show();
+ detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480);
+ detachedWidget->show();
}
//////////////////////////////////////////////////////////////////////////////
void MHTabWidget::AttachTab(QWidget *parent)
{
- // Retrieve widget
- MHDetachedWindow* detachedWidget = dynamic_cast(parent);
- QWidget* tearOffWidget = detachedWidget->centralWidget();
+ // Retrieve widget
+ MHDetachedWindow* detachedWidget = dynamic_cast(parent);
+ QWidget* tearOffWidget = detachedWidget->centralWidget();
- // Change parent
- tearOffWidget->setParent(this);
+ // Change parent
+ tearOffWidget->setParent(this);
- // Reattach the tab
- int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
+ // Reattach the tab
+ int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
- // Remove it from the windows list
- for(int i = 0; i < m_Windows.size(); i++)
- {
- if (m_Windows.at(i) == tearOffWidget)
- m_Windows.removeAt(i);
- }
+ // Remove it from the windows list
+ for(int i = 0; i < m_Windows.size(); i++)
+ {
+ if (m_Windows.at(i) == tearOffWidget)
+ m_Windows.removeAt(i);
+ }
- // Make Active
- if (newIndex != -1)
- setCurrentIndex(newIndex);
+ // Make Active
+ if (newIndex != -1)
+ setCurrentIndex(newIndex);
- // Cleanup Window
- disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
- delete detachedWidget;
+ // Cleanup Window
+ disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
+ delete detachedWidget;
}
//----------------------------------------------------------------------------
@@ -150,6 +150,6 @@ MHDetachedWindow::~MHDetachedWindow(void)
//////////////////////////////////////////////////////////////////////////////
void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/)
{
- emit OnClose(this);
+ emit OnClose(this);
}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
index 5e134f04..252c8c24 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
@@ -16,35 +16,35 @@ class MHTabBar;
//////////////////////////////////////////////////////////////////////////////
class MHTabWidget: public QTabWidget
{
- Q_OBJECT
+ Q_OBJECT
public:
- MHTabWidget(QWidget *parent);
- virtual ~MHTabWidget(void);
+ MHTabWidget(QWidget *parent);
+ virtual ~MHTabWidget(void);
public slots:
- int count() const;
- QWidget *widget(int index) const;
+ int count() const;
+ QWidget *widget(int index) const;
- // Move Tab
- void MoveTab(int fromIndex, int toIndex);
+ // Move Tab
+ void MoveTab(int fromIndex, int toIndex);
- // Detach Tab
- void DetachTab(int index, QPoint&);
+ // Detach Tab
+ void DetachTab(int index, QPoint&);
- // Attach Tab
- void AttachTab(QWidget *parent);
+ // Attach Tab
+ void AttachTab(QWidget *parent);
public Q_SLOTS:
- void setCurrentIndex(int index);
- void setCurrentWidget(QWidget *widget);
+ void setCurrentIndex(int index);
+ void setCurrentWidget(QWidget *widget);
protected:
private:
- MHTabBar* m_tabBar;
+ MHTabBar* m_tabBar;
- QList m_Windows;
+ QList m_Windows;
};
//////////////////////////////////////////////////////////////////////////////
@@ -56,16 +56,16 @@ private:
//////////////////////////////////////////////////////////////////////////////
class MHDetachedWindow : public QMainWindow
{
- Q_OBJECT
+ Q_OBJECT
public:
- MHDetachedWindow(QWidget *parent = 0);
- ~MHDetachedWindow(void);
+ MHDetachedWindow(QWidget *parent = 0);
+ ~MHDetachedWindow(void);
protected:
- void closeEvent(QCloseEvent *event);
+ void closeEvent(QCloseEvent *event);
signals:
- void OnClose (QWidget* widget);
+ void OnClose (QWidget* widget);
};
#endif // __MHTABWIDGET_H__
From 9f514b275135473ecda71635a7ce06b30ba092a1 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 26 Apr 2014 21:15:40 +0200
Subject: [PATCH 006/676] GUI: hex color codes everywhere (custom colors coming
soon!)
---
.../Src/BasicView/AbstractTableView.cpp | 243 +++++++++---------
.../Project/Src/BasicView/Disassembly.cpp | 18 +-
x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 2 +-
.../Project/Src/BasicView/RegistersView.cpp | 2 +-
.../Project/Src/BasicView/ScriptView.cpp | 14 +-
.../Project/Src/BasicView/StdTable.cpp | 2 +-
.../Project/Src/BasicView/ThreadView.cpp | 2 +-
.../Project/Src/Disassembler/BeaHighlight.cpp | 22 +-
x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 2 +-
9 files changed, 154 insertions(+), 153 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
index cb97f505..ce0e03bc 100644
--- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
@@ -19,7 +19,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare
font.setStyleHint(QFont::Monospace);
this->setFont(font);
- backgroundColor=QColor(255, 251, 240);
+ backgroundColor=QColor("#FFFBF0");
int wRowsHeight = QFontMetrics(this->font()).height();
wRowsHeight = (wRowsHeight * 105) / 100;
@@ -110,13 +110,14 @@ void AbstractTableView::paintEvent(QPaintEvent* event)
// Paints cell contents
if(i < mNbrOfLineToPrint)
{
- QString wStr = paintContent(&wPainter, mTableOffset, i, j, x, y, getColumnWidth(j), getRowHeight());
- wPainter.drawText(QRect(x + 4, y, getColumnWidth(j) - 4, getRowHeight()), Qt::AlignVCenter | Qt::AlignLeft, wStr);
+ QString wStr = paintContent(&wPainter, mTableOffset, i, j, x, y, getColumnWidth(j), getRowHeight());
+ if(wStr.length())
+ wPainter.drawText(QRect(x + 4, y, getColumnWidth(j) - 4, getRowHeight()), Qt::AlignVCenter | Qt::AlignLeft, wStr);
}
// Paints cell right borders
- wPainter.save() ;
- wPainter.setPen(QColor(128, 128, 128));
+ wPainter.save();
+ wPainter.setPen(QColor("#808080"));
wPainter.drawLine(x + getColumnWidth(j) - 1, y, x + getColumnWidth(j) - 1, y + getRowHeight() - 1);
wPainter.restore();
@@ -144,118 +145,118 @@ void AbstractTableView::paintEvent(QPaintEvent* event)
*/
void AbstractTableView::mouseMoveEvent(QMouseEvent* event)
{
- // qDebug() << "mouseMoveEvent";
+ // qDebug() << "mouseMoveEvent";
switch (mGuiState)
{
- case AbstractTableView::NoState:
+ case AbstractTableView::NoState:
+ {
+ //qDebug() << "State = NoState";
+
+ int wColIndex = getColumnIndexFromX(event->x());
+ int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column
+ int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column
+
+ if(event->buttons() == Qt::NoButton)
{
- //qDebug() << "State = NoState";
+ bool wHandle = true;
+ bool wHasCursor;
- int wColIndex = getColumnIndexFromX(event->x());
- int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column
- int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column
+ wHasCursor = cursor().shape() == Qt::SplitHCursor ? true : false;
- if(event->buttons() == Qt::NoButton)
+ if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2))))
{
- bool wHandle = true;
- bool wHasCursor;
-
- wHasCursor = cursor().shape() == Qt::SplitHCursor ? true : false;
-
- if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2))))
- {
- wHandle = true;
- }
- else
- {
- wHandle = false;
- }
-
- if((wHandle == true) && (wHasCursor == false))
- {
- setCursor(Qt::SplitHCursor);
- mColResizeData.splitHandle = true;
- mGuiState = AbstractTableView::ReadyToResize;
- }
- if ((wHandle == false) && (wHasCursor == true))
- {
- unsetCursor();
- mColResizeData.splitHandle = false;
- mGuiState = AbstractTableView::NoState;
- }
+ wHandle = true;
}
else
{
- QWidget::mouseMoveEvent(event);
+ wHandle = false;
}
- break;
- }
- case AbstractTableView::ReadyToResize:
- {
- //qDebug() << "State = ReadyToResize";
- int wColIndex = getColumnIndexFromX(event->x());
- int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column
- int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column
-
- if(event->buttons() == Qt::NoButton)
+ if((wHandle == true) && (wHasCursor == false))
{
- bool wHandle = true;
-
- if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2))))
- {
- wHandle = true;
- }
- else
- {
- wHandle = false;
- }
-
- if ((wHandle == false) && (mGuiState == AbstractTableView::ReadyToResize))
- {
- unsetCursor();
- mColResizeData.splitHandle = false;
- mGuiState = AbstractTableView::NoState;
- }
+ setCursor(Qt::SplitHCursor);
+ mColResizeData.splitHandle = true;
+ mGuiState = AbstractTableView::ReadyToResize;
}
- break;
- }
- case AbstractTableView::ResizeColumnState:
- {
- //qDebug() << "State = ResizeColumnState";
-
- int delta = event->x() - mColResizeData.lastPosX;
-
- int wNewSize = ((getColumnWidth(mColResizeData.index) + delta) >= 20) ? (getColumnWidth(mColResizeData.index) + delta) : (20);
-
- setColumnWidth(mColResizeData.index, wNewSize);
-
- mColResizeData.lastPosX = event->x();
-
- repaint();
-
- break;
- }
- case AbstractTableView::HeaderButtonPressed:
- {
- //qDebug() << "State = HeaderButtonPressed";
-
- int wColIndex = getColumnIndexFromX(event->x());
-
- if((wColIndex == mHeader.activeButtonIndex) && (event->y() <= getHeaderHeight()) && (event->y() >= 0))
+ if ((wHandle == false) && (wHasCursor == true))
{
- mColumnList[mHeader.activeButtonIndex].header.isMouseOver = true;
+ unsetCursor();
+ mColResizeData.splitHandle = false;
+ mGuiState = AbstractTableView::NoState;
+ }
+ }
+ else
+ {
+ QWidget::mouseMoveEvent(event);
+ }
+ break;
+ }
+ case AbstractTableView::ReadyToResize:
+ {
+ //qDebug() << "State = ReadyToResize";
+
+ int wColIndex = getColumnIndexFromX(event->x());
+ int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column
+ int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column
+
+ if(event->buttons() == Qt::NoButton)
+ {
+ bool wHandle = true;
+
+ if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2))))
+ {
+ wHandle = true;
}
else
{
- mColumnList[mHeader.activeButtonIndex].header.isMouseOver = false;
+ wHandle = false;
}
- repaint();
+ if ((wHandle == false) && (mGuiState == AbstractTableView::ReadyToResize))
+ {
+ unsetCursor();
+ mColResizeData.splitHandle = false;
+ mGuiState = AbstractTableView::NoState;
+ }
}
- default:
- break;
+ break;
+ }
+ case AbstractTableView::ResizeColumnState:
+ {
+ //qDebug() << "State = ResizeColumnState";
+
+ int delta = event->x() - mColResizeData.lastPosX;
+
+ int wNewSize = ((getColumnWidth(mColResizeData.index) + delta) >= 20) ? (getColumnWidth(mColResizeData.index) + delta) : (20);
+
+ setColumnWidth(mColResizeData.index, wNewSize);
+
+ mColResizeData.lastPosX = event->x();
+
+ repaint();
+
+ break;
+ }
+ case AbstractTableView::HeaderButtonPressed:
+ {
+ //qDebug() << "State = HeaderButtonPressed";
+
+ int wColIndex = getColumnIndexFromX(event->x());
+
+ if((wColIndex == mHeader.activeButtonIndex) && (event->y() <= getHeaderHeight()) && (event->y() >= 0))
+ {
+ mColumnList[mHeader.activeButtonIndex].header.isMouseOver = true;
+ }
+ else
+ {
+ mColumnList[mHeader.activeButtonIndex].header.isMouseOver = false;
+ }
+
+ repaint();
+ }
+ default:
+ break;
}
}
@@ -454,31 +455,31 @@ void AbstractTableView::vertSliderActionSlot(int action)
// Determine the delta
switch(action)
{
- case QAbstractSlider::SliderNoAction:
- break;
- case QAbstractSlider::SliderSingleStepAdd:
- wDelta = 1;
- break;
- case QAbstractSlider::SliderSingleStepSub:
- wDelta = -1;
- break;
- case QAbstractSlider::SliderPageStepAdd:
- wDelta = 30;
- break;
- case QAbstractSlider::SliderPageStepSub:
- wDelta = -30;
- break;
- case QAbstractSlider::SliderToMinimum:
- case QAbstractSlider::SliderToMaximum:
- case QAbstractSlider::SliderMove:
+ case QAbstractSlider::SliderNoAction:
+ break;
+ case QAbstractSlider::SliderSingleStepAdd:
+ wDelta = 1;
+ break;
+ case QAbstractSlider::SliderSingleStepSub:
+ wDelta = -1;
+ break;
+ case QAbstractSlider::SliderPageStepAdd:
+ wDelta = 30;
+ break;
+ case QAbstractSlider::SliderPageStepSub:
+ wDelta = -30;
+ break;
+ case QAbstractSlider::SliderToMinimum:
+ case QAbstractSlider::SliderToMaximum:
+ case QAbstractSlider::SliderMove:
#ifdef _WIN64
- wDelta = scaleFromScrollBarRangeToUint64(wSliderPos) - mTableOffset;
+ wDelta = scaleFromScrollBarRangeToUint64(wSliderPos) - mTableOffset;
#else
- wDelta = wSliderPos - mTableOffset;
+ wDelta = wSliderPos - mTableOffset;
#endif
- break;
- default:
- break;
+ break;
+ default:
+ break;
}
// Call the hook (Usefull for disassembly)
@@ -783,9 +784,9 @@ void AbstractTableView::setColTitle(int index, QString title)
{
if(mColumnList.size() > 0 && index >= 0 && index < mColumnList.size())
{
- Column_t wColum = mColumnList.takeAt(index);
- wColum.title = title;
- mColumnList.insert(index - 1, wColum);
+ Column_t wColum = mColumnList.takeAt(index);
+ wColum.title = title;
+ mColumnList.insert(index - 1, wColum);
}
}
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
index 5738e257..a02259a9 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
@@ -92,16 +92,16 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
{
if(bpxtype&bp_normal) //breakpoint
{
- painter->setPen(QPen(QColor("#ff0000")));
+ painter->setPen(QPen(QColor("#FF0000")));
}
else
{
- painter->setPen(QPen(QColor("#fffbf0")));
+ painter->setPen(QPen(QColor("#FFFBF0")));
}
}
else
{
- painter->setPen(QPen(QColor("#fee970")));
+ painter->setPen(QPen(QColor("#FEE970")));
}
}
else //other address
@@ -111,12 +111,12 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
if(*label) //label
{
if(bpxtype==bp_none) //label only
- painter->setPen(QPen(QColor("#ff0000"))); //red -> address + label text
+ painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text
else //label+breakpoint
{
if(bpxtype&bp_normal)
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red
}
else
{
@@ -137,7 +137,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
{
if(bpxtype&bp_normal)
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red
}
else
{
@@ -151,7 +151,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
}
else
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#fee970")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970")));
if(wIsSelected)
painter->setPen(QPen(QColor("#000000"))); //black address
else
@@ -543,9 +543,9 @@ int Disassembly::paintJumpsGraphic(QPainter* painter, int x, int y, int_t addr)
painter->save() ;
if(DbgIsJumpGoingToExecute(instruction.rva+mBase)) //change pen color when jump is executed
- painter->setPen(QColor(255, 0, 0));
+ painter->setPen(QColor("#FF0000"));
else
- painter->setPen(QColor(128, 128, 128));
+ painter->setPen(QColor("#808080"));
if(wPict == GD_Vert)
{
diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
index 25b740cb..3aec7fe2 100644
--- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
@@ -209,7 +209,7 @@ void HexDump::printSelected(QPainter* painter, int_t rowBase, int rowOffset, int
wSelectionWidth = wItemPixWidth > w - (wSelectionX - x) ? w - (wSelectionX - x) : wItemPixWidth;
wSelectionWidth = wSelectionWidth < 0 ? 0 : wSelectionWidth;
- painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor(192,192,192)));
+ painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor("#C0C0C0")));
}
}
}
diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp
index 06ac2337..15f6f4db 100644
--- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp
@@ -13,7 +13,7 @@ RegistersView::RegistersView(QWidget *parent) : QWidget(parent), ui(new Ui::Regi
// Set background color
QPalette wPalette;
- wPalette.setColor(QPalette::Window, QColor(255, 251, 240));
+ wPalette.setColor(QPalette::Window, QColor("#FFFBF0"));
this->setAutoFillBackground(true);
this->setPalette(wPalette);
diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
index 449004ea..65145d7f 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
@@ -49,7 +49,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
}
else if(DbgScriptBpGet(line)) //breakpoint
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000")));
painter->setPen(QPen(QColor("#000000"))); //black address
}
else
@@ -95,7 +95,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
if(isScriptCommand(command, "ret"))
{
newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor(0,255,255);
+ newRichText.textBackground=QColor("#00FFFF");
newRichText.text="ret";
richText.push_back(newRichText);
QString remainder=command.right(command.length()-3);
@@ -125,7 +125,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
{
case scriptjmp: //unconditional jumps
newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor(255,255,0);
+ newRichText.textBackground=QColor("#FFFF00");
break;
case scriptjnejnz: //conditional jumps
@@ -135,13 +135,13 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
case scriptjbejle:
case scriptjaejge:
newRichText.flags=FlagAll;
- newRichText.textBackground=QColor(255,255,0);
- newRichText.textColor=QColor(255,0,0);
+ newRichText.textBackground=QColor("#FFFF00");
+ newRichText.textColor=QColor("#FF0000");
break;
case scriptcall: //calls
newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor(0,255,255);
+ newRichText.textBackground=QColor("#00FFFF");
break;
default:
@@ -157,7 +157,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
//label
QString label=branchinfo.branchlabel;
newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor(255,255,0);
+ newRichText.textBackground=QColor("#FFFF00");
newRichText.text=label;
richText.push_back(newRichText);
//remainder
diff --git a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp
index 3e1d69ef..63917bb8 100644
--- a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp
@@ -23,7 +23,7 @@ StdTable::StdTable(QWidget *parent) : AbstractTableView(parent)
QString StdTable::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h)
{
if(isSelected(rowBase, rowOffset) == true)
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor(192,192,192)));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#808080")));
//return "c " + QString::number(col) + " r " + QString::number(rowBase + rowOffset);
return mData->at(col)->at(rowBase + rowOffset);
diff --git a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp
index 1bf8adcd..540607d8 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp
@@ -201,7 +201,7 @@ QString ThreadView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
{
painter->save();
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000")));
- painter->setPen(QPen(QColor("#ffffff"))); //white text
+ painter->setPen(QPen(QColor("#FFFFFF"))); //white text
painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, ret);
painter->restore();
ret="";
diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
index 7381393b..6acd9376 100644
--- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
+++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
@@ -71,13 +71,13 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
int basereg=Argument->Memory.BaseRegister;
if(basereg®4 || basereg®5) //esp || ebp
{
- argument.textBackground=QColor(0,255,255);
+ argument.textBackground=QColor("#00FFFF");
argument.flags=FlagBackground;
//Highlight ESP || EBP memory move
}
else
{
- argument.textColor=QColor(0,0,128);
+ argument.textColor=QColor("#000080");
argument.flags=FlagColor;
}
@@ -144,7 +144,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
if(argmnemonic.indexOf(label_addr_text)!=-1)
{
argument.flags=FlagBackground;
- argument.textBackground=QColor(255,255,0);
+ argument.textBackground=QColor("#FFFF00");
argmnemonic.replace(label_addr_text, newText);
}
}
@@ -154,7 +154,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
if(argmnemonic.indexOf(label_addr_text)!=-1)
{
argument.flags=FlagBackground;
- argument.textBackground=QColor(255,255,0);
+ argument.textBackground=QColor("#FFFF00");
argmnemonic.replace(label_addr_text, newText);
}
}
@@ -173,7 +173,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
if(brtype && brtype!=RetType && !(argtype®ISTER_TYPE))
{
argument.flags=FlagBackground;
- argument.textBackground=QColor(255,255,0);
+ argument.textBackground=QColor("#FFFF00");
unsigned char* opc=(unsigned char*)&Instruction->Opcode;
if(*opc==0xEB || *opc==0xE9 || Instruction->Opcode<0x80)
@@ -207,33 +207,33 @@ void BeaHighlight::PrintBaseInstruction(QList* richText, const
if(brtype==RetType || brtype==CallType)
{
mnemonic.flags=FlagBackground;
- mnemonic.textBackground=QColor(0,255,255);
+ mnemonic.textBackground=QColor("#00FFFF");
//calls && rets
}
else if(brtype==JmpType)
{
mnemonic.flags=FlagBackground;
- mnemonic.textBackground=QColor(255,255,0);
+ mnemonic.textBackground=QColor("#FFFF00");
//uncond jumps
}
else
{
mnemonic.flags=FlagAll;
- mnemonic.textBackground=QColor(255,255,0);
- mnemonic.textColor=QColor(255,0,0);
+ mnemonic.textBackground=QColor("#FFFF00");
+ mnemonic.textColor=QColor("#FF0000");
//cond jumps
}
}
else if(!_stricmp(mnemonicText, "push") || !_stricmp(mnemonicText, "pop"))
{
mnemonic.flags=FlagColor;
- mnemonic.textColor=QColor(0,0,255);
+ mnemonic.textColor=QColor("#0000FF");
//push/pop
}
else if(!_stricmp(mnemonicText, "nop"))
{
mnemonic.flags=FlagColor;
- mnemonic.textColor=QColor(128,128,128);
+ mnemonic.textColor=QColor("#808080");
//nop
}
else
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
index 63213ed3..4669e538 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
@@ -77,7 +77,7 @@ QString CPUStack::paintContent(QPainter* painter, int_t rowBase, int rowOffset,
if(wVa==mCsp) //CSP
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000")));
- painter->setPen(QPen(QColor("#fffbf0")));
+ painter->setPen(QPen(QColor("#FFFBF0")));
}
else if(wIsSelected)
painter->setPen(QPen(QColor("#000000"))); //black address
From ebfca9adf7a71c2b62ddb074f90f31871655e88f Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 26 Apr 2014 21:19:01 +0200
Subject: [PATCH 007/676] GUI: color fix in StdTable
---
x64_dbg_gui/Project/Src/BasicView/StdTable.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp
index 63917bb8..11f03b3c 100644
--- a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp
@@ -23,7 +23,7 @@ StdTable::StdTable(QWidget *parent) : AbstractTableView(parent)
QString StdTable::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h)
{
if(isSelected(rowBase, rowOffset) == true)
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#808080")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0")));
//return "c " + QString::number(col) + " r " + QString::number(rowBase + rowOffset);
return mData->at(col)->at(rowBase + rowOffset);
From 4c848c16c384d61b92fc389c8bba6ad2e7eb9915 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 26 Apr 2014 21:35:11 +0200
Subject: [PATCH 008/676] GUI: fixed a bug when tabs are detached
---
x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
index 8ee99d4f..209b9917 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
@@ -113,11 +113,13 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event)
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
{
- // Only accept if it's an tab-reordering request
+ // Only accept if it's an tab-reordering request (not a detach request)
const QMimeData* m = event->mimeData();
- if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
+ if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
+ {
event->acceptProposedAction();
+ }
QTabBar::dragEnterEvent(event);
}
@@ -125,10 +127,10 @@ void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
{
- // Only accept if it's an tab-reordering request
+ // Only accept if it's an tab-reordering request (not a detach request)
const QMimeData* m = event->mimeData();
- if (m->formats().contains("action") && (m->data("action") == "application/tab-detach"))
+ if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
{
m_dragMovedPos = event->pos();
event->acceptProposedAction();
From 0a115ec8f3c4d926c61380b4d6e70338e92347da Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 26 Apr 2014 23:01:01 +0200
Subject: [PATCH 009/676] GUI: color commenting
---
.../Src/BasicView/AbstractTableView.cpp | 4 +-
.../Project/Src/BasicView/Disassembly.cpp | 63 ++++++++++---------
x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 4 +-
.../Project/Src/BasicView/ScriptView.cpp | 16 ++---
.../Project/Src/Disassembler/BeaHighlight.cpp | 22 +++----
5 files changed, 58 insertions(+), 51 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
index ce0e03bc..6790e488 100644
--- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp
@@ -19,7 +19,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare
font.setStyleHint(QFont::Monospace);
this->setFont(font);
- backgroundColor=QColor("#FFFBF0");
+ backgroundColor=QColor("#FFFBF0"); //AbstractTableViewBackgroundColor
int wRowsHeight = QFontMetrics(this->font()).height();
wRowsHeight = (wRowsHeight * 105) / 100;
@@ -117,7 +117,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event)
// Paints cell right borders
wPainter.save();
- wPainter.setPen(QColor("#808080"));
+ wPainter.setPen(QColor("#808080")); //AbstractTableViewSeparatorColor
wPainter.drawLine(x + getColumnWidth(j) - 1, y, x + getColumnWidth(j) - 1, y + getRowHeight() - 1);
wPainter.restore();
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
index a02259a9..f9c8d023 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
@@ -32,6 +32,8 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent)
setShowHeader(false); //hide header
+ backgroundColor=QColor("#FFFBF0"); //DisassemblyBackgroundColor
+
connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t)));
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE)));
connect(Bridge::getBridge(), SIGNAL(repaintGui()), this, SLOT(reloadData()));
@@ -57,13 +59,12 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent)
*/
QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h)
{
- QString wStr = "";
int_t wRVA = mInstBuffer.at(rowOffset).rva;
bool wIsSelected = isSelected(&mInstBuffer, rowOffset); // isSelected(rowBase, rowOffset);
// Highlight if selected
if(wIsSelected)
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); //DisassemblySelectionColor
switch(col)
{
@@ -87,21 +88,21 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
painter->save();
if(mInstBuffer.at(rowOffset).rva == mCipRva) //cip
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); //DisassemblyCipColor
if(!isbookmark)
{
if(bpxtype&bp_normal) //breakpoint
{
- painter->setPen(QPen(QColor("#FF0000")));
+ painter->setPen(QPen(QColor("#FF0000"))); //DisassemblyMainBpColor
}
else
{
- painter->setPen(QPen(QColor("#FFFBF0")));
+ painter->setPen(QPen(QColor("#FFFBF0"))); //DisassemblyOtherBpColor
}
}
else
{
- painter->setPen(QPen(QColor("#FEE970")));
+ painter->setPen(QPen(QColor("#FEE970"))); //DisassemblyBookmarkColor
}
}
else //other address
@@ -111,16 +112,16 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
if(*label) //label
{
if(bpxtype==bp_none) //label only
- painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text
+ painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text (DisassemblyMainLabelColor)
else //label+breakpoint
{
if(bpxtype&bp_normal)
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red (DisassemblyMainBpColor)
}
else
{
- painter->setPen(QPen(QColor("#000000"))); //black address
+ painter->setPen(QPen(QColor("#000000"))); //black address (???)
}
}
}
@@ -129,33 +130,33 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
if(bpxtype==bp_none) //no label, no breakpoint
{
if(wIsSelected)
- painter->setPen(QPen(QColor("#000000"))); //black address
+ painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor)
else
- painter->setPen(QPen(QColor("#808080")));
+ painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor
}
else //breakpoint only
{
if(bpxtype&bp_normal)
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red (DisassemblyMainBpColor)
}
else
{
if(wIsSelected)
- painter->setPen(QPen(QColor("#000000"))); //black address
+ painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor)
else
- painter->setPen(QPen(QColor("#808080")));
+ painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor
}
}
}
}
- else
+ else //bookmark
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970"))); //DisassemblyBookmarkColor
if(wIsSelected)
- painter->setPen(QPen(QColor("#000000"))); //black address
+ painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor)
else
- painter->setPen(QPen(QColor("#808080")));
+ painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor
}
}
painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, addrText);
@@ -192,13 +193,14 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
int jumpsize = paintJumpsGraphic(painter, x + funcsize, y, wRVA); //jump line
//draw bytes
+ painter->save();
+ painter->setPen(QColor("#000000")); //DisassemblyBytesColor
+ QString wBytes = "";
for(int i = 0; i < mInstBuffer.at(rowOffset).dump.size(); i++)
- wStr += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper();
-
- painter->drawText(QRect(x + jumpsize + funcsize, y, getColumnWidth(col) - jumpsize - funcsize, getRowHeight()), 0, wStr);
-
- wStr = "";
+ wBytes += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper();
+ painter->drawText(QRect(x + jumpsize + funcsize, y, getColumnWidth(col) - jumpsize - funcsize, getRowHeight()), 0, wBytes);
+ painter->restore();
break;
}
@@ -245,9 +247,12 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
{
char comment[MAX_COMMENT_SIZE]="";
if(DbgGetCommentAt(mInstBuffer.at(rowOffset).rva+mBase, comment))
- wStr=QString(comment);
- else
- wStr="";
+ {
+ painter->save();
+ painter->setPen(QColor("#000000")); //DisassemblyCommentColor
+ painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment));
+ painter->restore();
+ }
}
break;
@@ -255,7 +260,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
break;
}
- return wStr;
+ return "";
}
@@ -543,9 +548,9 @@ int Disassembly::paintJumpsGraphic(QPainter* painter, int x, int y, int_t addr)
painter->save() ;
if(DbgIsJumpGoingToExecute(instruction.rva+mBase)) //change pen color when jump is executed
- painter->setPen(QColor("#FF0000"));
+ painter->setPen(QColor("#FF0000")); //DisassemblyJumpLineTrueColor
else
- painter->setPen(QColor("#808080"));
+ painter->setPen(QColor("#808080")); //DisassemblyJumpLineFalseColor
if(wPict == GD_Vert)
{
diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
index 3aec7fe2..dfa6456c 100644
--- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
@@ -17,6 +17,8 @@ HexDump::HexDump(QWidget *parent) : AbstractTableView(parent)
clearDescriptors();
+ backgroundColor=QColor("#FFFBF0"); //HexDumpBackgroundColor
+
connect(Bridge::getBridge(), SIGNAL(updateDump()), this, SLOT(reloadData()));
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChanged(DBGSTATE)));
}
@@ -209,7 +211,7 @@ void HexDump::printSelected(QPainter* painter, int_t rowBase, int rowOffset, int
wSelectionWidth = wItemPixWidth > w - (wSelectionX - x) ? w - (wSelectionX - x) : wItemPixWidth;
wSelectionWidth = wSelectionWidth < 0 ? 0 : wSelectionWidth;
- painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor("#C0C0C0")));
+ painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor("#C0C0C0"))); //HexDumpSelectionColor
}
}
}
diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
index 65145d7f..4dd11ecb 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
@@ -29,7 +29,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
bool wIsSelected=isSelected(rowBase, rowOffset);
// Highlight if selected
if(wIsSelected)
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); //ScriptViewSelectionColor
QString returnString;
int line=rowBase+rowOffset+1;
SCRIPTLINETYPE linetype=DbgScriptGetLineType(line);
@@ -41,23 +41,23 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
painter->save();
if(line==mIpLine) //IP
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000")));
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); //ScriptViewIpColor
if(DbgScriptBpGet(line)) //breakpoint
- painter->setPen(QPen(QColor("#FF0000"))); //red address
+ painter->setPen(QPen(QColor("#FF0000"))); //red address (ScriptViewMainBpColor)
else
- painter->setPen(QPen(QColor("#FFFFFF"))); //white address
+ painter->setPen(QPen(QColor("#FFFFFF"))); //white address (ScriptViewIpTextColor)
}
else if(DbgScriptBpGet(line)) //breakpoint
{
- painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000")));
- painter->setPen(QPen(QColor("#000000"))); //black address
+ painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //ScriptViewMainBpColor
+ painter->setPen(QPen(QColor("#000000"))); //black address //ScripViewMainBpTextColor
}
else
{
if(linetype==linecommand || linetype==linebranch)
- painter->setPen(QPen(QColor("#000000"))); //black address
+ painter->setPen(QPen(QColor("#000000"))); //black address (ScriptViewMainTextColor)
else
- painter->setPen(QPen(QColor("#808080"))); //grey address
+ painter->setPen(QPen(QColor("#808080"))); //grey address (ScriptViewOtherTextColor)
}
painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, returnString);
painter->restore();
diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
index 6acd9376..a81d186b 100644
--- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
+++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp
@@ -71,13 +71,13 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
int basereg=Argument->Memory.BaseRegister;
if(basereg®4 || basereg®5) //esp || ebp
{
- argument.textBackground=QColor("#00FFFF");
+ argument.textBackground=QColor("#00FFFF"); //DisassemblyStackPointerColor
argument.flags=FlagBackground;
//Highlight ESP || EBP memory move
}
else
{
- argument.textColor=QColor("#000080");
+ argument.textColor=QColor("#000080"); //DisassemblyPointerColor
argument.flags=FlagColor;
}
@@ -144,7 +144,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
if(argmnemonic.indexOf(label_addr_text)!=-1)
{
argument.flags=FlagBackground;
- argument.textBackground=QColor("#FFFF00");
+ argument.textBackground=QColor("#FFFF00"); //DisassemblyModulePointerColor
argmnemonic.replace(label_addr_text, newText);
}
}
@@ -154,7 +154,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
if(argmnemonic.indexOf(label_addr_text)!=-1)
{
argument.flags=FlagBackground;
- argument.textBackground=QColor("#FFFF00");
+ argument.textBackground=QColor("#FFFF00"); //DisassemblyModulePointerColor
argmnemonic.replace(label_addr_text, newText);
}
}
@@ -173,7 +173,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP
if(brtype && brtype!=RetType && !(argtype®ISTER_TYPE))
{
argument.flags=FlagBackground;
- argument.textBackground=QColor("#FFFF00");
+ argument.textBackground=QColor("#FFFF00"); //DisassemblyModulePointerColor
unsigned char* opc=(unsigned char*)&Instruction->Opcode;
if(*opc==0xEB || *opc==0xE9 || Instruction->Opcode<0x80)
@@ -207,33 +207,33 @@ void BeaHighlight::PrintBaseInstruction(QList* richText, const
if(brtype==RetType || brtype==CallType)
{
mnemonic.flags=FlagBackground;
- mnemonic.textBackground=QColor("#00FFFF");
+ mnemonic.textBackground=QColor("#00FFFF"); //DisassemblyRetCallColor
//calls && rets
}
else if(brtype==JmpType)
{
mnemonic.flags=FlagBackground;
- mnemonic.textBackground=QColor("#FFFF00");
+ mnemonic.textBackground=QColor("#FFFF00"); //DisassemblyJumpColor
//uncond jumps
}
else
{
mnemonic.flags=FlagAll;
- mnemonic.textBackground=QColor("#FFFF00");
- mnemonic.textColor=QColor("#FF0000");
+ mnemonic.textBackground=QColor("#FFFF00"); //DisassemblyJumpColor
+ mnemonic.textColor=QColor("#FF0000"); //DisassemblyCondJumpColor
//cond jumps
}
}
else if(!_stricmp(mnemonicText, "push") || !_stricmp(mnemonicText, "pop"))
{
mnemonic.flags=FlagColor;
- mnemonic.textColor=QColor("#0000FF");
+ mnemonic.textColor=QColor("#0000FF"); //DisassemblyPushPopColor
//push/pop
}
else if(!_stricmp(mnemonicText, "nop"))
{
mnemonic.flags=FlagColor;
- mnemonic.textColor=QColor("#808080");
+ mnemonic.textColor=QColor("#808080"); //DisassemblyNopColor
//nop
}
else
From ddc365afd854857efae5ff65bb00b26a401f6b80 Mon Sep 17 00:00:00 2001
From: Nukem
Date: Sat, 26 Apr 2014 19:16:04 -0400
Subject: [PATCH 010/676] GUI: Allow windows to be dragged into tabs
---
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 28 +++++++++++++++++++----
x64_dbg_gui/Project/Src/Gui/tabwidget.h | 10 +++++---
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
index 4c0d65f2..476d0e3c 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
@@ -77,7 +77,7 @@ void MHTabWidget::MoveTab(int fromIndex, int toIndex)
void MHTabWidget::DetachTab(int index, QPoint& dropPoint)
{
// Create the window
- MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget());
+ MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this);
detachedWidget->setWindowModality(Qt::NonModal);
// Find Widget and connect
@@ -138,8 +138,9 @@ void MHTabWidget::AttachTab(QWidget *parent)
//----------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////
-MHDetachedWindow::MHDetachedWindow(QWidget *parent) : QMainWindow(parent)
+MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent)
{
+ m_TabWidget = tabwidget;
}
//////////////////////////////////////////////////////////////////////////////
@@ -147,9 +148,28 @@ MHDetachedWindow::~MHDetachedWindow(void)
{
}
+//////////////////////////////////////////////////////////////////////////////
+void MHDetachedWindow::moveEvent(QMoveEvent *event)
+{
+ QRect rect = m_TabWidget->geometry();
+ QSize hint = m_TabWidget->tabBar()->sizeHint();
+
+ // Height of the actual top tab bar (with a buffer of 30)
+ rect.setBottom(rect.top() + hint.height() + 30);
+
+ if (rect.contains(event->pos()))
+ {
+ m_TabWidget->AttachTab(this);
+ event->accept();
+ }
+ else
+ {
+ QMainWindow::moveEvent(event);
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////
void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/)
{
emit OnClose(this);
-}
-
+}
\ No newline at end of file
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
index 252c8c24..2b1b3510 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
@@ -5,6 +5,7 @@
#include
#include
#include
+#include
// Qt forward class definitions
class MHTabBar;
@@ -56,16 +57,19 @@ private:
//////////////////////////////////////////////////////////////////////////////
class MHDetachedWindow : public QMainWindow
{
- Q_OBJECT
+ Q_OBJECT
public:
- MHDetachedWindow(QWidget *parent = 0);
+ MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0);
~MHDetachedWindow(void);
protected:
+ MHTabWidget *m_TabWidget;
+
+ virtual void moveEvent(QMoveEvent *event);
void closeEvent(QCloseEvent *event);
signals:
- void OnClose (QWidget* widget);
+ void OnClose(QWidget* widget);
};
#endif // __MHTABWIDGET_H__
From 4008a80322340b7a89e08915d420ff65e8d8bccc Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sun, 27 Apr 2014 03:13:12 +0200
Subject: [PATCH 011/676] GUI: fixed crashes with Qt4
---
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 13 ++++++++-----
x64_dbg_gui/Project/Src/Gui/tabwidget.h | 1 +
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
index 476d0e3c..711e378a 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
@@ -17,6 +17,11 @@ MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
m_Windows.clear();
}
+QTabBar* MHTabWidget::tabBar()
+{
+ return m_tabBar;
+}
+
//////////////////////////////////////////////////////////////
// Default Destructor
//////////////////////////////////////////////////////////////
@@ -113,9 +118,6 @@ void MHTabWidget::AttachTab(QWidget *parent)
MHDetachedWindow* detachedWidget = dynamic_cast(parent);
QWidget* tearOffWidget = detachedWidget->centralWidget();
- // Change parent
- tearOffWidget->setParent(this);
-
// Reattach the tab
int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
@@ -132,7 +134,8 @@ void MHTabWidget::AttachTab(QWidget *parent)
// Cleanup Window
disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
- delete detachedWidget;
+ detachedWidget->hide();
+ detachedWidget->close();
}
//----------------------------------------------------------------------------
@@ -172,4 +175,4 @@ void MHDetachedWindow::moveEvent(QMoveEvent *event)
void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/)
{
emit OnClose(this);
-}
\ No newline at end of file
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
index 2b1b3510..183a5936 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
@@ -22,6 +22,7 @@ class MHTabWidget: public QTabWidget
public:
MHTabWidget(QWidget *parent);
virtual ~MHTabWidget(void);
+ QTabBar* tabBar();
public slots:
int count() const;
From 78c15c17d0f89d9eae648f334a8ccbc88b6f4acf Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sun, 27 Apr 2014 17:40:35 +0200
Subject: [PATCH 012/676] GUI: fixed a bug with the TabWidget
---
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
index 711e378a..3e58dfbd 100644
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
@@ -157,8 +157,12 @@ void MHDetachedWindow::moveEvent(QMoveEvent *event)
QRect rect = m_TabWidget->geometry();
QSize hint = m_TabWidget->tabBar()->sizeHint();
- // Height of the actual top tab bar (with a buffer of 30)
- rect.setBottom(rect.top() + hint.height() + 30);
+ // Height of the actual top tab bar
+ rect.setBottom(rect.top() + hint.height());
+ QPoint pos1(rect.x(), rect.y());
+ pos1=m_TabWidget->mapToGlobal(pos1);
+ rect.setX(pos1.x());
+ rect.setY(pos1.y());
if (rect.contains(event->pos()))
{
From f2ccaa5c3a2cf8cfa8305e9a778602dfaf7a8288 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Mon, 28 Apr 2014 01:03:06 +0200
Subject: [PATCH 013/676] GUI: double click toggles a breakpoint (like F2)
---
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp | 6 ++++++
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 1 +
2 files changed, 7 insertions(+)
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 5de82e26..3545b37c 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -20,6 +20,12 @@ void CPUDisassembly::mousePressEvent(QMouseEvent* event)
Disassembly::mousePressEvent(event);
}
+void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event)
+{
+ toggleInt3BPAction();
+ Disassembly::mouseDoubleClickEvent(event);
+}
+
/************************************************************************************
Mouse Management
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
index 55e18828..09196ce8 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
@@ -22,6 +22,7 @@ public:
// Mouse Management
void contextMenuEvent(QContextMenuEvent* event);
void mousePressEvent(QMouseEvent* event);
+ void mouseDoubleClickEvent(QMouseEvent* event);
// Context Menu Management
void setupRightClickContextMenu();
From c0315bac1e794a0a56e596d68c678ef79613b69a Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Mon, 28 Apr 2014 02:07:37 +0200
Subject: [PATCH 014/676] GUI: added rva display feature in disassembly
GUI: double click does different stuff in different columns
---
.../Project/Src/BasicView/Disassembly.cpp | 34 ++++++++++++-
.../Project/Src/BasicView/Disassembly.h | 5 ++
.../Project/Src/Gui/CPUDisassembly.cpp | 51 ++++++++++++++++---
3 files changed, 82 insertions(+), 8 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
index f9c8d023..a4fd4fa4 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
@@ -72,7 +72,36 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
{
char label[MAX_LABEL_SIZE]="";
int_t cur_addr=mInstBuffer.at(rowOffset).rva+mBase;
- QString addrText=QString("%1").arg(cur_addr, sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ QString addrText="";
+ if(mRvaDisplayEnabled) //RVA display
+ {
+ int_t rva=cur_addr-mRvaDisplayBase;
+ if(rva == 0)
+ {
+#ifdef _WIN64
+ addrText="$ ==> ";
+#else
+ addrText="$ ==> ";
+#endif //_WIN64
+ }
+ else if(rva > 0)
+ {
+#ifdef _WIN64
+ addrText="$+"+QString("%1").arg(rva, -15, 16, QChar(' ')).toUpper();
+#else
+ addrText="$+"+QString("%1").arg(rva, -7, 16, QChar(' ')).toUpper();
+#endif //_WIN64
+ }
+ else if(rva < 0)
+ {
+#ifdef _WIN64
+ addrText="$-"+QString("%1").arg(-rva, -15, 16, QChar(' ')).toUpper();
+#else
+ addrText="$-"+QString("%1").arg(-rva, -7, 16, QChar(' ')).toUpper();
+#endif //_WIN64
+ }
+ }
+ addrText += QString("%1").arg(cur_addr, sizeof(int_t)*2, 16, QChar('0')).toUpper();
if(DbgGetLabelAt(cur_addr, SEG_DEFAULT, label)) //has label
{
char module[MAX_MODULE_SIZE]="";
@@ -1018,6 +1047,9 @@ void Disassembly::disassembleAt(int_t parVA, int_t parCIP, bool history, int_t n
mBase = wBase;
mSize = wSize;
+ if(mRvaDisplayEnabled && mBase != mRvaDisplayPageBase)
+ mRvaDisplayEnabled = false;
+
setRowCount(wSize);
setSingleSelection(wRVA); // Selects disassembled instruction
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
index 0f135e5f..112871c7 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
@@ -126,6 +126,11 @@ private:
QList mVaHistory;
int mCurrentVa;
+
+protected:
+ bool mRvaDisplayEnabled;
+ uint_t mRvaDisplayBase;
+ int_t mRvaDisplayPageBase;
};
#endif // DISASSEMBLY_H
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 3545b37c..5d8e3a25 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -22,8 +22,45 @@ void CPUDisassembly::mousePressEvent(QMouseEvent* event)
void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event)
{
- toggleInt3BPAction();
- Disassembly::mouseDoubleClickEvent(event);
+ switch(getColumnIndexFromX(event->x()))
+ {
+ case 0: //address
+ {
+ int_t mSelectedVa = rvaToVa(getInitialSelection());
+ if(mRvaDisplayEnabled && mSelectedVa == mRvaDisplayBase)
+ mRvaDisplayEnabled = false;
+ else
+ {
+ mRvaDisplayEnabled = true;
+ mRvaDisplayBase = mSelectedVa;
+ mRvaDisplayPageBase = getBase();
+ }
+ reloadData();
+ }
+ break;
+
+ case 1: //opcodes
+ {
+ toggleInt3BPAction(); //toggle INT3 breakpoint
+ }
+ break;
+
+ case 2: //disassembly
+ {
+ assembleAt();
+ }
+ break;
+
+ case 3: //comments
+ {
+ setComment();
+ }
+ break;
+
+ default:
+ Disassembly::mouseDoubleClickEvent(event);
+ break;
+ }
}
@@ -98,18 +135,18 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
{
case 0:
msetHwBPOnSlot0Action->setText("Replace Slot 0 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")");
- break;
+ break;
case 1:
msetHwBPOnSlot1Action->setText("Replace Slot 1 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")");
- break;
+ break;
case 2:
msetHwBPOnSlot2Action->setText("Replace Slot 2 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")");
- break;
+ break;
case 3:
msetHwBPOnSlot3Action->setText("Replace Slot 3 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")");
- break;
+ break;
default:
- break;
+ break;
}
}
From 8bf415dbb4301363cffec41cfc37194a421fbf7f Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Mon, 28 Apr 2014 03:18:51 +0200
Subject: [PATCH 015/676] GUI: added find references to address context menu
GUI: fixed a small thing in the ExceptionRangeDialog
GUI: Find Strings now looks inside the memory page currently disassembled instead of CIP
DBG: moved some commands to the documented side
PROJECT: updated help
---
help/Data.htm | 20 +
help/dump.htm | 27 +
help/find.htm | 29 +
help/reffind_findref_ref.htm | 39 ++
help/refstr_strref.htm | 25 +
help/sdump.htm | 38 ++
help/x64_dbg.wcp | 514 ++++++++++--------
x64_dbg_dbg/x64_dbg.cpp | 25 +-
.../Project/Src/Gui/CPUDisassembly.cpp | 32 ++
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 5 +
x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 9 -
x64_dbg_gui/Project/Src/Gui/CPUWidget.h | 13 +-
.../Project/Src/Gui/ExceptionRangeDialog.cpp | 4 +
x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 14 +-
x64_dbg_gui/Project/Src/Gui/MainWindow.h | 1 +
15 files changed, 535 insertions(+), 260 deletions(-)
create mode 100644 help/Data.htm
create mode 100644 help/dump.htm
create mode 100644 help/find.htm
create mode 100644 help/reffind_findref_ref.htm
create mode 100644 help/refstr_strref.htm
create mode 100644 help/sdump.htm
diff --git a/help/Data.htm b/help/Data.htm
new file mode 100644
index 00000000..a951aeb5
--- /dev/null
+++ b/help/Data.htm
@@ -0,0 +1,20 @@
+
+
+
+Data
+
+
+
+
+
+
+
+Data
This section contains commands
+that are used to analyze and manipulate data.
+
\ No newline at end of file
diff --git a/help/dump.htm b/help/dump.htm
new file mode 100644
index 00000000..b6cee710
--- /dev/null
+++ b/help/dump.htm
@@ -0,0 +1,27 @@
+
+
+
+dump
+
+
+
+
+
+
+
+dump
Dump at a certain position.
+arguments
[arg1]: The address to dump at.
+
+
+result
+
+
+This command does not set any result variables.
+
\ No newline at end of file
diff --git a/help/find.htm b/help/find.htm
new file mode 100644
index 00000000..110e18b6
--- /dev/null
+++ b/help/find.htm
@@ -0,0 +1,29 @@
+
+
+
+find
+
+
+
+
+
+
+
+find
Dump at a certain position.
+arguments
arg1: The address to start searching
+from. Notice that the searching will stop when the end of the memory page this
+address resides in has been reached. This means you cannot search the complete
+process memory without enumerating the memory pages first.
+ arg2: The byte pattern to search for. This byte
+pattern can contain wildcards (?) for example: "EB0?90??8D"
+result
The $result variable is set to the virtual
+address of the address that matches the byte pattern. $result will be 0 when the pattern could not be
+matched.
+
\ No newline at end of file
diff --git a/help/reffind_findref_ref.htm b/help/reffind_findref_ref.htm
new file mode 100644
index 00000000..734b5778
--- /dev/null
+++ b/help/reffind_findref_ref.htm
@@ -0,0 +1,39 @@
+
+
+
+reffind/findref/ref
+
+
+
+
+
+
+
+reffind[,findref,ref]
Find references to a certain value.
+arguments
+
+arg1: The value to look for.
+
+
+
+
+[arg2]: Address of/inside a memory page to look
+in. When
+not specified CIP will be used.
+
+
+
+
+
+ result
+
+
+The $result variable is set to the number of references
+found.
\ No newline at end of file
diff --git a/help/refstr_strref.htm b/help/refstr_strref.htm
new file mode 100644
index 00000000..c9bfc8f4
--- /dev/null
+++ b/help/refstr_strref.htm
@@ -0,0 +1,25 @@
+
+
+
+refstr/strref
+
+
+
+
+
+
+
+refstr[,strref]
Find referenced text strings.
+arguments
[arg1]: Address of/inside a memory page to find
+referenced text strings in. When not specified CIP
+will be used.
+result
The $result variable is set to the number of string references
+found.
\ No newline at end of file
diff --git a/help/sdump.htm b/help/sdump.htm
new file mode 100644
index 00000000..0c808beb
--- /dev/null
+++ b/help/sdump.htm
@@ -0,0 +1,38 @@
+
+
+
+sdump
+
+
+
+
+
+
+
+sdump
Dump the at a certain position.
+arguments
+
+
+
+[arg1]: The address to dump at (must be inside the thread
+stack range).
+
+
+
+
+
+ result
+
+
+This command does not set any result
+variables.
+
+
\ No newline at end of file
diff --git a/help/x64_dbg.wcp b/help/x64_dbg.wcp
index 65dbb8bc..ada83038 100644
--- a/help/x64_dbg.wcp
+++ b/help/x64_dbg.wcp
@@ -96,7 +96,7 @@ Font=
DefaultTopic=Introduction.htm
[TOPICS]
-TitleList=110
+TitleList=116
TitleList.Title.0=Introduction
TitleList.Level.0=0
TitleList.Url.0=Introduction.htm
@@ -145,7 +145,7 @@ TitleList.Status.4=0
TitleList.Keywords.4=
TitleList.ContextNumber.4=1003
TitleList.ApplyTemp.4=0
-TitleList.Expanded.4=0
+TitleList.Expanded.4=1
TitleList.Kind.4=0
TitleList.Title.5=Debug Control
TitleList.Level.5=1
@@ -475,7 +475,7 @@ TitleList.Status.37=0
TitleList.Keywords.37=
TitleList.ContextNumber.37=1004
TitleList.ApplyTemp.37=0
-TitleList.Expanded.37=0
+TitleList.Expanded.37=1
TitleList.Kind.37=0
TitleList.Title.38=strlen/charcount/ccount
TitleList.Level.38=2
@@ -517,684 +517,744 @@ TitleList.ContextNumber.41=1026
TitleList.ApplyTemp.41=0
TitleList.Expanded.41=0
TitleList.Kind.41=0
-TitleList.Title.42=HideDebugger/dbh/hide
+TitleList.Title.42=dump
TitleList.Level.42=2
-TitleList.Url.42=HideDebugger_dbh_hide.htm
+TitleList.Url.42=dump.htm
TitleList.Icon.42=0
TitleList.Status.42=0
TitleList.Keywords.42=
-TitleList.ContextNumber.42=1025
+TitleList.ContextNumber.42=1110
TitleList.ApplyTemp.42=0
TitleList.Expanded.42=0
TitleList.Kind.42=0
-TitleList.Title.43=User Database
-TitleList.Level.43=1
-TitleList.Url.43=User_Database.htm
+TitleList.Title.43=sdump
+TitleList.Level.43=2
+TitleList.Url.43=sdump.htm
TitleList.Icon.43=0
TitleList.Status.43=0
TitleList.Keywords.43=
-TitleList.ContextNumber.43=1042
+TitleList.ContextNumber.43=1109
TitleList.ApplyTemp.43=0
TitleList.Expanded.43=0
TitleList.Kind.43=0
-TitleList.Title.44=cmt/cmtset/commentset
+TitleList.Title.44=HideDebugger/dbh/hide
TitleList.Level.44=2
-TitleList.Url.44=cmt_cmtset_commentset.htm
+TitleList.Url.44=HideDebugger_dbh_hide.htm
TitleList.Icon.44=0
TitleList.Status.44=0
TitleList.Keywords.44=
-TitleList.ContextNumber.44=1035
+TitleList.ContextNumber.44=1025
TitleList.ApplyTemp.44=0
TitleList.Expanded.44=0
TitleList.Kind.44=0
-TitleList.Title.45=cmtc/cmtdel/commentdel
-TitleList.Level.45=2
-TitleList.Url.45=cmtc_cmtdel_commentdel.htm
+TitleList.Title.45=User Database
+TitleList.Level.45=1
+TitleList.Url.45=User_Database.htm
TitleList.Icon.45=0
TitleList.Status.45=0
TitleList.Keywords.45=
-TitleList.ContextNumber.45=1036
+TitleList.ContextNumber.45=1042
TitleList.ApplyTemp.45=0
TitleList.Expanded.45=0
TitleList.Kind.45=0
-TitleList.Title.46=lbl/lblset/labelset
+TitleList.Title.46=cmt/cmtset/commentset
TitleList.Level.46=2
-TitleList.Url.46=lbl_lblset_labelset.htm
+TitleList.Url.46=cmt_cmtset_commentset.htm
TitleList.Icon.46=0
TitleList.Status.46=0
TitleList.Keywords.46=
-TitleList.ContextNumber.46=1037
+TitleList.ContextNumber.46=1035
TitleList.ApplyTemp.46=0
TitleList.Expanded.46=0
TitleList.Kind.46=0
-TitleList.Title.47=lblc/lbldel/labeldel
+TitleList.Title.47=cmtc/cmtdel/commentdel
TitleList.Level.47=2
-TitleList.Url.47=lblc_lbldel_labeldel.htm
+TitleList.Url.47=cmtc_cmtdel_commentdel.htm
TitleList.Icon.47=0
TitleList.Status.47=0
TitleList.Keywords.47=
-TitleList.ContextNumber.47=1038
+TitleList.ContextNumber.47=1036
TitleList.ApplyTemp.47=0
TitleList.Expanded.47=0
TitleList.Kind.47=0
-TitleList.Title.48=bookmark/bookmarkset
+TitleList.Title.48=lbl/lblset/labelset
TitleList.Level.48=2
-TitleList.Url.48=bookmark_bookmarkset.htm
+TitleList.Url.48=lbl_lblset_labelset.htm
TitleList.Icon.48=0
TitleList.Status.48=0
TitleList.Keywords.48=
-TitleList.ContextNumber.48=1077
+TitleList.ContextNumber.48=1037
TitleList.ApplyTemp.48=0
TitleList.Expanded.48=0
TitleList.Kind.48=0
-TitleList.Title.49=bookmarkc/bookmarkdel
+TitleList.Title.49=lblc/lbldel/labeldel
TitleList.Level.49=2
-TitleList.Url.49=bookmarkc_bookmarkdel.htm
+TitleList.Url.49=lblc_lbldel_labeldel.htm
TitleList.Icon.49=0
TitleList.Status.49=0
TitleList.Keywords.49=
-TitleList.ContextNumber.49=1078
+TitleList.ContextNumber.49=1038
TitleList.ApplyTemp.49=0
TitleList.Expanded.49=0
TitleList.Kind.49=0
-TitleList.Title.50=savedb/dbsave
+TitleList.Title.50=bookmark/bookmarkset
TitleList.Level.50=2
-TitleList.Url.50=savedb_dbsave.htm
+TitleList.Url.50=bookmark_bookmarkset.htm
TitleList.Icon.50=0
TitleList.Status.50=0
TitleList.Keywords.50=
-TitleList.ContextNumber.50=1034
+TitleList.ContextNumber.50=1077
TitleList.ApplyTemp.50=0
TitleList.Expanded.50=0
TitleList.Kind.50=0
-TitleList.Title.51=loaddb/dbload
+TitleList.Title.51=bookmarkc/bookmarkdel
TitleList.Level.51=2
-TitleList.Url.51=loaddb_dbload.htm
+TitleList.Url.51=bookmarkc_bookmarkdel.htm
TitleList.Icon.51=0
TitleList.Status.51=0
TitleList.Keywords.51=
-TitleList.ContextNumber.51=1039
+TitleList.ContextNumber.51=1078
TitleList.ApplyTemp.51=0
TitleList.Expanded.51=0
TitleList.Kind.51=0
-TitleList.Title.52=functionadd/func
+TitleList.Title.52=savedb/dbsave
TitleList.Level.52=2
-TitleList.Url.52=functionadd_func.htm
+TitleList.Url.52=savedb_dbsave.htm
TitleList.Icon.52=0
TitleList.Status.52=0
TitleList.Keywords.52=
-TitleList.ContextNumber.52=1062
+TitleList.ContextNumber.52=1034
TitleList.ApplyTemp.52=0
TitleList.Expanded.52=0
TitleList.Kind.52=0
-TitleList.Title.53=functiondel/funcc
+TitleList.Title.53=loaddb/dbload
TitleList.Level.53=2
-TitleList.Url.53=functiondel_funcc.htm
+TitleList.Url.53=loaddb_dbload.htm
TitleList.Icon.53=0
TitleList.Status.53=0
TitleList.Keywords.53=
-TitleList.ContextNumber.53=1063
+TitleList.ContextNumber.53=1039
TitleList.ApplyTemp.53=0
TitleList.Expanded.53=0
TitleList.Kind.53=0
-TitleList.Title.54=Memory Operations
-TitleList.Level.54=1
-TitleList.Url.54=Memory_Operations.htm
+TitleList.Title.54=functionadd/func
+TitleList.Level.54=2
+TitleList.Url.54=functionadd_func.htm
TitleList.Icon.54=0
TitleList.Status.54=0
TitleList.Keywords.54=
-TitleList.ContextNumber.54=1043
+TitleList.ContextNumber.54=1062
TitleList.ApplyTemp.54=0
TitleList.Expanded.54=0
TitleList.Kind.54=0
-TitleList.Title.55=alloc
+TitleList.Title.55=functiondel/funcc
TitleList.Level.55=2
-TitleList.Url.55=alloc.htm
+TitleList.Url.55=functiondel_funcc.htm
TitleList.Icon.55=0
TitleList.Status.55=0
TitleList.Keywords.55=
-TitleList.ContextNumber.55=1032
+TitleList.ContextNumber.55=1063
TitleList.ApplyTemp.55=0
TitleList.Expanded.55=0
TitleList.Kind.55=0
-TitleList.Title.56=free
-TitleList.Level.56=2
-TitleList.Url.56=free.htm
+TitleList.Title.56=Memory Operations
+TitleList.Level.56=1
+TitleList.Url.56=Memory_Operations.htm
TitleList.Icon.56=0
TitleList.Status.56=0
TitleList.Keywords.56=
-TitleList.ContextNumber.56=1031
+TitleList.ContextNumber.56=1043
TitleList.ApplyTemp.56=0
TitleList.Expanded.56=0
TitleList.Kind.56=0
-TitleList.Title.57=Fill/memset
+TitleList.Title.57=alloc
TitleList.Level.57=2
-TitleList.Url.57=Fill_memset.htm
+TitleList.Url.57=alloc.htm
TitleList.Icon.57=0
TitleList.Status.57=0
TitleList.Keywords.57=
-TitleList.ContextNumber.57=1033
+TitleList.ContextNumber.57=1032
TitleList.ApplyTemp.57=0
TitleList.Expanded.57=0
TitleList.Kind.57=0
-TitleList.Title.58=Plugins
-TitleList.Level.58=1
-TitleList.Url.58=Plugins_section.htm
+TitleList.Title.58=free
+TitleList.Level.58=2
+TitleList.Url.58=free.htm
TitleList.Icon.58=0
TitleList.Status.58=0
TitleList.Keywords.58=
-TitleList.ContextNumber.58=1046
+TitleList.ContextNumber.58=1031
TitleList.ApplyTemp.58=0
TitleList.Expanded.58=0
TitleList.Kind.58=0
-TitleList.Title.59=StartScylla/scylla/imprec
+TitleList.Title.59=Fill/memset
TitleList.Level.59=2
-TitleList.Url.59=StartScylla_scylla_imprec.htm
+TitleList.Url.59=Fill_memset.htm
TitleList.Icon.59=0
TitleList.Status.59=0
TitleList.Keywords.59=
-TitleList.ContextNumber.59=1047
+TitleList.ContextNumber.59=1033
TitleList.ApplyTemp.59=0
TitleList.Expanded.59=0
TitleList.Kind.59=0
-TitleList.Title.60=General Purpose
+TitleList.Title.60=Plugins
TitleList.Level.60=1
-TitleList.Url.60=General_Purpose.htm
+TitleList.Url.60=Plugins_section.htm
TitleList.Icon.60=0
TitleList.Status.60=0
TitleList.Keywords.60=
-TitleList.ContextNumber.60=1073
+TitleList.ContextNumber.60=1046
TitleList.ApplyTemp.60=0
TitleList.Expanded.60=0
TitleList.Kind.60=0
-TitleList.Title.61=cmp
+TitleList.Title.61=StartScylla/scylla/imprec
TitleList.Level.61=2
-TitleList.Url.61=cmp.htm
+TitleList.Url.61=StartScylla_scylla_imprec.htm
TitleList.Icon.61=0
TitleList.Status.61=0
TitleList.Keywords.61=
-TitleList.ContextNumber.61=1071
+TitleList.ContextNumber.61=1047
TitleList.ApplyTemp.61=0
TitleList.Expanded.61=0
TitleList.Kind.61=0
-TitleList.Title.62=gpa
-TitleList.Level.62=2
-TitleList.Url.62=gpa.htm
+TitleList.Title.62=General Purpose
+TitleList.Level.62=1
+TitleList.Url.62=General_Purpose.htm
TitleList.Icon.62=0
TitleList.Status.62=0
TitleList.Keywords.62=
-TitleList.ContextNumber.62=1095
+TitleList.ContextNumber.62=1073
TitleList.ApplyTemp.62=0
TitleList.Expanded.62=0
TitleList.Kind.62=0
-TitleList.Title.63=add
+TitleList.Title.63=cmp
TitleList.Level.63=2
-TitleList.Url.63=add.htm
+TitleList.Url.63=cmp.htm
TitleList.Icon.63=0
TitleList.Status.63=0
TitleList.Keywords.63=
-TitleList.ContextNumber.63=1094
+TitleList.ContextNumber.63=1071
TitleList.ApplyTemp.63=0
TitleList.Expanded.63=0
TitleList.Kind.63=0
-TitleList.Title.64=and
+TitleList.Title.64=gpa
TitleList.Level.64=2
-TitleList.Url.64=and.htm
+TitleList.Url.64=gpa.htm
TitleList.Icon.64=0
TitleList.Status.64=0
TitleList.Keywords.64=
-TitleList.ContextNumber.64=1093
+TitleList.ContextNumber.64=1095
TitleList.ApplyTemp.64=0
TitleList.Expanded.64=0
TitleList.Kind.64=0
-TitleList.Title.65=dec
+TitleList.Title.65=add
TitleList.Level.65=2
-TitleList.Url.65=dec.htm
+TitleList.Url.65=add.htm
TitleList.Icon.65=0
TitleList.Status.65=0
TitleList.Keywords.65=
-TitleList.ContextNumber.65=1092
+TitleList.ContextNumber.65=1094
TitleList.ApplyTemp.65=0
TitleList.Expanded.65=0
TitleList.Kind.65=0
-TitleList.Title.66=div
+TitleList.Title.66=and
TitleList.Level.66=2
-TitleList.Url.66=div.htm
+TitleList.Url.66=and.htm
TitleList.Icon.66=0
TitleList.Status.66=0
TitleList.Keywords.66=
-TitleList.ContextNumber.66=1091
+TitleList.ContextNumber.66=1093
TitleList.ApplyTemp.66=0
TitleList.Expanded.66=0
TitleList.Kind.66=0
-TitleList.Title.67=inc
+TitleList.Title.67=dec
TitleList.Level.67=2
-TitleList.Url.67=inc.htm
+TitleList.Url.67=dec.htm
TitleList.Icon.67=0
TitleList.Status.67=0
TitleList.Keywords.67=
-TitleList.ContextNumber.67=1090
+TitleList.ContextNumber.67=1092
TitleList.ApplyTemp.67=0
TitleList.Expanded.67=0
TitleList.Kind.67=0
-TitleList.Title.68=mul
+TitleList.Title.68=div
TitleList.Level.68=2
-TitleList.Url.68=mul.htm
+TitleList.Url.68=div.htm
TitleList.Icon.68=0
TitleList.Status.68=0
TitleList.Keywords.68=
-TitleList.ContextNumber.68=1089
+TitleList.ContextNumber.68=1091
TitleList.ApplyTemp.68=0
TitleList.Expanded.68=0
TitleList.Kind.68=0
-TitleList.Title.69=neg
+TitleList.Title.69=inc
TitleList.Level.69=2
-TitleList.Url.69=neg.htm
+TitleList.Url.69=inc.htm
TitleList.Icon.69=0
TitleList.Status.69=0
TitleList.Keywords.69=
-TitleList.ContextNumber.69=1088
+TitleList.ContextNumber.69=1090
TitleList.ApplyTemp.69=0
TitleList.Expanded.69=0
TitleList.Kind.69=0
-TitleList.Title.70=not
+TitleList.Title.70=mul
TitleList.Level.70=2
-TitleList.Url.70=not.htm
+TitleList.Url.70=mul.htm
TitleList.Icon.70=0
TitleList.Status.70=0
TitleList.Keywords.70=
-TitleList.ContextNumber.70=1087
+TitleList.ContextNumber.70=1089
TitleList.ApplyTemp.70=0
TitleList.Expanded.70=0
TitleList.Kind.70=0
-TitleList.Title.71=or
+TitleList.Title.71=neg
TitleList.Level.71=2
-TitleList.Url.71=or.htm
+TitleList.Url.71=neg.htm
TitleList.Icon.71=0
TitleList.Status.71=0
TitleList.Keywords.71=
-TitleList.ContextNumber.71=1086
+TitleList.ContextNumber.71=1088
TitleList.ApplyTemp.71=0
TitleList.Expanded.71=0
TitleList.Kind.71=0
-TitleList.Title.72=rol
+TitleList.Title.72=not
TitleList.Level.72=2
-TitleList.Url.72=rol.htm
+TitleList.Url.72=not.htm
TitleList.Icon.72=0
TitleList.Status.72=0
TitleList.Keywords.72=
-TitleList.ContextNumber.72=1085
+TitleList.ContextNumber.72=1087
TitleList.ApplyTemp.72=0
TitleList.Expanded.72=0
TitleList.Kind.72=0
-TitleList.Title.73=ror
+TitleList.Title.73=or
TitleList.Level.73=2
-TitleList.Url.73=ror.htm
+TitleList.Url.73=or.htm
TitleList.Icon.73=0
TitleList.Status.73=0
TitleList.Keywords.73=
-TitleList.ContextNumber.73=1084
+TitleList.ContextNumber.73=1086
TitleList.ApplyTemp.73=0
TitleList.Expanded.73=0
TitleList.Kind.73=0
-TitleList.Title.74=shl
+TitleList.Title.74=rol
TitleList.Level.74=2
-TitleList.Url.74=shl.htm
+TitleList.Url.74=rol.htm
TitleList.Icon.74=0
TitleList.Status.74=0
TitleList.Keywords.74=
-TitleList.ContextNumber.74=1083
+TitleList.ContextNumber.74=1085
TitleList.ApplyTemp.74=0
TitleList.Expanded.74=0
TitleList.Kind.74=0
-TitleList.Title.75=shr
+TitleList.Title.75=ror
TitleList.Level.75=2
-TitleList.Url.75=shr.htm
+TitleList.Url.75=ror.htm
TitleList.Icon.75=0
TitleList.Status.75=0
TitleList.Keywords.75=
-TitleList.ContextNumber.75=1082
+TitleList.ContextNumber.75=1084
TitleList.ApplyTemp.75=0
TitleList.Expanded.75=0
TitleList.Kind.75=0
-TitleList.Title.76=sub
+TitleList.Title.76=shl
TitleList.Level.76=2
-TitleList.Url.76=sub.htm
+TitleList.Url.76=shl.htm
TitleList.Icon.76=0
TitleList.Status.76=0
TitleList.Keywords.76=
-TitleList.ContextNumber.76=1081
+TitleList.ContextNumber.76=1083
TitleList.ApplyTemp.76=0
TitleList.Expanded.76=0
TitleList.Kind.76=0
-TitleList.Title.77=test
+TitleList.Title.77=shr
TitleList.Level.77=2
-TitleList.Url.77=test.htm
+TitleList.Url.77=shr.htm
TitleList.Icon.77=0
TitleList.Status.77=0
TitleList.Keywords.77=
-TitleList.ContextNumber.77=1080
+TitleList.ContextNumber.77=1082
TitleList.ApplyTemp.77=0
TitleList.Expanded.77=0
TitleList.Kind.77=0
-TitleList.Title.78=xor
+TitleList.Title.78=sub
TitleList.Level.78=2
-TitleList.Url.78=xor.htm
+TitleList.Url.78=sub.htm
TitleList.Icon.78=0
TitleList.Status.78=0
TitleList.Keywords.78=
-TitleList.ContextNumber.78=1096
+TitleList.ContextNumber.78=1081
TitleList.ApplyTemp.78=0
TitleList.Expanded.78=0
TitleList.Kind.78=0
-TitleList.Title.79=Script Commands
-TitleList.Level.79=1
-TitleList.Url.79=Script_Commands.htm
+TitleList.Title.79=test
+TitleList.Level.79=2
+TitleList.Url.79=test.htm
TitleList.Icon.79=0
TitleList.Status.79=0
TitleList.Keywords.79=
-TitleList.ContextNumber.79=1070
+TitleList.ContextNumber.79=1080
TitleList.ApplyTemp.79=0
TitleList.Expanded.79=0
TitleList.Kind.79=0
-TitleList.Title.80=Jxx/IFxx
+TitleList.Title.80=xor
TitleList.Level.80=2
-TitleList.Url.80=Jxx_IFxx.htm
+TitleList.Url.80=xor.htm
TitleList.Icon.80=0
TitleList.Status.80=0
TitleList.Keywords.80=
-TitleList.ContextNumber.80=1072
+TitleList.ContextNumber.80=1096
TitleList.ApplyTemp.80=0
TitleList.Expanded.80=0
TitleList.Kind.80=0
-TitleList.Title.81=call
-TitleList.Level.81=2
-TitleList.Url.81=call.htm
+TitleList.Title.81=Script Commands
+TitleList.Level.81=1
+TitleList.Url.81=Script_Commands.htm
TitleList.Icon.81=0
TitleList.Status.81=0
TitleList.Keywords.81=
-TitleList.ContextNumber.81=1097
+TitleList.ContextNumber.81=1070
TitleList.ApplyTemp.81=0
TitleList.Expanded.81=0
TitleList.Kind.81=0
-TitleList.Title.82=ret
+TitleList.Title.82=Jxx/IFxx
TitleList.Level.82=2
-TitleList.Url.82=ret.htm
+TitleList.Url.82=Jxx_IFxx.htm
TitleList.Icon.82=0
TitleList.Status.82=0
TitleList.Keywords.82=
-TitleList.ContextNumber.82=1098
+TitleList.ContextNumber.82=1072
TitleList.ApplyTemp.82=0
TitleList.Expanded.82=0
TitleList.Kind.82=0
-TitleList.Title.83=invalid
+TitleList.Title.83=call
TitleList.Level.83=2
-TitleList.Url.83=invalid.htm
+TitleList.Url.83=call.htm
TitleList.Icon.83=0
TitleList.Status.83=0
TitleList.Keywords.83=
-TitleList.ContextNumber.83=1099
+TitleList.ContextNumber.83=1097
TitleList.ApplyTemp.83=0
TitleList.Expanded.83=0
TitleList.Kind.83=0
-TitleList.Title.84=pause
+TitleList.Title.84=ret
TitleList.Level.84=2
-TitleList.Url.84=pause_script.htm
+TitleList.Url.84=ret.htm
TitleList.Icon.84=0
TitleList.Status.84=0
TitleList.Keywords.84=
-TitleList.ContextNumber.84=1100
+TitleList.ContextNumber.84=1098
TitleList.ApplyTemp.84=0
TitleList.Expanded.84=0
TitleList.Kind.84=0
-TitleList.Title.85=scriptload
+TitleList.Title.85=invalid
TitleList.Level.85=2
-TitleList.Url.85=scriptload.htm
+TitleList.Url.85=invalid.htm
TitleList.Icon.85=0
TitleList.Status.85=0
TitleList.Keywords.85=
-TitleList.ContextNumber.85=1074
+TitleList.ContextNumber.85=1099
TitleList.ApplyTemp.85=0
TitleList.Expanded.85=0
TitleList.Kind.85=0
-TitleList.Title.86=msg
+TitleList.Title.86=pause
TitleList.Level.86=2
-TitleList.Url.86=msg.htm
+TitleList.Url.86=pause_script.htm
TitleList.Icon.86=0
TitleList.Status.86=0
TitleList.Keywords.86=
-TitleList.ContextNumber.86=1076
+TitleList.ContextNumber.86=1100
TitleList.ApplyTemp.86=0
TitleList.Expanded.86=0
TitleList.Kind.86=0
-TitleList.Title.87=msgyn
+TitleList.Title.87=scriptload
TitleList.Level.87=2
-TitleList.Url.87=msgyn.htm
+TitleList.Url.87=scriptload.htm
TitleList.Icon.87=0
TitleList.Status.87=0
TitleList.Keywords.87=
-TitleList.ContextNumber.87=1075
+TitleList.ContextNumber.87=1074
TitleList.ApplyTemp.87=0
TitleList.Expanded.87=0
TitleList.Kind.87=0
-TitleList.Title.88=Plugins
-TitleList.Level.88=0
-TitleList.Url.88=Plugins.htm
+TitleList.Title.88=msg
+TitleList.Level.88=2
+TitleList.Url.88=msg.htm
TitleList.Icon.88=0
TitleList.Status.88=0
TitleList.Keywords.88=
-TitleList.ContextNumber.88=1050
+TitleList.ContextNumber.88=1076
TitleList.ApplyTemp.88=0
-TitleList.Expanded.88=1
+TitleList.Expanded.88=0
TitleList.Kind.88=0
-TitleList.Title.89=The basics
-TitleList.Level.89=1
-TitleList.Url.89=The_basics.htm
+TitleList.Title.89=msgyn
+TitleList.Level.89=2
+TitleList.Url.89=msgyn.htm
TitleList.Icon.89=0
TitleList.Status.89=0
TitleList.Keywords.89=
-TitleList.ContextNumber.89=1103
+TitleList.ContextNumber.89=1075
TitleList.ApplyTemp.89=0
TitleList.Expanded.89=0
TitleList.Kind.89=0
-TitleList.Title.90=API
+TitleList.Title.90=Data
TitleList.Level.90=1
-TitleList.Url.90=Exports.htm
+TitleList.Url.90=Data.htm
TitleList.Icon.90=0
TitleList.Status.90=0
TitleList.Keywords.90=
-TitleList.ContextNumber.90=1051
+TitleList.ContextNumber.90=1111
TitleList.ApplyTemp.90=0
TitleList.Expanded.90=1
TitleList.Kind.90=0
-TitleList.Title.91=_plugin_registercallback
+TitleList.Title.91=reffind/findref/ref
TitleList.Level.91=2
-TitleList.Url.91=_plugin_registercallback.htm
+TitleList.Url.91=reffind_findref_ref.htm
TitleList.Icon.91=0
TitleList.Status.91=0
TitleList.Keywords.91=
-TitleList.ContextNumber.91=1052
+TitleList.ContextNumber.91=1112
TitleList.ApplyTemp.91=0
TitleList.Expanded.91=0
TitleList.Kind.91=0
-TitleList.Title.92=_plugin_unregistercallback
+TitleList.Title.92=refstr/strref
TitleList.Level.92=2
-TitleList.Url.92=_plugin_unregistercallback.htm
+TitleList.Url.92=refstr_strref.htm
TitleList.Icon.92=0
TitleList.Status.92=0
TitleList.Keywords.92=
-TitleList.ContextNumber.92=1053
+TitleList.ContextNumber.92=1113
TitleList.ApplyTemp.92=0
TitleList.Expanded.92=0
TitleList.Kind.92=0
-TitleList.Title.93=_plugin_registercommand
+TitleList.Title.93=find
TitleList.Level.93=2
-TitleList.Url.93=_plugin_registercommand.htm
+TitleList.Url.93=find.htm
TitleList.Icon.93=0
TitleList.Status.93=0
TitleList.Keywords.93=
-TitleList.ContextNumber.93=1054
+TitleList.ContextNumber.93=1114
TitleList.ApplyTemp.93=0
TitleList.Expanded.93=0
TitleList.Kind.93=0
-TitleList.Title.94=_plugin_unregistercommand
-TitleList.Level.94=2
-TitleList.Url.94=_plugin_unregistercommand.htm
+TitleList.Title.94=Plugins
+TitleList.Level.94=0
+TitleList.Url.94=Plugins.htm
TitleList.Icon.94=0
TitleList.Status.94=0
TitleList.Keywords.94=
-TitleList.ContextNumber.94=1055
+TitleList.ContextNumber.94=1050
TitleList.ApplyTemp.94=0
TitleList.Expanded.94=0
TitleList.Kind.94=0
-TitleList.Title.95=_plugin_logprintf
-TitleList.Level.95=2
-TitleList.Url.95=_plugin_logprintf.htm
+TitleList.Title.95=The basics
+TitleList.Level.95=1
+TitleList.Url.95=The_basics.htm
TitleList.Icon.95=0
TitleList.Status.95=0
TitleList.Keywords.95=
-TitleList.ContextNumber.95=1056
+TitleList.ContextNumber.95=1103
TitleList.ApplyTemp.95=0
TitleList.Expanded.95=0
TitleList.Kind.95=0
-TitleList.Title.96=_plugin_logputs
-TitleList.Level.96=2
-TitleList.Url.96=_plugin_logputs.htm
+TitleList.Title.96=API
+TitleList.Level.96=1
+TitleList.Url.96=Exports.htm
TitleList.Icon.96=0
TitleList.Status.96=0
TitleList.Keywords.96=
-TitleList.ContextNumber.96=1057
+TitleList.ContextNumber.96=1051
TitleList.ApplyTemp.96=0
TitleList.Expanded.96=0
TitleList.Kind.96=0
-TitleList.Title.97=_plugin_debugpause
+TitleList.Title.97=_plugin_registercallback
TitleList.Level.97=2
-TitleList.Url.97=_plugin_debugpause.htm
+TitleList.Url.97=_plugin_registercallback.htm
TitleList.Icon.97=0
TitleList.Status.97=0
TitleList.Keywords.97=
-TitleList.ContextNumber.97=1058
+TitleList.ContextNumber.97=1052
TitleList.ApplyTemp.97=0
TitleList.Expanded.97=0
TitleList.Kind.97=0
-TitleList.Title.98=_plugin_debugskipexceptions
+TitleList.Title.98=_plugin_unregistercallback
TitleList.Level.98=2
-TitleList.Url.98=_plugin_debugskipexceptions.htm
+TitleList.Url.98=_plugin_unregistercallback.htm
TitleList.Icon.98=0
TitleList.Status.98=0
TitleList.Keywords.98=
-TitleList.ContextNumber.98=1104
+TitleList.ContextNumber.98=1053
TitleList.ApplyTemp.98=0
TitleList.Expanded.98=0
TitleList.Kind.98=0
-TitleList.Title.99=_plugin_menuadd
+TitleList.Title.99=_plugin_registercommand
TitleList.Level.99=2
-TitleList.Url.99=_plugin_menuadd.htm
+TitleList.Url.99=_plugin_registercommand.htm
TitleList.Icon.99=0
TitleList.Status.99=0
TitleList.Keywords.99=
-TitleList.ContextNumber.99=1108
+TitleList.ContextNumber.99=1054
TitleList.ApplyTemp.99=0
TitleList.Expanded.99=0
TitleList.Kind.99=0
-TitleList.Title.100=_plugin_menuaddentry
+TitleList.Title.100=_plugin_unregistercommand
TitleList.Level.100=2
-TitleList.Url.100=_plugin_menuaddentry.htm
+TitleList.Url.100=_plugin_unregistercommand.htm
TitleList.Icon.100=0
TitleList.Status.100=0
TitleList.Keywords.100=
-TitleList.ContextNumber.100=1107
+TitleList.ContextNumber.100=1055
TitleList.ApplyTemp.100=0
TitleList.Expanded.100=0
TitleList.Kind.100=0
-TitleList.Title.101=_plugin_menuaddseparator
+TitleList.Title.101=_plugin_logprintf
TitleList.Level.101=2
-TitleList.Url.101=_plugin_menuaddseparator.htm
+TitleList.Url.101=_plugin_logprintf.htm
TitleList.Icon.101=0
TitleList.Status.101=0
TitleList.Keywords.101=
-TitleList.ContextNumber.101=1106
+TitleList.ContextNumber.101=1056
TitleList.ApplyTemp.101=0
TitleList.Expanded.101=0
TitleList.Kind.101=0
-TitleList.Title.102=_plugin_menuclear
+TitleList.Title.102=_plugin_logputs
TitleList.Level.102=2
-TitleList.Url.102=_plugin_menuclear.htm
+TitleList.Url.102=_plugin_logputs.htm
TitleList.Icon.102=0
TitleList.Status.102=0
TitleList.Keywords.102=
-TitleList.ContextNumber.102=1105
+TitleList.ContextNumber.102=1057
TitleList.ApplyTemp.102=0
TitleList.Expanded.102=0
TitleList.Kind.102=0
-TitleList.Title.103=Structures
-TitleList.Level.103=1
-TitleList.Url.103=Structures.htm
+TitleList.Title.103=_plugin_debugpause
+TitleList.Level.103=2
+TitleList.Url.103=_plugin_debugpause.htm
TitleList.Icon.103=0
TitleList.Status.103=0
TitleList.Keywords.103=
-TitleList.ContextNumber.103=1059
+TitleList.ContextNumber.103=1058
TitleList.ApplyTemp.103=0
-TitleList.Expanded.103=1
+TitleList.Expanded.103=0
TitleList.Kind.103=0
-TitleList.Title.104=Callback Structures
+TitleList.Title.104=_plugin_debugskipexceptions
TitleList.Level.104=2
-TitleList.Url.104=Callbacks.htm
+TitleList.Url.104=_plugin_debugskipexceptions.htm
TitleList.Icon.104=0
TitleList.Status.104=0
TitleList.Keywords.104=
-TitleList.ContextNumber.104=1060
+TitleList.ContextNumber.104=1104
TitleList.ApplyTemp.104=0
TitleList.Expanded.104=0
TitleList.Kind.104=0
-TitleList.Title.105=PLUG_INITSTRUCT
+TitleList.Title.105=_plugin_menuadd
TitleList.Level.105=2
-TitleList.Url.105=PLUGINIT_STRUCT.htm
+TitleList.Url.105=_plugin_menuadd.htm
TitleList.Icon.105=0
TitleList.Status.105=0
TitleList.Keywords.105=
-TitleList.ContextNumber.105=1061
+TitleList.ContextNumber.105=1108
TitleList.ApplyTemp.105=0
TitleList.Expanded.105=0
TitleList.Kind.105=0
-TitleList.Title.106=PLUG_SETUPSTRUCT
+TitleList.Title.106=_plugin_menuaddentry
TitleList.Level.106=2
-TitleList.Url.106=PLUG_SETUPSTRUCT.htm
+TitleList.Url.106=_plugin_menuaddentry.htm
TitleList.Icon.106=0
TitleList.Status.106=0
TitleList.Keywords.106=
-TitleList.ContextNumber.106=1102
+TitleList.ContextNumber.106=1107
TitleList.ApplyTemp.106=0
TitleList.Expanded.106=0
TitleList.Kind.106=0
-TitleList.Title.107=Scripting
-TitleList.Level.107=0
-TitleList.Url.107=Scripting.htm
+TitleList.Title.107=_plugin_menuaddseparator
+TitleList.Level.107=2
+TitleList.Url.107=_plugin_menuaddseparator.htm
TitleList.Icon.107=0
TitleList.Status.107=0
TitleList.Keywords.107=
-TitleList.ContextNumber.107=1069
+TitleList.ContextNumber.107=1106
TitleList.ApplyTemp.107=0
TitleList.Expanded.107=0
TitleList.Kind.107=0
-TitleList.Title.108=Special Thanks
-TitleList.Level.108=0
-TitleList.Url.108=Special_Thanks.htm
+TitleList.Title.108=_plugin_menuclear
+TitleList.Level.108=2
+TitleList.Url.108=_plugin_menuclear.htm
TitleList.Icon.108=0
TitleList.Status.108=0
TitleList.Keywords.108=
-TitleList.ContextNumber.108=1024
+TitleList.ContextNumber.108=1105
TitleList.ApplyTemp.108=0
TitleList.Expanded.108=0
TitleList.Kind.108=0
-TitleList.Title.109=Fixed Top Style
-TitleList.Level.109=0
-TitleList.Url.109=template\fixedtop.htm
+TitleList.Title.109=Structures
+TitleList.Level.109=1
+TitleList.Url.109=Structures.htm
TitleList.Icon.109=0
TitleList.Status.109=0
TitleList.Keywords.109=
-TitleList.ContextNumber.109=
+TitleList.ContextNumber.109=1059
TitleList.ApplyTemp.109=0
TitleList.Expanded.109=0
-TitleList.Kind.109=2
+TitleList.Kind.109=0
+TitleList.Title.110=Callback Structures
+TitleList.Level.110=2
+TitleList.Url.110=Callbacks.htm
+TitleList.Icon.110=0
+TitleList.Status.110=0
+TitleList.Keywords.110=
+TitleList.ContextNumber.110=1060
+TitleList.ApplyTemp.110=0
+TitleList.Expanded.110=0
+TitleList.Kind.110=0
+TitleList.Title.111=PLUG_INITSTRUCT
+TitleList.Level.111=2
+TitleList.Url.111=PLUGINIT_STRUCT.htm
+TitleList.Icon.111=0
+TitleList.Status.111=0
+TitleList.Keywords.111=
+TitleList.ContextNumber.111=1061
+TitleList.ApplyTemp.111=0
+TitleList.Expanded.111=0
+TitleList.Kind.111=0
+TitleList.Title.112=PLUG_SETUPSTRUCT
+TitleList.Level.112=2
+TitleList.Url.112=PLUG_SETUPSTRUCT.htm
+TitleList.Icon.112=0
+TitleList.Status.112=0
+TitleList.Keywords.112=
+TitleList.ContextNumber.112=1102
+TitleList.ApplyTemp.112=0
+TitleList.Expanded.112=0
+TitleList.Kind.112=0
+TitleList.Title.113=Scripting
+TitleList.Level.113=0
+TitleList.Url.113=Scripting.htm
+TitleList.Icon.113=0
+TitleList.Status.113=0
+TitleList.Keywords.113=
+TitleList.ContextNumber.113=1069
+TitleList.ApplyTemp.113=0
+TitleList.Expanded.113=0
+TitleList.Kind.113=0
+TitleList.Title.114=Special Thanks
+TitleList.Level.114=0
+TitleList.Url.114=Special_Thanks.htm
+TitleList.Icon.114=0
+TitleList.Status.114=0
+TitleList.Keywords.114=
+TitleList.ContextNumber.114=1024
+TitleList.ApplyTemp.114=0
+TitleList.Expanded.114=0
+TitleList.Kind.114=0
+TitleList.Title.115=Fixed Top Style
+TitleList.Level.115=0
+TitleList.Url.115=template\fixedtop.htm
+TitleList.Icon.115=0
+TitleList.Status.115=0
+TitleList.Keywords.115=
+TitleList.ContextNumber.115=
+TitleList.ApplyTemp.115=0
+TitleList.Expanded.115=0
+TitleList.Kind.115=2
diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp
index 433e061a..4fadd073 100644
--- a/x64_dbg_dbg/x64_dbg.cpp
+++ b/x64_dbg_dbg/x64_dbg.cpp
@@ -89,6 +89,8 @@ static void registercommands()
cmdnew(cmd, "chd", cbInstrChd, false); //Change directory
cmdnew(cmd, "disasm\1dis\1d", cbDebugDisasm, true); //doDisasm
cmdnew(cmd, "HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger
+ cmdnew(cmd, "dump", cbDebugDump, true); //dump at address
+ cmdnew(cmd, "sdump", cbDebugStackDump, true); //dump at stack address
//user database
cmdnew(cmd, "cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment
@@ -135,25 +137,20 @@ static void registercommands()
cmdnew(cmd, "msg", cbScriptMsg, false);
cmdnew(cmd, "msgyn", cbScriptMsgyn, false);
- //undocumented
- cmdnew(cmd, "bench", cbBenchmark, true); //benchmark test (readmem etc)
-
- cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test
- cmdnew(cmd, "asm", cbAssemble, true); //assemble instruction
-
- cmdnew(cmd, "dump", cbDebugDump, true); //dump at address
- cmdnew(cmd, "sdump", cbDebugStackDump, true); //dump at stack address
- cmdnew(cmd, "dprintf", cbPrintf, false); //printf
-
- cmdnew(cmd, "refinit", cbInstrRefinit, false);
- cmdnew(cmd, "refadd", cbInstrRefadd, false);
+ //data
cmdnew(cmd, "reffind\1findref\1ref", cbInstrRefFind, true);
cmdnew(cmd, "refstr\1strref", cbInstrRefStr, true);
+ cmdnew(cmd, "find", cbInstrFind, true); //find a pattern
+ //undocumented
+ cmdnew(cmd, "bench", cbBenchmark, true); //benchmark test (readmem etc)
+ cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test
+ cmdnew(cmd, "asm", cbAssemble, true); //assemble instruction
+ cmdnew(cmd, "dprintf", cbPrintf, false); //printf
+ cmdnew(cmd, "refinit", cbInstrRefinit, false);
+ cmdnew(cmd, "refadd", cbInstrRefadd, false);
cmdnew(cmd, "setstr\1strset", cbInstrSetstr, false); //set a string variable
cmdnew(cmd, "getstr\1strget", cbInstrGetstr, false); //get a string variable
-
- cmdnew(cmd, "find", cbInstrFind, true); //find a pattern
}
static bool cbCommandProvider(char* cmd, int maxlen)
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 5d8e3a25..e54be6de 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -187,6 +187,13 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
mFollowMenu->actions().last()->setObjectName(QString("DUMP|")+QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper());
connect(mFollowMenu->actions().last(), SIGNAL(triggered()), this, SLOT(followActionSlot()));
+ wMenu->addSeparator();
+
+ //wMenu->addMenu(mSearchMenu);
+
+ mReferencesMenu->addAction(mReferenceSelectedAddress);
+ wMenu->addMenu(mReferencesMenu);
+
QAction* wAction = wMenu->exec(event->globalPos());
}
}
@@ -268,6 +275,24 @@ void CPUDisassembly::setupRightClickContextMenu()
// Menu
mFollowMenu = new QMenu("&Follow in Dump", this);
+ //-------------------- Find references to -----------------------
+ // Menu
+ mReferencesMenu = new QMenu("Find &references to", this);
+
+ // Selected address
+ mReferenceSelectedAddress = new QAction("&Selected address", this);
+ mReferenceSelectedAddress->setShortcutContext(Qt::WidgetShortcut);
+ mReferenceSelectedAddress->setShortcut(QKeySequence("ctrl+r"));
+ this->addAction(mReferenceSelectedAddress);
+ connect(mReferenceSelectedAddress, SIGNAL(triggered()), this, SLOT(findReferences()));
+
+ //---------------------- Search for -----------------------------
+ // Menu
+ mSearchMenu = new QMenu("&Search for", this);
+
+ //
+
+
//---------------------- Breakpoints -----------------------------
// Menu
mBPMenu = new QMenu("Breakpoint", this);
@@ -614,3 +639,10 @@ void CPUDisassembly::gotoNext()
{
historyNext();
}
+
+void CPUDisassembly::findReferences()
+{
+ QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ DbgCmdExec(QString("findref " + addrText + ", " + addrText).toUtf8().constData());
+ emit displayReferencesWidget();
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
index 09196ce8..0989e51a 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
@@ -30,6 +30,7 @@ public:
void setHwBpAt(uint_t va, int slot);
signals:
+ void displayReferencesWidget();
public slots:
void toggleInt3BPAction();
@@ -49,6 +50,7 @@ public slots:
void followActionSlot();
void gotoPrevious();
void gotoNext();
+ void findReferences();
private:
@@ -60,6 +62,8 @@ private:
QMenu* mFollowMenu;
QMenu* mBPMenu;
QMenu* mHwSlotSelectMenu;
+ QMenu* mReferencesMenu;
+ QMenu* mSearchMenu;
QAction* mToggleInt3BpAction;
QAction* mSetHwBpAction;
@@ -78,6 +82,7 @@ private:
QAction* mGotoExpression;
QAction* mGotoPrevious;
QAction* mGotoNext;
+ QAction* mReferenceSelectedAddress;
};
#endif // CPUDISASSEMBLY_H
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp
index 4521a363..5ba0f63f 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp
@@ -97,12 +97,3 @@ QVBoxLayout* CPUWidget::getBotRightWidget(void)
{
return ui->mBotRightFrameLayout;
}
-
-void CPUWidget::runSelection()
-{
- if(!DbgIsDebugging())
- return;
- QString command = "bp " + QString("%1").arg(mDisas->rvaToVa(mDisas->getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper() + ", ss";
- if(DbgCmdExecDirect(command.toUtf8().constData()))
- DbgCmdExecDirect("run");
-}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h
index cb2940c2..e980d4fc 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h
@@ -28,17 +28,14 @@ public:
QVBoxLayout* getBotLeftWidget(void);
QVBoxLayout* getBotRightWidget(void);
-signals:
-
-public slots:
- void runSelection();
-
-private:
- Ui::CPUWidget *ui;
- Disassembly* mDisas;
+public:
+ CPUDisassembly* mDisas;
RegistersView* mGeneralRegs;
InfoBox* mInfo;
QTabWidget* mRegsTab;
+
+private:
+ Ui::CPUWidget *ui;
};
#endif // CPUWIDGET_H
diff --git a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp
index fc4c45f8..4fac23ca 100644
--- a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp
@@ -27,6 +27,8 @@ void ExceptionRangeDialog::on_editStart_textChanged(const QString &arg1)
ui->btnOk->setEnabled(false);
return;
}
+ if(ui->editStart->text()=="-1")
+ ui->editStart->setText("FFFFFFFF");
bool converted=false;
unsigned long start=ui->editStart->text().toUInt(&converted, 16);
if(!converted)
@@ -49,6 +51,8 @@ void ExceptionRangeDialog::on_editEnd_textChanged(const QString &arg1)
ui->btnOk->setEnabled(false);
return;
}
+ if(ui->editEnd->text()=="-1")
+ ui->editEnd->setText("FFFFFFFF");
bool converted=false;
unsigned long start=ui->editStart->text().toUInt(&converted, 16);
if(!converted)
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
index 01d38526..f33fde53 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
@@ -119,7 +119,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(ui->actioneRun,SIGNAL(triggered()),this,SLOT(execeRun()));
connect(ui->actioneRtr,SIGNAL(triggered()),this,SLOT(execeRtr()));
connect(ui->actionScript,SIGNAL(triggered()),this,SLOT(displayScriptWidget()));
- connect(ui->actionRunSelection,SIGNAL(triggered()),mCpuWidget,SLOT(runSelection()));
+ connect(ui->actionRunSelection,SIGNAL(triggered()),this,SLOT(runSelection()));
connect(ui->actionCpu,SIGNAL(triggered()),this,SLOT(displayCpuWidget()));
connect(ui->actionSymbolInfo,SIGNAL(triggered()),this,SLOT(displaySymbolWidget()));
connect(mSymbolView,SIGNAL(showCpu()),this,SLOT(displayCpuWidget()));
@@ -136,6 +136,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(Bridge::getBridge(), SIGNAL(menuAddMenuEntry(int,QString)), this, SLOT(addMenuEntry(int,QString)));
connect(Bridge::getBridge(), SIGNAL(menuAddSeparator(int)), this, SLOT(addSeparator(int)));
connect(Bridge::getBridge(), SIGNAL(menuClearMenu(int)), this, SLOT(clearMenu(int)));
+ connect(mCpuWidget->mDisas, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidget()));
//Set default setttings (when not set)
SettingsDialog defaultSettings;
@@ -529,7 +530,7 @@ void MainWindow::setLastException(unsigned int exceptionCode)
void MainWindow::findStrings()
{
- DbgCmdExec("strref");
+ DbgCmdExec(QString("strref " + QString("%1").arg(mCpuWidget->mDisas->rvaToVa(mCpuWidget->mDisas->getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper()).toUtf8().constData());
displayReferencesWidget();
}
@@ -669,3 +670,12 @@ void MainWindow::menuEntrySlot()
DbgMenuEntryClicked(hEntry);
}
}
+
+void MainWindow::runSelection()
+{
+ if(!DbgIsDebugging())
+ return;
+ QString command = "bp " + QString("%1").arg(mCpuWidget->mDisas->rvaToVa(mCpuWidget->mDisas->getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper() + ", ss";
+ if(DbgCmdExecDirect(command.toUtf8().constData()))
+ DbgCmdExecDirect("run");
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h
index d40c9f5b..48b3ef27 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h
@@ -67,6 +67,7 @@ public slots:
void addSeparator(int hMenu);
void clearMenu(int hMenu);
void menuEntrySlot();
+ void runSelection();
private:
Ui::MainWindow *ui;
From f35240b3bb542121aa41d7c464d763626245ca5b Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Tue, 29 Apr 2014 22:45:57 +0200
Subject: [PATCH 016/676] GUI: added 'Search for' context menu in the
disassembler. You can now search for constants (+strings) from this menu
---
.../Project/Src/BasicView/WordEditDialog.cpp | 4 ---
.../Project/Src/Gui/CPUDisassembly.cpp | 30 +++++++++++++++++--
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 5 ++++
x64_dbg_gui/Project/Src/Gui/MainWindow.ui | 2 +-
4 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp b/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp
index 4cbb50d2..3549f317 100644
--- a/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp
@@ -8,7 +8,6 @@ WordEditDialog::WordEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Wo
setModal(true);
setWindowFlags(Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint);
-
mWord = 0;
connect(ui->expressionLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(expressionChanged(QString)));
@@ -37,8 +36,6 @@ void WordEditDialog::expressionChanged(QString s)
}
}
-
-
void WordEditDialog::setup(QString title, uint_t defVal, int byteCount)
{
this->setWindowTitle(title);
@@ -51,7 +48,6 @@ void WordEditDialog::setup(QString title, uint_t defVal, int byteCount)
ui->expressionLineEdit->setFocus();
}
-
uint_t WordEditDialog::getVal()
{
return mWord;
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index e54be6de..3f77a539 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -189,7 +189,9 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
wMenu->addSeparator();
- //wMenu->addMenu(mSearchMenu);
+ mSearchMenu->addAction(mSearchConstant);
+ mSearchMenu->addAction(mSearchStrings);
+ wMenu->addMenu(mSearchMenu);
mReferencesMenu->addAction(mReferenceSelectedAddress);
wMenu->addMenu(mReferencesMenu);
@@ -290,8 +292,13 @@ void CPUDisassembly::setupRightClickContextMenu()
// Menu
mSearchMenu = new QMenu("&Search for", this);
- //
+ // Constant
+ mSearchConstant = new QAction("&Constant", this);
+ connect(mSearchConstant, SIGNAL(triggered()), this, SLOT(findConstant()));
+ // String References
+ mSearchStrings = new QAction("&String references", this);
+ connect(mSearchStrings, SIGNAL(triggered()), this, SLOT(findStrings()));
//---------------------- Breakpoints -----------------------------
// Menu
@@ -646,3 +653,22 @@ void CPUDisassembly::findReferences()
DbgCmdExec(QString("findref " + addrText + ", " + addrText).toUtf8().constData());
emit displayReferencesWidget();
}
+
+void CPUDisassembly::findConstant()
+{
+ WordEditDialog wordEdit(this);
+ wordEdit.setup("Constant", 0, sizeof(int_t));
+ if(wordEdit.exec() != QDialog::Accepted) //cancel pressed
+ return;
+ QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ QString constText=QString("%1").arg(wordEdit.getVal(), sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ DbgCmdExec(QString("findref " + constText + ", " + addrText).toUtf8().constData());
+ emit displayReferencesWidget();
+}
+
+void CPUDisassembly::findStrings()
+{
+ QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ DbgCmdExec(QString("strref " + addrText).toUtf8().constData());
+ emit displayReferencesWidget();
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
index 0989e51a..6fa4a7fe 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
@@ -12,6 +12,7 @@
#include
#include
#include
+#include "WordEditDialog.h"
class CPUDisassembly : public Disassembly
{
@@ -51,6 +52,8 @@ public slots:
void gotoPrevious();
void gotoNext();
void findReferences();
+ void findConstant();
+ void findStrings();
private:
@@ -83,6 +86,8 @@ private:
QAction* mGotoPrevious;
QAction* mGotoNext;
QAction* mReferenceSelectedAddress;
+ QAction* mSearchConstant;
+ QAction* mSearchStrings;
};
#endif // CPUDISASSEMBLY_H
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui
index 6461af13..e9ed7d2f 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui
@@ -494,7 +494,7 @@
&Find Strings
- &Find Strings
+ Find Strings
From 9cd792c070249047ded024644a2193d3b441bb7d Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Tue, 29 Apr 2014 22:47:48 +0200
Subject: [PATCH 017/676] GUI: 'Ready' instead of 'Terminated' on debugger
start
---
x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
index f33fde53..efc7662d 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
@@ -93,7 +93,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
// Status bar
mStatusLabel=new StatusLabel(ui->statusBar);
- mStatusLabel->setText("Terminated");
+ mStatusLabel->setText("Ready");
ui->statusBar->addWidget(mStatusLabel);
mLastLogLabel=new StatusLabel();
ui->statusBar->addPermanentWidget(mLastLogLabel, 1);
From 32ffed108b81d1da037c34f442ee0d5ad7d32ac2 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Tue, 29 Apr 2014 23:03:45 +0200
Subject: [PATCH 018/676] GUI: little refactoring
---
.../Project/Src/Gui/CPUDisassembly.cpp | 85 ++++++++++---------
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 3 -
2 files changed, 45 insertions(+), 43 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 3f77a539..12afed4f 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -206,6 +206,8 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
************************************************************************************/
void CPUDisassembly::setupRightClickContextMenu()
{
+ ///Setup menu actions
+
// Labels
mSetLabel = new QAction("Label", this);
mSetLabel->setShortcutContext(Qt::WidgetShortcut);
@@ -241,6 +243,48 @@ void CPUDisassembly::setupRightClickContextMenu()
this->addAction(mAssemble);
connect(mAssemble, SIGNAL(triggered()), this, SLOT(assembleAt()));
+ //---------------------- Breakpoints -----------------------------
+ // Menu
+ mBPMenu = new QMenu("Breakpoint", this);
+
+ // Standard breakpoint (option set using SetBPXOption)
+ mToggleInt3BpAction = new QAction("Toggle", this);
+ mToggleInt3BpAction->setShortcutContext(Qt::WidgetShortcut);
+ mToggleInt3BpAction->setShortcut(QKeySequence(Qt::Key_F2));
+ this->addAction(mToggleInt3BpAction);
+ connect(mToggleInt3BpAction, SIGNAL(triggered()), this, SLOT(toggleInt3BPAction()));
+
+ // HW BP
+ mHwSlotSelectMenu = new QMenu("Set Hardware on Execution", this);
+
+ mSetHwBpAction = new QAction("Set Hardware on Execution", this);
+ connect(mSetHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot()));
+
+ mClearHwBpAction = new QAction("Remove Hardware", this);
+ connect(mClearHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot()));
+
+ msetHwBPOnSlot0Action = new QAction("Set Hardware on Execution on Slot 0 (Free)", this);
+ connect(msetHwBPOnSlot0Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot0ActionSlot()));
+
+ msetHwBPOnSlot1Action = new QAction("Set Hardware on Execution on Slot 1 (Free)", this);
+ connect(msetHwBPOnSlot1Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot1ActionSlot()));
+
+ msetHwBPOnSlot2Action = new QAction("Set Hardware on Execution on Slot 2 (Free)", this);
+ connect(msetHwBPOnSlot2Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot2ActionSlot()));
+
+ msetHwBPOnSlot3Action = new QAction("Set Hardware on Execution on Slot 3 (Free)", this);
+ connect(msetHwBPOnSlot3Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot3ActionSlot()));
+
+ //--------------------------------------------------------------------
+
+ //---------------------- New origin here -----------------------------
+ mSetNewOriginHere = new QAction("Set New Origin Here", this);
+ mSetNewOriginHere->setShortcutContext(Qt::WidgetShortcut);
+ mSetNewOriginHere->setShortcut(QKeySequence("ctrl+*"));
+ this->addAction(mSetNewOriginHere);
+ connect(mSetNewOriginHere, SIGNAL(triggered()), this, SLOT(setNewOriginHereActionSlot()));
+
+
//---------------------- Go to -----------------------------------
// Menu
mGotoMenu = new QMenu("Go to", this);
@@ -299,45 +343,6 @@ void CPUDisassembly::setupRightClickContextMenu()
// String References
mSearchStrings = new QAction("&String references", this);
connect(mSearchStrings, SIGNAL(triggered()), this, SLOT(findStrings()));
-
- //---------------------- Breakpoints -----------------------------
- // Menu
- mBPMenu = new QMenu("Breakpoint", this);
-
- // Standard breakpoint (option set using SetBPXOption)
- mToggleInt3BpAction = new QAction("Toggle", this);
- mToggleInt3BpAction->setShortcutContext(Qt::WidgetShortcut);
- mToggleInt3BpAction->setShortcut(QKeySequence(Qt::Key_F2));
- this->addAction(mToggleInt3BpAction);
- connect(mToggleInt3BpAction, SIGNAL(triggered()), this, SLOT(toggleInt3BPAction()));
-
- // HW BP
- mHwSlotSelectMenu = new QMenu("Set Hardware on Execution", this);
-
- mSetHwBpAction = new QAction("Set Hardware on Execution", this);
- connect(mSetHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot()));
-
- mClearHwBpAction = new QAction("Remove Hardware", this);
- connect(mClearHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot()));
-
- msetHwBPOnSlot0Action = new QAction("Set Hardware on Execution on Slot 0 (Free)", this);
- connect(msetHwBPOnSlot0Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot0ActionSlot()));
-
- msetHwBPOnSlot1Action = new QAction("Set Hardware on Execution on Slot 1 (Free)", this);
- connect(msetHwBPOnSlot1Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot1ActionSlot()));
-
- msetHwBPOnSlot2Action = new QAction("Set Hardware on Execution on Slot 2 (Free)", this);
- connect(msetHwBPOnSlot2Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot2ActionSlot()));
-
- msetHwBPOnSlot3Action = new QAction("Set Hardware on Execution on Slot 3 (Free)", this);
- connect(msetHwBPOnSlot3Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot3ActionSlot()));
-
- //---------------------- New origin here -----------------------------
- mSetNewOriginHere = new QAction("Set New Origin Here", this);
- mSetNewOriginHere->setShortcutContext(Qt::WidgetShortcut);
- mSetNewOriginHere->setShortcut(QKeySequence("ctrl+*"));
- this->addAction(mSetNewOriginHere);
- connect(mSetNewOriginHere, SIGNAL(triggered()), this, SLOT(setNewOriginHereActionSlot()));
}
void CPUDisassembly::gotoOrigin()
@@ -657,7 +662,7 @@ void CPUDisassembly::findReferences()
void CPUDisassembly::findConstant()
{
WordEditDialog wordEdit(this);
- wordEdit.setup("Constant", 0, sizeof(int_t));
+ wordEdit.setup("Enter Constant", 0, sizeof(int_t));
if(wordEdit.exec() != QDialog::Accepted) //cancel pressed
return;
QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper();
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
index 6fa4a7fe..1c63cf37 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
@@ -57,9 +57,6 @@ public slots:
private:
- // Rigth Click Context Menu
- QMenu* mRightClickContextMenu;
-
// Menus
QMenu* mGotoMenu;
QMenu* mFollowMenu;
From c523a37dc0eb8ee46b89d956417cd5173e24235f Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 30 Apr 2014 01:16:12 +0200
Subject: [PATCH 019/676] DBG: fixed a bug in specialformat (thanks to Nukem
for reporting!)
---
x64_dbg_dbg/command.cpp | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/x64_dbg_dbg/command.cpp b/x64_dbg_dbg/command.cpp
index 2d18b419..6af81812 100644
--- a/x64_dbg_dbg/command.cpp
+++ b/x64_dbg_dbg/command.cpp
@@ -1,5 +1,6 @@
#include "command.h"
#include "argument.h"
+#include "value.h"
#include "console.h"
#include "debugger.h"
#include "math.h"
@@ -195,11 +196,20 @@ CMDRESULT cmdloop(COMMAND* command_list, CBCOMMAND cbUnknownCommand, CBCOMMANDPR
/*
- custom command formatting rules
*/
+
+static bool isvalidexpression(const char* expression)
+{
+ uint value;
+ return valfromstring(expression, &value);
+}
+
static void specialformat(char* string)
{
int len=strlen(string);
char* found=strstr(string, "=");
char* str=(char*)emalloc(len*2, "specialformat:str");
+ char* backup=(char*)emalloc(len+1, "specialformat:backup");
+ strcpy(backup, string); //create a backup of the string
memset(str, 0, len*2);
if(found) //contains =
{
@@ -210,6 +220,7 @@ static void specialformat(char* string)
{
*found='=';
efree(str, "specialformat:str");
+ efree(backup, "specialformat:backup");
return;
}
int flen=strlen(found); //n(+)=n++
@@ -224,20 +235,32 @@ static void specialformat(char* string)
{
char op=*a;
*a=0;
- sprintf(str, "mov %s,%s%c%s", string, string, op, found);
+ if(isvalidexpression(string))
+ sprintf(str, "mov %s,%s%c%s", string, string, op, found);
+ else
+ strcpy(str, backup);
}
else
- sprintf(str, "mov %s,%s", string, found);
+ {
+ if(isvalidexpression(string) && isvalidexpression(found))
+ sprintf(str, "mov %s,%s", string, found);
+ else
+ strcpy(str, backup);
+ }
strcpy(string, str);
}
else if((string[len-1]=='+' and string[len-2]=='+') or (string[len-1]=='-' and string[len-2]=='-')) //eax++/eax--
{
string[len-2]=0;
char op=string[len-1];
- sprintf(str, "mov %s,%s%c1", string, string, op);
+ if(isvalidexpression(string))
+ sprintf(str, "mov %s,%s%c1", string, string, op);
+ else
+ strcpy(str, backup);
strcpy(string, str);
}
efree(str, "specialformat:str");
+ efree(backup, "specialformat:backup");
}
/*
From 282e185557f269be2ffd33823443007eb893d6ad Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 1 May 2014 17:11:24 +0200
Subject: [PATCH 020/676] BRIDGE: added selection API
GUI: added selection API for Disassembly, Dump and Stack
---
x64_dbg_bridge/bridgemain.cpp | 10 +++++
x64_dbg_bridge/bridgemain.h | 16 +++++++-
.../Project/Src/BasicView/Disassembly.cpp | 2 -
x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 12 +++++-
x64_dbg_gui/Project/Src/BasicView/HexDump.h | 4 +-
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 38 +++++++++++++++++++
x64_dbg_gui/Project/Src/Bridge/Bridge.h | 9 ++++-
.../Project/Src/Gui/CPUDisassembly.cpp | 15 ++++++++
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 2 +
x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 14 +++++++
x64_dbg_gui/Project/Src/Gui/CPUDump.h | 3 ++
x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 14 +++++++
x64_dbg_gui/Project/Src/Gui/CPUStack.h | 2 +
13 files changed, 135 insertions(+), 6 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp
index 6f747860..cd0b18cd 100644
--- a/x64_dbg_bridge/bridgemain.cpp
+++ b/x64_dbg_bridge/bridgemain.cpp
@@ -814,6 +814,16 @@ BRIDGE_IMPEXP void GuiMenuClear(int hMenu)
_gui_sendmessage(GUI_MENU_CLEAR, (void*)(duint)hMenu, 0);
}
+BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection)
+{
+ return (bool)(duint)_gui_sendmessage(GUI_SELECTION_GET, (void*)(duint)hWindow, selection);
+}
+
+BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection)
+{
+ return (bool)(duint)_gui_sendmessage(GUI_SELECTION_SET, (void*)(duint)hWindow, (void*)selection);
+}
+
//Main
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 5557a0d9..48e75d47 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -489,6 +489,10 @@ BRIDGE_IMPEXP void DbgMenuEntryClicked(int hEntry);
//Gui defines
#define GUI_PLUGIN_MENU 0
+#define GUI_DISASSEMBLY 0
+#define GUI_DUMP 1
+#define GUI_STACK 2
+
//Gui enums
enum GUIMSG
{
@@ -533,7 +537,9 @@ enum GUIMSG
GUI_MENU_ADD, // param1=int hMenu, param2=const char* title
GUI_MENU_ADD_ENTRY, // param1=int hMenu, param2=const char* title
GUI_MENU_ADD_SEPARATOR, // param1=int hMenu, param2=unused
- GUI_MENU_CLEAR // param1=int hMenu, param2=unused
+ GUI_MENU_CLEAR, // param1=int hMenu, param2=unused
+ GUI_SELECTION_GET, // param1=int hWindow, param2=SELECTIONDATA* selection
+ GUI_SELECTION_SET // param1=int hWindow, param2=const SELECTIONDATA* selection
};
//GUI structures
@@ -544,6 +550,12 @@ struct CELLINFO
const char* str;
};
+struct SELECTIONDATA
+{
+ duint start;
+ duint end;
+};
+
//GUI functions
BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip);
BRIDGE_IMPEXP void GuiSetDebugState(DBGSTATE state);
@@ -588,6 +600,8 @@ BRIDGE_IMPEXP int GuiMenuAdd(int hMenu, const char* title);
BRIDGE_IMPEXP int GuiMenuAddEntry(int hMenu, const char* title);
BRIDGE_IMPEXP void GuiMenuAddSeparator(int hMenu);
BRIDGE_IMPEXP void GuiMenuClear(int hMenu);
+BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection);
+BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection);
#ifdef __cplusplus
}
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
index a4fd4fa4..7258b070 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
@@ -876,7 +876,6 @@ void Disassembly::expandSelectionUpTo(int_t to)
}
}
-
void Disassembly::setSingleSelection(int_t index)
{
mSelection.firstSelectedIndex = index;
@@ -906,7 +905,6 @@ int_t Disassembly::getSelectionEnd()
return mSelection.toIndex;
}
-
void Disassembly::selectNext()
{
int_t wAddr = getInstructionRVA(getInitialSelection(), 1);
diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
index dfa6456c..5a04d250 100644
--- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp
@@ -241,11 +241,21 @@ void HexDump::setSingleSelection(int_t rva)
mSelection.toIndex = rva;
}
-int HexDump::getInitialSelection()
+int_t HexDump::getInitialSelection()
{
return mSelection.firstSelectedIndex;
}
+int_t HexDump::getSelectionStart()
+{
+ return mSelection.fromIndex;
+}
+
+int_t HexDump::getSelectionEnd()
+{
+ return mSelection.toIndex;
+}
+
bool HexDump::isSelected(int_t rva)
{
if(rva >= mSelection.fromIndex && rva <= mSelection.toIndex)
diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.h b/x64_dbg_gui/Project/Src/BasicView/HexDump.h
index b54f31aa..bcfab897 100644
--- a/x64_dbg_gui/Project/Src/BasicView/HexDump.h
+++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.h
@@ -95,7 +95,9 @@ public:
// Selection Management
void expandSelectionUpTo(int_t rva);
void setSingleSelection(int_t rva);
- int getInitialSelection();
+ int_t getInitialSelection();
+ int_t getSelectionStart();
+ int_t getSelectionEnd();
bool isSelected(int_t rva);
QString getString(int col, int_t rva);
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
index 740800e1..b66fd361 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
@@ -256,6 +256,44 @@ void Bridge::emitMenuClearMenu(int hMenu)
emit menuClearMenu(hMenu);
}
+bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection)
+{
+ switch(hWindow)
+ {
+ case GUI_DISASSEMBLY:
+ emit selectionDisasmGet(selection);
+ break;
+ case GUI_DUMP:
+ emit selectionDumpGet(selection);
+ break;
+ case GUI_STACK:
+ emit selectionStackGet(selection);
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection)
+{
+ switch(hWindow)
+ {
+ case GUI_DISASSEMBLY:
+ emit selectionDisasmSet(selection);
+ break;
+ case GUI_DUMP:
+ emit selectionDumpSet(selection);
+ break;
+ case GUI_STACK:
+ emit selectionStackSet(selection);
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
/************************************************************************************
Static Functions
************************************************************************************/
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
index 09d39fac..9e317d9a 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
@@ -13,7 +13,6 @@
#include "Exports.h"
#include "Imports.h"
-
class Bridge : public QObject
{
Q_OBJECT
@@ -68,6 +67,8 @@ public:
int emitMenuAddMenuEntry(int hMenu, QString title);
void emitMenuAddSeparator(int hMenu);
void emitMenuClearMenu(int hMenu);
+ bool emitSelectionGet(int hWindow, SELECTIONDATA* selection);
+ bool emitSelectionSet(int hWindow, const SELECTIONDATA* selection);
//Public variables
void* winId;
@@ -113,6 +114,12 @@ signals:
void menuAddMenuEntry(int hMenu, QString title);
void menuAddSeparator(int hMenu);
void menuClearMenu(int hMenu);
+ void selectionDisasmGet(SELECTIONDATA* selection);
+ void selectionDisasmSet(const SELECTIONDATA* selection);
+ void selectionDumpGet(SELECTIONDATA* selection);
+ void selectionDumpSet(const SELECTIONDATA* selection);
+ void selectionStackGet(SELECTIONDATA* selection);
+ void selectionStackSet(const SELECTIONDATA* selection);
private:
QMutex mBridgeMutex;
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 12afed4f..5a937a9b 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -4,6 +4,9 @@ CPUDisassembly::CPUDisassembly(QWidget *parent) : Disassembly(parent)
{
// Create the action list for the right click context menu
setupRightClickContextMenu();
+
+ connect(Bridge::getBridge(), SIGNAL(selectionDisasmGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*)));
+ connect(Bridge::getBridge(), SIGNAL(selectionDisasmSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*)));
}
void CPUDisassembly::mousePressEvent(QMouseEvent* event)
@@ -677,3 +680,15 @@ void CPUDisassembly::findStrings()
DbgCmdExec(QString("strref " + addrText).toUtf8().constData());
emit displayReferencesWidget();
}
+
+void CPUDisassembly::selectionGet(SELECTIONDATA* selection)
+{
+ selection->start=getSelectionStart();
+ selection->end=getSelectionEnd();
+}
+
+void CPUDisassembly::selectionSet(const SELECTIONDATA* selection)
+{
+ setSingleSelection(selection->start);
+ expandSelectionUpTo(selection->end);
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
index 1c63cf37..1ae13df7 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
@@ -54,6 +54,8 @@ public slots:
void findReferences();
void findConstant();
void findStrings();
+ void selectionGet(SELECTIONDATA* selection);
+ void selectionSet(const SELECTIONDATA* selection);
private:
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
index 2344557c..3bb6562b 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
@@ -5,6 +5,8 @@ CPUDump::CPUDump(QWidget *parent) : HexDump(parent)
hexAsciiSlot();
connect(Bridge::getBridge(), SIGNAL(dumpAt(int_t)), this, SLOT(printDumpAt(int_t)));
+ connect(Bridge::getBridge(), SIGNAL(selectionDumpGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*)));
+ connect(Bridge::getBridge(), SIGNAL(selectionDumpSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*)));
setupContextMenu();
}
@@ -580,3 +582,15 @@ void CPUDump::disassemblySlot()
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
msg.exec();
}
+
+void CPUDump::selectionGet(SELECTIONDATA* selection)
+{
+ selection->start=getSelectionStart();
+ selection->end=getSelectionEnd();
+}
+
+void CPUDump::selectionSet(const SELECTIONDATA* selection)
+{
+ setSingleSelection(selection->start);
+ expandSelectionUpTo(selection->end);
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.h b/x64_dbg_gui/Project/Src/Gui/CPUDump.h
index cea3b1c7..80f07a0e 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDump.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.h
@@ -45,6 +45,9 @@ public slots:
void addressSlot();
void disassemblySlot();
+ void selectionGet(SELECTIONDATA* selection);
+ void selectionSet(const SELECTIONDATA* selection);
+
private:
QMenu* mGotoMenu;
QAction* mGotoExpression;
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
index 4669e538..59478fde 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
@@ -26,6 +26,8 @@ CPUStack::CPUStack(QWidget *parent) : HexDump(parent)
appendDescriptor(0, "Comments", false, wColDesc);
connect(Bridge::getBridge(), SIGNAL(stackDumpAt(uint_t,uint_t)), this, SLOT(stackDumpAt(uint_t,uint_t)));
+ connect(Bridge::getBridge(), SIGNAL(selectionStackGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*)));
+ connect(Bridge::getBridge(), SIGNAL(selectionStackSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*)));
setupContextMenu();
}
@@ -167,3 +169,15 @@ void CPUStack::gotoExpressionSlot()
DbgCmdExec(cmd.sprintf("sdump \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData());
}
}
+
+void CPUStack::selectionGet(SELECTIONDATA* selection)
+{
+ selection->start=getSelectionStart();
+ selection->end=getSelectionEnd();
+}
+
+void CPUStack::selectionSet(const SELECTIONDATA* selection)
+{
+ setSingleSelection(selection->start);
+ expandSelectionUpTo(selection->end);
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.h b/x64_dbg_gui/Project/Src/Gui/CPUStack.h
index 0de3a760..6d2d0257 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.h
@@ -25,6 +25,8 @@ public slots:
void gotoSpSlot();
void gotoBpSlot();
void gotoExpressionSlot();
+ void selectionGet(SELECTIONDATA* selection);
+ void selectionSet(const SELECTIONDATA* selection);
private:
uint_t mCsp;
From 92df7faea122481fc646c92f97523f563cc072d5 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 1 May 2014 18:39:40 +0200
Subject: [PATCH 021/676] DBG: added size argument to 'find', 'strref' and
'reffind'
DBG: updated reference API to support a custom size and start address
PROJECT: updated help
---
help/find.htm | 6 ++-
help/reffind_findref_ref.htm | 85 +++++++++++++++++++-----------------
help/refstr_strref.htm | 53 +++++++++++-----------
x64_dbg_dbg/instruction.cpp | 32 +++++++++++---
x64_dbg_dbg/reference.cpp | 40 ++++++++++++-----
x64_dbg_dbg/reference.h | 2 +-
6 files changed, 135 insertions(+), 83 deletions(-)
diff --git a/help/find.htm b/help/find.htm
index 110e18b6..9cf8087d 100644
--- a/help/find.htm
+++ b/help/find.htm
@@ -21,9 +21,11 @@ from. Notice that the searching will stop when the end of the memory page this
address resides in has been reached. This means you cannot search the complete
process memory without enumerating the memory pages first.
arg2: The byte pattern to search for. This byte
-pattern can contain wildcards (?) for example: "EB0?90??8D"
+pattern can contain wildcards (?) for example: "EB0?90??8D".
+ [arg3]:
+The size of the data to search in.
result
The $result variable is set to the virtual
address of the address that matches the byte pattern. $result will be 0 when the pattern could not be
matched.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/help/reffind_findref_ref.htm b/help/reffind_findref_ref.htm
index 734b5778..61ba8cae 100644
--- a/help/reffind_findref_ref.htm
+++ b/help/reffind_findref_ref.htm
@@ -1,39 +1,46 @@
-
-
-
-reffind/findref/ref
-
-
-
-
-
-
-
-reffind[,findref,ref]
Find references to a certain value.
-arguments
-
-arg1: The value to look for.
-
-
-
-
-[arg2]: Address of/inside a memory page to look
-in. When
-not specified CIP will be used.
-
-
-
-
-
- result
-
-
-The $result variable is set to the number of references
-found.
\ No newline at end of file
+
+
+
+reffind/findref/ref
+
+
+
+
+
+
+
+reffind[,findref,ref]
Find references to a certain value.
+arguments
+
+arg1: The value to look for.
+
+
+
+
+[arg2]: Address of/inside a memory page to look
+in. When
+not specified CIP will be used.
+
+
+
+
+ [arg3]:
+The size
+of the data to search in.
+
+
+
+
+
+ result
+
+
+The $result variable is set to the number of references
+found.
\ No newline at end of file
diff --git a/help/refstr_strref.htm b/help/refstr_strref.htm
index c9bfc8f4..731ad8ed 100644
--- a/help/refstr_strref.htm
+++ b/help/refstr_strref.htm
@@ -1,25 +1,28 @@
-
-
-
-refstr/strref
-
-
-
-
-
-
-
-refstr[,strref]
Find referenced text strings.
-arguments
[arg1]: Address of/inside a memory page to find
-referenced text strings in. When not specified CIP
-will be used.
-result
The $result variable is set to the number of string references
-found.
\ No newline at end of file
+
+
+
+refstr/strref
+
+
+
+
+
+
+
+refstr[,strref]
Find referenced text strings.
+arguments
[arg1]: Address of/inside a memory page to find
+referenced text strings in. When not specified CIP
+will be used.
+
+ [arg2]: The size of the data
+to search in.
+result
The $result variable is set to the number of string references
+found.
\ No newline at end of file
diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp
index 3704c818..6b005073 100644
--- a/x64_dbg_dbg/instruction.cpp
+++ b/x64_dbg_dbg/instruction.cpp
@@ -782,17 +782,23 @@ CMDRESULT cbInstrRefFind(int argc, char* argv[])
{
if(argc<2)
{
- puts("not enough arguments!");
+ dputs("not enough arguments!");
return STATUS_ERROR;
}
uint value=0;
if(!valfromstring(argv[1], &value, false))
return STATUS_ERROR;
uint addr=0;
- if(argc<3 or !valfromstring(argv[2], &addr, true))
+ if(argc<3 or !valfromstring(argv[2], &addr))
addr=GetContextData(UE_CIP);
+ uint size;
+ if(argc>=4)
+ {
+ if(!valfromstring(argv[3], &size))
+ size=0;
+ }
uint ticks=GetTickCount();
- int found=reffind(addr, cbRefFind, (void*)value, false);
+ int found=reffind(addr, size, cbRefFind, (void*)value, false);
dprintf("%u references in %ums\n", found, GetTickCount()-ticks);
varset("$result", found, false);
return STATUS_CONTINUE;
@@ -852,8 +858,14 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[])
uint addr;
if(argc<2 or !valfromstring(argv[1], &addr, true))
addr=GetContextData(UE_CIP);
+ uint size;
+ if(argc>=3)
+ {
+ if(!valfromstring(argv[2], &size, true))
+ size=0;
+ }
uint ticks=GetTickCount();
- int found=reffind(addr, cbRefStr, 0, false);
+ int found=reffind(addr, size, cbRefStr, 0, false);
dprintf("%u references in %ums\n", found, GetTickCount()-ticks);
varset("$result", found, false);
return STATUS_CONTINUE;
@@ -953,7 +965,17 @@ CMDRESULT cbInstrFind(int argc, char* argv[])
return STATUS_ERROR;
}
uint start=addr-base;
- uint foundoffset=memfindpattern(data+start, size-start, pattern);
+ uint find_size=0;
+ if(argc>=4)
+ {
+ if(!valfromstring(argv[3], &find_size))
+ find_size=size-start;
+ if(find_size>(size-start))
+ find_size=size-start;
+ }
+ else
+ find_size=size-start;
+ uint foundoffset=memfindpattern(data+start, find_size, pattern);
uint result=0;
if(foundoffset!=-1)
result=addr+foundoffset;
diff --git a/x64_dbg_dbg/reference.cpp b/x64_dbg_dbg/reference.cpp
index 8465ceb8..f278a7de 100644
--- a/x64_dbg_dbg/reference.cpp
+++ b/x64_dbg_dbg/reference.cpp
@@ -3,22 +3,40 @@
#include "memory.h"
#include "console.h"
-int reffind(uint addr, CBREF cbRef, void* userinfo, bool silent)
+int reffind(uint addr, uint size, CBREF cbRef, void* userinfo, bool silent)
{
- uint size=0;
- uint base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &size);
- if(!base or !size)
+ uint start_addr;
+ uint start_size;
+ uint base;
+ uint base_size;
+ base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &base_size);
+ if(!base or !base_size)
{
if(!silent)
dputs("invalid memory page");
return 0;
}
- unsigned char* data=(unsigned char*)emalloc(size);
- if(!memread(fdProcessInfo->hProcess, (const void*)base, data, size, 0))
+
+ if(!size) //assume the whole page
+ {
+ start_addr=base;
+ start_size=base_size;
+ }
+ else //custom boundaries
+ {
+ start_addr=addr;
+ uint maxsize=size-(start_addr-base);
+ if(sizehProcess, (const void*)start_addr, data, start_size, 0))
{
if(!silent)
dputs("error reading memory");
- efree(data);
+ efree(data, "reffind:data");
return 0;
}
DISASM disasm;
@@ -27,18 +45,18 @@ int reffind(uint addr, CBREF cbRef, void* userinfo, bool silent)
disasm.Archi=64;
#endif // _WIN64
disasm.EIP=(UIntPtr)data;
- disasm.VirtualAddr=(UInt64)base;
+ disasm.VirtualAddr=(UInt64)start_addr;
uint i=0;
BASIC_INSTRUCTION_INFO basicinfo;
cbRef(&disasm, &basicinfo, 0); //allow initializing
REFINFO refinfo;
memset(&refinfo, 0, sizeof(REFINFO));
refinfo.userinfo=userinfo;
- while(i
Date: Fri, 2 May 2014 18:40:00 +0200
Subject: [PATCH 022/676] GUI: fixed GuiSelectionGet & GuiSelectionSet
---
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 30 ++++++++++++++++++-
.../Project/Src/Gui/CPUDisassembly.cpp | 20 ++++++++++---
x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 20 ++++++++++---
x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 20 ++++++++++---
4 files changed, 77 insertions(+), 13 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
index b66fd361..31342c7b 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
@@ -258,6 +258,10 @@ void Bridge::emitMenuClearMenu(int hMenu)
bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection)
{
+ if(!DbgIsDebugging())
+ return false;
+ mBridgeMutex.lock();
+ hasBridgeResult=false;
switch(hWindow)
{
case GUI_DISASSEMBLY:
@@ -270,13 +274,21 @@ bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection)
emit selectionStackGet(selection);
break;
default:
+ mBridgeMutex.unlock();
return false;
}
+ while(!hasBridgeResult) //wait for thread completion
+ Sleep(100);
+ mBridgeMutex.unlock();
return true;
}
bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection)
{
+ if(!DbgIsDebugging())
+ return false;
+ mBridgeMutex.lock();
+ hasBridgeResult=false;
switch(hWindow)
{
case GUI_DISASSEMBLY:
@@ -289,9 +301,13 @@ bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection)
emit selectionStackSet(selection);
break;
default:
+ mBridgeMutex.unlock();
return false;
}
- return true;
+ while(!hasBridgeResult) //wait for thread completion
+ Sleep(100);
+ mBridgeMutex.unlock();
+ return bridgeResult;
}
/************************************************************************************
@@ -587,6 +603,18 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
}
break;
+ case GUI_SELECTION_GET:
+ {
+ Bridge::getBridge()->emitSelectionGet((int)(uint_t)param1, (SELECTIONDATA*)param2);
+ }
+ break;
+
+ case GUI_SELECTION_SET:
+ {
+ Bridge::getBridge()->emitSelectionSet((int)(uint_t)param1, (const SELECTIONDATA*)param2);
+ }
+ break;
+
default:
{
}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 5a937a9b..783dc02e 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -683,12 +683,24 @@ void CPUDisassembly::findStrings()
void CPUDisassembly::selectionGet(SELECTIONDATA* selection)
{
- selection->start=getSelectionStart();
- selection->end=getSelectionEnd();
+ selection->start=rvaToVa(getSelectionStart());
+ selection->end=rvaToVa(getSelectionEnd());
+ Bridge::getBridge()->BridgeSetResult(1);
}
void CPUDisassembly::selectionSet(const SELECTIONDATA* selection)
{
- setSingleSelection(selection->start);
- expandSelectionUpTo(selection->end);
+ int_t selMin=getBase();
+ int_t selMax=selMin + getSize();
+ int_t start=selection->start;
+ int_t end=selection->end;
+ if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
+ {
+ Bridge::getBridge()->BridgeSetResult(0);
+ return;
+ }
+ setSingleSelection(start - selMin);
+ expandSelectionUpTo(end - selMin);
+ reloadData();
+ Bridge::getBridge()->BridgeSetResult(1);
}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
index 3bb6562b..52ee5884 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
@@ -585,12 +585,24 @@ void CPUDump::disassemblySlot()
void CPUDump::selectionGet(SELECTIONDATA* selection)
{
- selection->start=getSelectionStart();
- selection->end=getSelectionEnd();
+ selection->start=getSelectionStart() + mBase;
+ selection->end=getSelectionEnd() + mBase;
+ Bridge::getBridge()->BridgeSetResult(1);
}
void CPUDump::selectionSet(const SELECTIONDATA* selection)
{
- setSingleSelection(selection->start);
- expandSelectionUpTo(selection->end);
+ int_t selMin=mBase;
+ int_t selMax=selMin + mSize;
+ int_t start=selection->start;
+ int_t end=selection->end;
+ if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
+ {
+ Bridge::getBridge()->BridgeSetResult(0);
+ return;
+ }
+ setSingleSelection(start - selMin);
+ expandSelectionUpTo(end - selMin);
+ reloadData();
+ Bridge::getBridge()->BridgeSetResult(1);
}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
index 59478fde..9e6ed4f7 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
@@ -172,12 +172,24 @@ void CPUStack::gotoExpressionSlot()
void CPUStack::selectionGet(SELECTIONDATA* selection)
{
- selection->start=getSelectionStart();
- selection->end=getSelectionEnd();
+ selection->start=getSelectionStart() + mBase;
+ selection->end=getSelectionEnd() + mBase;
+ Bridge::getBridge()->BridgeSetResult(1);
}
void CPUStack::selectionSet(const SELECTIONDATA* selection)
{
- setSingleSelection(selection->start);
- expandSelectionUpTo(selection->end);
+ int_t selMin=mBase;
+ int_t selMax=selMin + mSize;
+ int_t start=selection->start;
+ int_t end=selection->end;
+ if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range
+ {
+ Bridge::getBridge()->BridgeSetResult(0);
+ return;
+ }
+ setSingleSelection(start - selMin);
+ expandSelectionUpTo(end - selMin);
+ reloadData();
+ Bridge::getBridge()->BridgeSetResult(1);
}
From 41fc89f40258748d1d11eb23a45120c611421347 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sun, 4 May 2014 17:33:23 +0200
Subject: [PATCH 023/676] DBG: strings in the stack
---
x64_dbg_dbg/disasm_helper.cpp | 2 +
x64_dbg_dbg/instruction.cpp | 4 +-
x64_dbg_dbg/stackinfo.cpp | 168 ++++++++++++++++++----------------
3 files changed, 94 insertions(+), 80 deletions(-)
diff --git a/x64_dbg_dbg/disasm_helper.cpp b/x64_dbg_dbg/disasm_helper.cpp
index ddfdc02d..2fb64231 100644
--- a/x64_dbg_dbg/disasm_helper.cpp
+++ b/x64_dbg_dbg/disasm_helper.cpp
@@ -324,6 +324,8 @@ bool disasmgetstringat(uint addr, STRING_TYPE* type, char* ascii, char* unicode,
{
if(type)
*type=str_none;
+ if(!disasmispossiblestring(addr))
+ return false;
unsigned char* data=(unsigned char*)emalloc((maxlen+1)*2, "disasmgetstringat:data");
memset(data, 0, (maxlen+1)*2);
if(!memread(fdProcessInfo->hProcess, (const void*)addr, data, (maxlen+1)*2, 0))
diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp
index 6b005073..22fc8b46 100644
--- a/x64_dbg_dbg/instruction.cpp
+++ b/x64_dbg_dbg/instruction.cpp
@@ -824,12 +824,12 @@ bool cbRefStr(DISASM* disasm, BASIC_INSTRUCTION_INFO* basicinfo, REFINFO* refinf
return false;
if((basicinfo->type&TYPE_VALUE)==TYPE_VALUE)
{
- if(disasmispossiblestring(basicinfo->value.value) and disasmgetstringat(basicinfo->value.value, &strtype, string, string, 500))
+ if(disasmgetstringat(basicinfo->value.value, &strtype, string, string, 500))
found=true;
}
if((basicinfo->type&TYPE_MEMORY)==TYPE_MEMORY)
{
- if(!found and disasmispossiblestring(basicinfo->memory.value) and disasmgetstringat(basicinfo->memory.value, &strtype, string, string, 500))
+ if(!found and disasmgetstringat(basicinfo->memory.value, &strtype, string, string, 500))
found=true;
}
if(found)
diff --git a/x64_dbg_dbg/stackinfo.cpp b/x64_dbg_dbg/stackinfo.cpp
index db38b117..49c6ce73 100644
--- a/x64_dbg_dbg/stackinfo.cpp
+++ b/x64_dbg_dbg/stackinfo.cpp
@@ -11,88 +11,100 @@ bool stackcommentget(uint addr, STACK_COMMENT* comment)
uint data=0;
memset(comment, 0, sizeof(STACK_COMMENT));
memread(fdProcessInfo->hProcess, (const void*)addr, &data, sizeof(uint), 0);
- if(memisvalidreadptr(fdProcessInfo->hProcess, data)) //valid memory
- {
- uint size=0;
- uint base=memfindbaseaddr(fdProcessInfo->hProcess, data, &size);
- uint readStart=data-16*4;
- if(readStarthProcess, (const void*)readStart, disasmData, sizeof(disasmData), 0);
- unsigned int prev=disasmback(disasmData, 0, sizeof(disasmData), data-readStart, 1);
- uint previousInstr=readStart+prev;
- DISASM disasm;
- disasm.Options=NoformatNumeral;
+ if(!memisvalidreadptr(fdProcessInfo->hProcess, data)) //the stack value is no pointer
+ return false;
+
+ uint size=0;
+ uint base=memfindbaseaddr(fdProcessInfo->hProcess, data, &size);
+ uint readStart=data-16*4;
+ if(readStarthProcess, (const void*)readStart, disasmData, sizeof(disasmData), 0);
+ unsigned int prev=disasmback(disasmData, 0, sizeof(disasmData), data-readStart, 1);
+ uint previousInstr=readStart+prev;
+ DISASM disasm;
+ disasm.Options=NoformatNumeral;
#ifdef _WIN64
- disasm.Archi=64;
+ disasm.Archi=64;
#endif // _WIN64
- disasm.VirtualAddr=previousInstr;
- disasm.EIP=(UIntPtr)(disasmData+prev);
- int len=Disasm(&disasm);
- static char instruction[INSTRUCT_LENGTH]="";
- if(len!=UNKNOWN_OPCODE && disasm.Instruction.BranchType==CallType) //call
- {
- DISASM_INSTR instr;
- memset(&instr, 0, sizeof(instr));
- disasmget((unsigned char*)disasm.EIP, previousInstr, &instr);
-
- char label[MAX_LABEL_SIZE]="";
- ADDRINFO addrinfo;
- addrinfo.flags=flaglabel;
- if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo))
- strcpy(label, addrinfo.label);
- char module[MAX_MODULE_SIZE]="";
- modnamefromaddr(data, module, false);
- char returnToAddr[MAX_COMMENT_SIZE]="";
- if(*module)
- sprintf(returnToAddr, "%s.", module);
- if(!*label)
- sprintf(label, fhex, data);
- strcat(returnToAddr, label);
+ disasm.VirtualAddr=previousInstr;
+ disasm.EIP=(UIntPtr)(disasmData+prev);
+ int len=Disasm(&disasm);
+ static char instruction[INSTRUCT_LENGTH]="";
+ if(len!=UNKNOWN_OPCODE && disasm.Instruction.BranchType==CallType) //call
+ {
+ DISASM_INSTR instr;
+ memset(&instr, 0, sizeof(instr));
+ disasmget((unsigned char*)disasm.EIP, previousInstr, &instr);
- data=instr.arg[0].value;
- *label=0;
- addrinfo.flags=flaglabel;
- if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo))
- strcpy(label, addrinfo.label);
- *module=0;
- modnamefromaddr(data, module, false);
- char returnFromAddr[MAX_COMMENT_SIZE]="";
- if(*module)
- sprintf(returnFromAddr, "%s.", module);
- if(!*label)
- sprintf(label, fhex, data);
- strcat(returnFromAddr, label);
+ char label[MAX_LABEL_SIZE]="";
+ ADDRINFO addrinfo;
+ addrinfo.flags=flaglabel;
+ if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo))
+ strcpy(label, addrinfo.label);
+ char module[MAX_MODULE_SIZE]="";
+ modnamefromaddr(data, module, false);
+ char returnToAddr[MAX_COMMENT_SIZE]="";
+ if(*module)
+ sprintf(returnToAddr, "%s.", module);
+ if(!*label)
+ sprintf(label, fhex, data);
+ strcat(returnToAddr, label);
- sprintf(comment->comment, "return to %s from %s", returnToAddr, returnFromAddr);
- strcpy(comment->color, "#ff0000");
- return true;
- }
- else
- {
- char label[MAX_LABEL_SIZE]="";
- ADDRINFO addrinfo;
- addrinfo.flags=flaglabel;
- if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo))
- strcpy(label, addrinfo.label);
- char module[MAX_MODULE_SIZE]="";
- modnamefromaddr(data, module, false);
- char addrInfo[MAX_COMMENT_SIZE]="";
- if(*module) //module
- {
- if(*label) //+label
- sprintf(comment->comment, "%s.%s", module, label);
- else //module only
- sprintf(comment->comment, "%s."fhex, module, data);
- return true;
- }
- else if(*label) //label only
- {
- sprintf(comment->comment, "<%s>", label);
- return true;
- }
- }
+ data=instr.arg[0].value;
+ *label=0;
+ addrinfo.flags=flaglabel;
+ if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo))
+ strcpy(label, addrinfo.label);
+ *module=0;
+ modnamefromaddr(data, module, false);
+ char returnFromAddr[MAX_COMMENT_SIZE]="";
+ if(*module)
+ sprintf(returnFromAddr, "%s.", module);
+ if(!*label)
+ sprintf(label, fhex, data);
+ strcat(returnFromAddr, label);
+
+ sprintf(comment->comment, "return to %s from %s", returnToAddr, returnFromAddr);
+ strcpy(comment->color, "#ff0000");
+ return true;
}
+
+ //string
+ STRING_TYPE strtype;
+ char string[512]="";
+ if(disasmgetstringat(data, &strtype, string, string, 500))
+ {
+ if(strtype==str_ascii)
+ sprintf(comment->comment, "\"%s\"", string);
+ else //unicode
+ sprintf(comment->comment, "L\"%s\"", string);
+ return true;
+ }
+
+ //label
+ char label[MAX_LABEL_SIZE]="";
+ ADDRINFO addrinfo;
+ addrinfo.flags=flaglabel;
+ if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo))
+ strcpy(label, addrinfo.label);
+ char module[MAX_MODULE_SIZE]="";
+ modnamefromaddr(data, module, false);
+ char addrInfo[MAX_COMMENT_SIZE]="";
+ if(*module) //module
+ {
+ if(*label) //+label
+ sprintf(comment->comment, "%s.%s", module, label);
+ else //module only
+ sprintf(comment->comment, "%s."fhex, module, data);
+ return true;
+ }
+ else if(*label) //label only
+ {
+ sprintf(comment->comment, "<%s>", label);
+ return true;
+ }
+
return false;
}
\ No newline at end of file
From 5b92f63e29d3fc2044d73f98cf931a799027b581 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Mon, 5 May 2014 18:16:56 +0200
Subject: [PATCH 024/676] DBG: fixed a bug with the reference functions
---
x64_dbg_dbg/instruction.cpp | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp
index 22fc8b46..ca067cc4 100644
--- a/x64_dbg_dbg/instruction.cpp
+++ b/x64_dbg_dbg/instruction.cpp
@@ -791,12 +791,10 @@ CMDRESULT cbInstrRefFind(int argc, char* argv[])
uint addr=0;
if(argc<3 or !valfromstring(argv[2], &addr))
addr=GetContextData(UE_CIP);
- uint size;
+ uint size=0;
if(argc>=4)
- {
if(!valfromstring(argv[3], &size))
size=0;
- }
uint ticks=GetTickCount();
int found=reffind(addr, size, cbRefFind, (void*)value, false);
dprintf("%u references in %ums\n", found, GetTickCount()-ticks);
@@ -858,12 +856,10 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[])
uint addr;
if(argc<2 or !valfromstring(argv[1], &addr, true))
addr=GetContextData(UE_CIP);
- uint size;
+ uint size=0;
if(argc>=3)
- {
if(!valfromstring(argv[2], &size, true))
size=0;
- }
uint ticks=GetTickCount();
int found=reffind(addr, size, cbRefStr, 0, false);
dprintf("%u references in %ums\n", found, GetTickCount()-ticks);
From b4374713fe6714a2107bb34a41081f7908fc5a2f Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Mon, 5 May 2014 21:49:26 +0200
Subject: [PATCH 025/676] GUI: added stack 'follow in dump/stack/disassembler'
context menu to the GUI
---
x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 64 ++++++++++++++++++++++++
x64_dbg_gui/Project/Src/Gui/CPUStack.h | 6 +++
2 files changed, 70 insertions(+)
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
index 9e6ed4f7..92af0299 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
@@ -52,6 +52,18 @@ void CPUStack::setupContextMenu()
mGotoExpression->setShortcut(QKeySequence("ctrl+g"));
this->addAction(mGotoExpression);
connect(mGotoExpression, SIGNAL(triggered()), this, SLOT(gotoExpressionSlot()));
+
+ mFollowDisasm = new QAction("&Follow in Disassembler", this);
+ mFollowDisasm->setShortcutContext(Qt::WidgetShortcut);
+ mFollowDisasm->setShortcut(QKeySequence("enter"));
+ this->addAction(mFollowDisasm);
+ connect(mFollowDisasm, SIGNAL(triggered()), this, SLOT(followDisasmSlot()));
+
+ mFollowDump = new QAction("Follow in &Dump", this);
+ connect(mFollowDump, SIGNAL(triggered()), this, SLOT(followDumpSlot()));
+
+ mFollowStack = new QAction("Follow in &Stack", this);
+ connect(mFollowStack, SIGNAL(triggered()), this, SLOT(followStackSlot()));
}
QString CPUStack::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h)
@@ -124,10 +136,26 @@ void CPUStack::contextMenuEvent(QContextMenuEvent* event)
{
if(!DbgIsDebugging())
return;
+
QMenu* wMenu = new QMenu(this); //create context menu
wMenu->addAction(mGotoSp);
wMenu->addAction(mGotoBp);
wMenu->addAction(mGotoExpression);
+
+ int_t selectedVa = getInitialSelection() + mMemPage->getBase();
+ uint_t selectedData;
+ if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t)))
+ if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer
+ {
+ uint_t stackBegin = mMemPage->getBase();
+ uint_t stackEnd = stackBegin + mMemPage->getSize();
+ if(selectedData >= stackBegin && selectedData < stackEnd)
+ wMenu->addAction(mFollowStack);
+ else
+ wMenu->addAction(mFollowDisasm);
+ wMenu->addAction(mFollowDump);
+ }
+
wMenu->exec(event->globalPos());
}
@@ -193,3 +221,39 @@ void CPUStack::selectionSet(const SELECTIONDATA* selection)
reloadData();
Bridge::getBridge()->BridgeSetResult(1);
}
+
+void CPUStack::followDisasmSlot()
+{
+ int_t selectedVa = getInitialSelection() + mMemPage->getBase();
+ uint_t selectedData;
+ if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t)))
+ if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer
+ {
+ QString addrText=QString("%1").arg(selectedData, sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ DbgCmdExec(QString("disasm " + addrText).toUtf8().constData());
+ }
+}
+
+void CPUStack::followDumpSlot()
+{
+ int_t selectedVa = getInitialSelection() + mMemPage->getBase();
+ uint_t selectedData;
+ if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t)))
+ if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer
+ {
+ QString addrText=QString("%1").arg(selectedData, sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ DbgCmdExec(QString("dump " + addrText).toUtf8().constData());
+ }
+}
+
+void CPUStack::followStackSlot()
+{
+ int_t selectedVa = getInitialSelection() + mMemPage->getBase();
+ uint_t selectedData;
+ if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t)))
+ if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer
+ {
+ QString addrText=QString("%1").arg(selectedData, sizeof(int_t)*2, 16, QChar('0')).toUpper();
+ DbgCmdExec(QString("sdump " + addrText).toUtf8().constData());
+ }
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.h b/x64_dbg_gui/Project/Src/Gui/CPUStack.h
index 6d2d0257..a6596d2a 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.h
@@ -27,6 +27,9 @@ public slots:
void gotoExpressionSlot();
void selectionGet(SELECTIONDATA* selection);
void selectionSet(const SELECTIONDATA* selection);
+ void followDisasmSlot();
+ void followDumpSlot();
+ void followStackSlot();
private:
uint_t mCsp;
@@ -34,6 +37,9 @@ private:
QAction* mGotoSp;
QAction* mGotoBp;
QAction* mGotoExpression;
+ QAction* mFollowDisasm;
+ QAction* mFollowDump;
+ QAction* mFollowStack;
};
#endif // CPUSTACK_H
From 0972dfdcee5a91b32fe9cdf1d13011d037778dfe Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 7 May 2014 20:45:52 +0200
Subject: [PATCH 026/676] DBG: updated plugin SDK version, fixed issue #95 (I
think)
---
x64_dbg_bridge/bridgemain.h | 6 +++++-
x64_dbg_dbg/_plugins.h | 6 +++++-
x64_dbg_dbg/plugin_loader.cpp | 6 ++++++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 48e75d47..e04cc5ac 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -3,6 +3,8 @@
#include
+#pragma pack(push, 1)
+
#ifdef _WIN64
typedef unsigned long long duint;
typedef signed long long dsint;
@@ -26,7 +28,7 @@ extern "C"
//Bridge defines
#define MAX_SETTING_SIZE 65536
-#define DBG_VERSION 15
+#define DBG_VERSION 16
//Bridge functions
BRIDGE_IMPEXP const char* BridgeInit();
@@ -607,4 +609,6 @@ BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection);
}
#endif
+#pragma pack(pop)
+
#endif // _BRIDGEMAIN_H_
diff --git a/x64_dbg_dbg/_plugins.h b/x64_dbg_dbg/_plugins.h
index 0afa18c7..37d0314a 100644
--- a/x64_dbg_dbg/_plugins.h
+++ b/x64_dbg_dbg/_plugins.h
@@ -11,8 +11,10 @@
#include "_plugin_types.h"
+#pragma pack(push, 1)
+
//defines
-#define PLUG_SDKVERSION 1
+#define PLUG_SDKVERSION 2
//structures
struct PLUG_INITSTRUCT
@@ -186,4 +188,6 @@ PLUG_IMPEXP bool _plugin_menuclear(int hMenu);
}
#endif
+#pragma pack(pop)
+
#endif // _PLUGINS_H
diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp
index 497bf29a..eb9f0dcc 100644
--- a/x64_dbg_dbg/plugin_loader.cpp
+++ b/x64_dbg_dbg/plugin_loader.cpp
@@ -59,6 +59,12 @@ void pluginload(const char* pluginDir)
FreeLibrary(pluginData.hPlugin);
continue;
}
+ else if(pluginData.initStruct.sdkVersion < PLUG_SDKVERSION) //the plugin SDK is not compatible
+ {
+ dprintf("[PLUGIN] %s is incompatible with this SDK version\n", pluginData.initStruct.pluginName);
+ FreeLibrary(pluginData.hPlugin);
+ continue;
+ }
else
dprintf("[PLUGIN] %s v%d Loaded!\n", pluginData.initStruct.pluginName, pluginData.initStruct.pluginVersion);
//add plugin menu
From 0bee4ed73a3ced592662a3f6257297733cccbd21 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Fri, 9 May 2014 02:04:55 +0200
Subject: [PATCH 027/676] PROJECT: updated debugging command (ctrl+f5 now runs
the main executable, easier for testing)
---
x64_dbg_bridge/x64_dbg_bridge.vcxproj.user | 10 ++++++++++
x64_dbg_dbg/x64_dbg_dbg.vcxproj.user | 10 ++++++++++
2 files changed, 20 insertions(+)
diff --git a/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user b/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user
index 695b5c78..b72054fc 100644
--- a/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user
+++ b/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user
@@ -1,3 +1,13 @@

+
+ $(OutDir)\x32_dbg.exe
+ WindowsLocalDebugger
+ $(OutDir)
+
+
+ $(OutDir)\x64_dbg.exe
+ WindowsLocalDebugger
+ $(OutDir)
+
\ No newline at end of file
diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user
index 695b5c78..b72054fc 100644
--- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user
+++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user
@@ -1,3 +1,13 @@

+
+ $(OutDir)\x32_dbg.exe
+ WindowsLocalDebugger
+ $(OutDir)
+
+
+ $(OutDir)\x64_dbg.exe
+ WindowsLocalDebugger
+ $(OutDir)
+
\ No newline at end of file
From 70a91a06fc9c0d8b36b1ce393a4e1952d6d74e00 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Fri, 9 May 2014 13:43:12 +0200
Subject: [PATCH 028/676] DBG: added section names to the memory map
DBG: fixed a bug with string escaping in cbOutputDebugString
DBG: bring to front when paused
---
x64_dbg_bridge/bridgemain.h | 2 +-
x64_dbg_dbg/_exports.cpp | 133 ++++++++++++++++--
x64_dbg_dbg/_plugins.cpp | 1 +
x64_dbg_dbg/debugger.cpp | 24 +++-
.../Project/Src/BasicView/MemoryMapView.cpp | 24 +---
5 files changed, 154 insertions(+), 30 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index e04cc5ac..d0163101 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -244,7 +244,7 @@ typedef void (*CBSYMBOLENUM)(SYMBOLINFO* symbol, void* user);
struct MEMPAGE
{
MEMORY_BASIC_INFORMATION mbi;
- char mod[MAX_MODULE_SIZE];
+ char info[MAX_MODULE_SIZE];
};
struct MEMMAP
diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp
index c5522288..1983ea7c 100644
--- a/x64_dbg_dbg/_exports.cpp
+++ b/x64_dbg_dbg/_exports.cpp
@@ -37,19 +37,27 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap)
MEMORY_BASIC_INFORMATION mbi;
DWORD numBytes;
uint MyAddress=0, newAddress=0;
- SymInitialize(fdProcessInfo->hProcess, 0, true);
+ uint curAllocationBase=0;
+
+ bool bListAllPages = false; //TODO: settings for this
+
std::vector pageVector;
do
{
numBytes=VirtualQueryEx(fdProcessInfo->hProcess, (LPCVOID)MyAddress, &mbi, sizeof(mbi));
if(mbi.State==MEM_COMMIT)
{
- MEMPAGE curPage;
- *curPage.mod=0;
- modnamefromaddr(MyAddress, curPage.mod, true);
- memcpy(&curPage.mbi, &mbi, sizeof(mbi));
- pageVector.push_back(curPage);
- memmap->count++;
+ if(bListAllPages || curAllocationBase!=(uint)mbi.AllocationBase) //only list allocation bases
+ {
+ curAllocationBase=(uint)mbi.AllocationBase;
+ MEMPAGE curPage;
+ *curPage.info=0;
+ modnamefromaddr(MyAddress, curPage.info, true);
+ memcpy(&curPage.mbi, &mbi, sizeof(mbi));
+ pageVector.push_back(curPage);
+ }
+ else
+ pageVector.at(pageVector.size()-1).mbi.RegionSize+=mbi.RegionSize;
}
newAddress=(uint)mbi.BaseAddress+mbi.RegionSize;
if(newAddress<=MyAddress)
@@ -59,8 +67,117 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap)
}
while(numBytes);
+ int pagecount;
+
+ //filter executable sections
+ if(bListAllPages)
+ {
+ pagecount=pageVector.size();
+ char curMod[MAX_MODULE_SIZE]="";
+ for(int i=pagecount-1,curIdx=0; i>-1; i--)
+ {
+ if(pageVector.at(i).info[0]) //there is a module
+ {
+ if(!scmp(curMod, pageVector.at(i).info)) //mod is not the current mod
+ {
+ strcpy(curMod, pageVector.at(i).info);
+ curIdx=i;
+ }
+ else //current mod
+ {
+ pageVector.at(curIdx).mbi.RegionSize+=pageVector.at(i).mbi.RegionSize;
+ pageVector.erase(pageVector.begin()+i);
+ curIdx--; //the index changes when you remove an entry
+ }
+ }
+ }
+ }
+
+ //process file sections
+ pagecount=pageVector.size();
+ char curMod[MAX_MODULE_SIZE]="";
+ for(int i=pagecount-1; i>-1; i--)
+ {
+ if(pageVector.at(i).info[0]) //there is a module
+ {
+ if(!scmp(curMod, pageVector.at(i).info)) //mod is not the current mod
+ {
+ strcpy(curMod, pageVector.at(i).info);
+ HMODULE hMod=(HMODULE)modbasefromname(curMod);
+ if(!hMod)
+ continue;
+ char curModPath[MAX_PATH]="";
+ if(!GetModuleFileNameExA(fdProcessInfo->hProcess, hMod, curModPath, MAX_PATH))
+ continue;
+ int SectionNumber=GetPE32Data(curModPath, 0, UE_SECTIONNUMBER);
+ MEMPAGE newPage;
+ pageVector.erase(pageVector.begin()+i); //remove the SizeOfImage page
+ for(int j=SectionNumber-1; j>-1; j--)
+ {
+ memset(&newPage, 0, sizeof(MEMPAGE));
+ VirtualQueryEx(fdProcessInfo->hProcess, (LPCVOID)((uint)hMod+GetPE32Data(curModPath, j, UE_SECTIONVIRTUALOFFSET)), &newPage.mbi, sizeof(MEMORY_BASIC_INFORMATION));
+ uint SectionSize=GetPE32Data(curModPath, j, UE_SECTIONVIRTUALSIZE);
+ if(SectionSize%PAGE_SIZE) //unaligned page size
+ SectionSize+=PAGE_SIZE-(SectionSize%PAGE_SIZE); //fix this
+ if(SectionSize)
+ newPage.mbi.RegionSize=SectionSize;
+ const char* SectionName=(const char*)GetPE32Data(curModPath, j, UE_SECTIONNAME);
+ if(!SectionName)
+ SectionName="";
+ int len=strlen(SectionName);
+ int escape_count=0;
+ for(int i=0; ihProcess, (LPCVOID)hMod, &newPage.mbi, sizeof(MEMORY_BASIC_INFORMATION));
+ strcpy(newPage.info, curMod);
+ pageVector.insert(pageVector.begin()+i, newPage);
+ }
+ }
+ }
+
//process vector
- int pagecount=memmap->count;
+ memmap->count=pagecount=pageVector.size();
memmap->page=(MEMPAGE*)BridgeAlloc(sizeof(MEMPAGE)*pagecount);
memset(memmap->page, 0, sizeof(MEMPAGE)*pagecount);
for(int i=0; inDebugStringLength+escape_count+1, "cbOutputDebugString:DebugTextEscaped");
- memset(DebugTextEscaped, 0, DebugString->nDebugStringLength+escape_count+1);
+ char* DebugTextEscaped=(char*)emalloc(len+escape_count+1, "cbOutputDebugString:DebugTextEscaped");
+ memset(DebugTextEscaped, 0, len+escape_count+1);
for(int i=0,j=0; i
Date: Fri, 9 May 2014 21:51:56 +0200
Subject: [PATCH 029/676] DBG: fixed a bug with the '=' sign (non-existent
variables were seen as invalid)
---
x64_dbg_dbg/command.cpp | 2 +-
x64_dbg_dbg/plugin_loader.cpp | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/x64_dbg_dbg/command.cpp b/x64_dbg_dbg/command.cpp
index 6af81812..6c4f43fe 100644
--- a/x64_dbg_dbg/command.cpp
+++ b/x64_dbg_dbg/command.cpp
@@ -242,7 +242,7 @@ static void specialformat(char* string)
}
else
{
- if(isvalidexpression(string) && isvalidexpression(found))
+ if(isvalidexpression(found))
sprintf(str, "mov %s,%s", string, found);
else
strcpy(str, backup);
diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp
index eb9f0dcc..d9974921 100644
--- a/x64_dbg_dbg/plugin_loader.cpp
+++ b/x64_dbg_dbg/plugin_loader.cpp
@@ -175,6 +175,7 @@ bool plugincmdregister(int pluginHandle, const char* command, CBPLUGINCOMMAND cb
if(!cmdnew(dbggetcommandlist(), command, (CBCOMMAND)cbCommand, debugonly))
return false;
pluginCommandList.push_back(plugCmd);
+ dprintf("[PLUGIN] command \"%s\" registered!\n", command);
return true;
}
@@ -190,6 +191,7 @@ bool plugincmdunregister(int pluginHandle, const char* command)
if(!cmddel(dbggetcommandlist(), command))
return false;
pluginCommandList.erase(pluginCommandList.begin()+i);
+ dprintf("[PLUGIN] command \"%s\" unregistered!\n", command);
return true;
}
}
From c6826ca65af4f74acde37f406c42c067a62a6aeb Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 10 May 2014 01:23:22 +0200
Subject: [PATCH 030/676] fixed issue #100 (ntdll redefinition problems)
---
x64_dbg_bridge/bridgemain.h | 90 +++++++++----------
x64_dbg_dbg/thread.cpp | 2 +-
.../Project/Src/BasicView/ThreadView.cpp | 88 +++++++++---------
3 files changed, 90 insertions(+), 90 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index d0163101..295e9e5f 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -175,55 +175,55 @@ enum STRING_TYPE
enum THREADPRIORITY
{
- PriorityIdle = -15,
- PriorityAboveNormal = 1,
- PriorityBelowNormal = -1,
- PriorityHighest = 2,
- PriorityLowest = -2,
- PriorityNormal = 0,
- PriorityTimeCritical = 15,
- PriorityUnknown = 0x7FFFFFFF
+ _PriorityIdle = -15,
+ _PriorityAboveNormal = 1,
+ _PriorityBelowNormal = -1,
+ _PriorityHighest = 2,
+ _PriorityLowest = -2,
+ _PriorityNormal = 0,
+ _PriorityTimeCritical = 15,
+ _PriorityUnknown = 0x7FFFFFFF
};
enum THREADWAITREASON
{
- Executive = 0,
- FreePage = 1,
- PageIn = 2,
- PoolAllocation = 3,
- DelayExecution = 4,
- Suspended = 5,
- UserRequest = 6,
- WrExecutive = 7,
- WrFreePage = 8,
- WrPageIn = 9,
- WrPoolAllocation = 10,
- WrDelayExecution = 11,
- WrSuspended = 12,
- WrUserRequest = 13,
- WrEventPair = 14,
- WrQueue = 15,
- WrLpcReceive = 16,
- WrLpcReply = 17,
- WrVirtualMemory = 18,
- WrPageOut = 19,
- WrRendezvous = 20,
- Spare2 = 21,
- Spare3 = 22,
- Spare4 = 23,
- Spare5 = 24,
- WrCalloutStack = 25,
- WrKernel = 26,
- WrResource = 27,
- WrPushLock = 28,
- WrMutex = 29,
- WrQuantumEnd = 30,
- WrDispatchInt = 31,
- WrPreempted = 32,
- WrYieldExecution = 33,
- WrFastMutex = 34,
- WrGuardedMutex = 35,
- WrRundown = 36,
+ _Executive = 0,
+ _FreePage = 1,
+ _PageIn = 2,
+ _PoolAllocation = 3,
+ _DelayExecution = 4,
+ _Suspended = 5,
+ _UserRequest = 6,
+ _WrExecutive = 7,
+ _WrFreePage = 8,
+ _WrPageIn = 9,
+ _WrPoolAllocation = 10,
+ _WrDelayExecution = 11,
+ _WrSuspended = 12,
+ _WrUserRequest = 13,
+ _WrEventPair = 14,
+ _WrQueue = 15,
+ _WrLpcReceive = 16,
+ _WrLpcReply = 17,
+ _WrVirtualMemory = 18,
+ _WrPageOut = 19,
+ _WrRendezvous = 20,
+ _Spare2 = 21,
+ _Spare3 = 22,
+ _Spare4 = 23,
+ _Spare5 = 24,
+ _WrCalloutStack = 25,
+ _WrKernel = 26,
+ _WrResource = 27,
+ _WrPushLock = 28,
+ _WrMutex = 29,
+ _WrQuantumEnd = 30,
+ _WrDispatchInt = 31,
+ _WrPreempted = 32,
+ _WrYieldExecution = 33,
+ _WrFastMutex = 34,
+ _WrGuardedMutex = 35,
+ _WrRundown = 36,
};
enum MEMORY_SIZE
diff --git a/x64_dbg_dbg/thread.cpp b/x64_dbg_dbg/thread.cpp
index c256821d..dbc6e2ba 100644
--- a/x64_dbg_dbg/thread.cpp
+++ b/x64_dbg_dbg/thread.cpp
@@ -40,7 +40,7 @@ void threadclear()
static THREADWAITREASON GetThreadWaitReason(DWORD dwThreadId)
{
- return Executive;
+ return _Executive;
}
static DWORD GetThreadLastError(uint tebAddress)
diff --git a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp
index 540607d8..5aa2b421 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp
@@ -41,25 +41,25 @@ void ThreadView::updateThreadList()
QString priorityString;
switch(threadList.list[i].Priority)
{
- case PriorityIdle:
+ case _PriorityIdle:
priorityString="Idle";
break;
- case PriorityAboveNormal:
+ case _PriorityAboveNormal:
priorityString="AboveNormal";
break;
- case PriorityBelowNormal:
+ case _PriorityBelowNormal:
priorityString="BelowNormal";
break;
- case PriorityHighest:
+ case _PriorityHighest:
priorityString="Highest";
break;
- case PriorityLowest:
+ case _PriorityLowest:
priorityString="Lowest";
break;
- case PriorityNormal:
+ case _PriorityNormal:
priorityString="Normal";
break;
- case PriorityTimeCritical:
+ case _PriorityTimeCritical:
priorityString="TimeCritical";
break;
default:
@@ -70,115 +70,115 @@ void ThreadView::updateThreadList()
QString waitReasonString;
switch(threadList.list[i].WaitReason)
{
- case Executive:
+ case _Executive:
waitReasonString="Executive";
break;
- case FreePage:
+ case _FreePage:
waitReasonString="FreePage";
break;
- case PageIn:
+ case _PageIn:
waitReasonString="PageIn";
break;
- case PoolAllocation:
+ case _PoolAllocation:
waitReasonString="PoolAllocation";
break;
- case DelayExecution:
+ case _DelayExecution:
waitReasonString="DelayExecution";
break;
- case Suspended:
+ case _Suspended:
waitReasonString="Suspended";
break;
- case UserRequest:
+ case _UserRequest:
waitReasonString="UserRequest";
break;
- case WrExecutive:
+ case _WrExecutive:
waitReasonString="WrExecutive";
break;
- case WrFreePage:
+ case _WrFreePage:
waitReasonString="WrFreePage";
break;
- case WrPageIn:
+ case _WrPageIn:
waitReasonString="WrPageIn";
break;
- case WrPoolAllocation:
+ case _WrPoolAllocation:
waitReasonString="WrPoolAllocation";
break;
- case WrDelayExecution:
+ case _WrDelayExecution:
waitReasonString="WrDelayExecution";
break;
- case WrSuspended:
+ case _WrSuspended:
waitReasonString="WrSuspended";
break;
- case WrUserRequest:
+ case _WrUserRequest:
waitReasonString="WrUserRequest";
break;
- case WrEventPair:
+ case _WrEventPair:
waitReasonString="WrEventPair";
break;
- case WrQueue:
+ case _WrQueue:
waitReasonString="WrQueue";
break;
- case WrLpcReceive:
+ case _WrLpcReceive:
waitReasonString="WrLpcReceive";
break;
- case WrLpcReply:
+ case _WrLpcReply:
waitReasonString="WrLpcReply";
break;
- case WrVirtualMemory:
+ case _WrVirtualMemory:
waitReasonString="WrVirtualMemory";
break;
- case WrPageOut:
+ case _WrPageOut:
waitReasonString="WrPageOut";
break;
- case WrRendezvous:
+ case _WrRendezvous:
waitReasonString="WrRendezvous";
break;
- case Spare2:
+ case _Spare2:
waitReasonString="Spare2";
break;
- case Spare3:
+ case _Spare3:
waitReasonString="Spare3";
break;
- case Spare4:
+ case _Spare4:
waitReasonString="Spare4";
break;
- case Spare5:
+ case _Spare5:
waitReasonString="Spare5";
break;
- case WrCalloutStack:
+ case _WrCalloutStack:
waitReasonString="WrCalloutStack";
break;
- case WrKernel:
+ case _WrKernel:
waitReasonString="WrKernel";
break;
- case WrResource:
+ case _WrResource:
waitReasonString="WrResource";
break;
- case WrPushLock:
+ case _WrPushLock:
waitReasonString="WrPushLock";
break;
- case WrMutex:
+ case _WrMutex:
waitReasonString="WrMutex";
break;
- case WrQuantumEnd:
+ case _WrQuantumEnd:
waitReasonString="WrQuantumEnd";
break;
- case WrDispatchInt:
+ case _WrDispatchInt:
waitReasonString="WrDispatchInt";
break;
- case WrPreempted:
+ case _WrPreempted:
waitReasonString="WrPreempted";
break;
- case WrYieldExecution:
+ case _WrYieldExecution:
waitReasonString="WrYieldExecution";
break;
- case WrFastMutex:
+ case _WrFastMutex:
waitReasonString="WrFastMutex";
break;
- case WrGuardedMutex:
+ case _WrGuardedMutex:
waitReasonString="WrGuardedMutex";
break;
- case WrRundown:
+ case _WrRundown:
waitReasonString="WrRundown";
break;
default:
From 7bf164d8a5cd4d6a903a750826ea17b3d00223f5 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 10 May 2014 03:47:03 +0200
Subject: [PATCH 031/676] BRIDGE: added GuiGetLineWindow
GUI: added GuiGetLineWindow
---
x64_dbg_bridge/bridgemain.cpp | 5 +++++
x64_dbg_bridge/bridgemain.h | 6 +++++-
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 25 ++++++++++++++++++++++
x64_dbg_gui/Project/Src/Bridge/Bridge.h | 2 ++
x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 12 +++++++++++
x64_dbg_gui/Project/Src/Gui/MainWindow.h | 1 +
6 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp
index cd0b18cd..643e19ae 100644
--- a/x64_dbg_bridge/bridgemain.cpp
+++ b/x64_dbg_bridge/bridgemain.cpp
@@ -824,6 +824,11 @@ BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection)
return (bool)(duint)_gui_sendmessage(GUI_SELECTION_SET, (void*)(duint)hWindow, (void*)selection);
}
+BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text)
+{
+ return (bool)(duint)_gui_sendmessage(GUI_GETLINE_WINDOW, (void*)title, text);
+}
+
//Main
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 295e9e5f..86c1c991 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -495,6 +495,8 @@ BRIDGE_IMPEXP void DbgMenuEntryClicked(int hEntry);
#define GUI_DUMP 1
#define GUI_STACK 2
+#define GUI_MAX_LINE_SIZE 65536
+
//Gui enums
enum GUIMSG
{
@@ -541,7 +543,8 @@ enum GUIMSG
GUI_MENU_ADD_SEPARATOR, // param1=int hMenu, param2=unused
GUI_MENU_CLEAR, // param1=int hMenu, param2=unused
GUI_SELECTION_GET, // param1=int hWindow, param2=SELECTIONDATA* selection
- GUI_SELECTION_SET // param1=int hWindow, param2=const SELECTIONDATA* selection
+ GUI_SELECTION_SET, // param1=int hWindow, param2=const SELECTIONDATA* selection
+ GUI_GETLINE_WINDOW // param1=const char* title, param2=char* text
};
//GUI structures
@@ -604,6 +607,7 @@ BRIDGE_IMPEXP void GuiMenuAddSeparator(int hMenu);
BRIDGE_IMPEXP void GuiMenuClear(int hMenu);
BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection);
BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection);
+BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text);
#ifdef __cplusplus
}
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
index 31342c7b..751e3daf 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
@@ -310,6 +310,17 @@ bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection)
return bridgeResult;
}
+bool Bridge::emitGetStrWindow(const QString title, QString* text)
+{
+ mBridgeMutex.lock();
+ hasBridgeResult=false;
+ emit getStrWindow(title, text);
+ while(!hasBridgeResult) //wait for thread completion
+ Sleep(100);
+ mBridgeMutex.unlock();
+ return bridgeResult;
+}
+
/************************************************************************************
Static Functions
************************************************************************************/
@@ -615,6 +626,20 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
}
break;
+ case GUI_GETLINE_WINDOW:
+ {
+ QString text = "";
+ if(Bridge::getBridge()->emitGetStrWindow(QString(reinterpret_cast(param1)), &text))
+ {
+ if(text.length()>=GUI_MAX_LINE_SIZE)
+ text.chop(text.length()-GUI_MAX_LINE_SIZE);
+ strcpy((char*)param2, text.toUtf8().constData());
+ return (void*)(uint_t)true;
+ }
+ return (void*)(uint_t)false; //cancel/escape
+ }
+ break;
+
default:
{
}
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
index 9e317d9a..4df8b0bd 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
@@ -69,6 +69,7 @@ public:
void emitMenuClearMenu(int hMenu);
bool emitSelectionGet(int hWindow, SELECTIONDATA* selection);
bool emitSelectionSet(int hWindow, const SELECTIONDATA* selection);
+ bool emitGetStrWindow(const QString title, QString* text);
//Public variables
void* winId;
@@ -120,6 +121,7 @@ signals:
void selectionDumpSet(const SELECTIONDATA* selection);
void selectionStackGet(SELECTIONDATA* selection);
void selectionStackSet(const SELECTIONDATA* selection);
+ void getStrWindow(const QString title, QString* text);
private:
QMutex mBridgeMutex;
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
index efc7662d..fcd102ff 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
@@ -137,6 +137,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(Bridge::getBridge(), SIGNAL(menuAddSeparator(int)), this, SLOT(addSeparator(int)));
connect(Bridge::getBridge(), SIGNAL(menuClearMenu(int)), this, SLOT(clearMenu(int)));
connect(mCpuWidget->mDisas, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidget()));
+ connect(Bridge::getBridge(), SIGNAL(getStrWindow(QString,QString*)), this, SLOT(getStrWindow(QString,QString*)));
//Set default setttings (when not set)
SettingsDialog defaultSettings;
@@ -679,3 +680,14 @@ void MainWindow::runSelection()
if(DbgCmdExecDirect(command.toUtf8().constData()))
DbgCmdExecDirect("run");
}
+
+void MainWindow::getStrWindow(const QString title, QString *text)
+{
+ LineEditDialog mLineEdit(this);
+ mLineEdit.setWindowTitle(title);
+ bool bResult = true;
+ if(mLineEdit.exec()!=QDialog::Accepted)
+ bResult = false;
+ *text=mLineEdit.editText;
+ Bridge::getBridge()->BridgeSetResult(bResult);
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h
index 48b3ef27..d2deb04a 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h
@@ -68,6 +68,7 @@ public slots:
void clearMenu(int hMenu);
void menuEntrySlot();
void runSelection();
+ void getStrWindow(const QString title, QString* text);
private:
Ui::MainWindow *ui;
From faf53de72abbc90d32a8232cc81b5b798b9ce84b Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 10 May 2014 15:10:02 +0200
Subject: [PATCH 032/676] DBG: downgraded plugin SDK version again (1 byte
alignment not needed), now FORCE default alignment
---
x64_dbg_bridge/bridgemain.h | 7 ++++++-
x64_dbg_dbg/_plugins.h | 9 +++++++--
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 86c1c991..3aab7c91 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -3,7 +3,12 @@
#include
-#pragma pack(push, 1)
+//default structure alignments forced
+#ifdef _WIN64
+#pragma pack(push, 16)
+#else //x86
+#pragma pack(push, 8)
+#endif //_WIN64
#ifdef _WIN64
typedef unsigned long long duint;
diff --git a/x64_dbg_dbg/_plugins.h b/x64_dbg_dbg/_plugins.h
index 37d0314a..ecb25136 100644
--- a/x64_dbg_dbg/_plugins.h
+++ b/x64_dbg_dbg/_plugins.h
@@ -11,10 +11,15 @@
#include "_plugin_types.h"
-#pragma pack(push, 1)
+//default structure alignments forced
+#ifdef _WIN64
+#pragma pack(push, 16)
+#else //x86
+#pragma pack(push, 8)
+#endif //_WIN64
//defines
-#define PLUG_SDKVERSION 2
+#define PLUG_SDKVERSION 1
//structures
struct PLUG_INITSTRUCT
From 43744a6ef95608a03f50eb2507164ea49750c5cd Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Tue, 13 May 2014 21:35:17 +0200
Subject: [PATCH 033/676] DBG: updated TitanEngine
---
x64_dbg_dbg/TitanEngine/TitanEngine_x64.a | Bin 325702 -> 325702 bytes
x64_dbg_dbg/TitanEngine/TitanEngine_x64.lib | Bin 99680 -> 99680 bytes
x64_dbg_dbg/TitanEngine/TitanEngine_x86.a | Bin 324844 -> 324844 bytes
x64_dbg_dbg/TitanEngine/TitanEngine_x86.lib | Bin 103416 -> 103416 bytes
4 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/x64_dbg_dbg/TitanEngine/TitanEngine_x64.a b/x64_dbg_dbg/TitanEngine/TitanEngine_x64.a
index cff1fce52128ecb87eec0ba241d2e7c0938ced34..87249cc8d157cf2326e1496f646ded9812912d0a 100644
GIT binary patch
delta 16147
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
delta 16147
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
diff --git a/x64_dbg_dbg/TitanEngine/TitanEngine_x64.lib b/x64_dbg_dbg/TitanEngine/TitanEngine_x64.lib
index 6e6fe41332da40ea020bbdfd012a151c0097558e..c9fdf36fe24c7c075c19b5052a70e01eeeed9e7a 100644
GIT binary patch
delta 10577
zcmaJ{dsLNG7Wd=>Q30+N*^-v?f)zGru
z9%g9P$YwX+p|^)4?R1lymQaIyu&l2~;r5y|WL*EAo6+YTq8Z^8@1U?{_%0D2jx
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
Uz>u2#2XEABM#VS|-Y63O2gLga^8f$<
delta 10577
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
V1{hK^|KN>U$*35|fg45K{{XvS&KCdx
diff --git a/x64_dbg_dbg/TitanEngine/TitanEngine_x86.a b/x64_dbg_dbg/TitanEngine/TitanEngine_x86.a
index d20ee4587ce1baf3c557dd252e37b215eeb5b5e7..f1038babe54c50407b3cc5fa216aea84c11e75e2 100644
GIT binary patch
delta 15715
zcmaJ|e{faR5uW?QRuNIap$Vc!suo4*z4yJmyr`uh9SW!j{=jIF62$Twr
zXTN(MhYof>bg+9({%J{1{wq!
z6vb^s=ISV=~OUWbQS_QwM0D_ap-e(9YCMlzw*4Ggb2t?8s)}0%n6?x0gvjBkBru
zJ|2KAd+-ix-C||}P)8=2#wE-Kp&mOdL~-oWOH3?;`pDygMcIrK#Q<~EilX}8_Ao2c
zdEFFa31HXN43SM+|A{m_{_6F{5Fl5r)GBl|#Rx-N-gguHRObElOldUKeG
z29Vdbm-WarwrtHJnkdc%xWwW3+j?#j#fbWdjVp``1Y90o`l#G|olYeUfK%(Ix9Z9z
z(tvlS<~?2fL>fR=*fnf3*rfsB*BZl4yzj$XO)h}1sP7dT4cR%=7$Lx|=Y}29dDorB
z2msF3{qGu{G$5>a=+(WNhZ1Rkn9{D<$I?ceDWh?pn~aJO=k|Y@S``7rl+3y>OfE%$
zGqru?CQEkn?n9IG@rwX#1?0xB43I^DHXZHpW9Dc@0Ct3<81Q^JX`{cn*@Ohd)g5x#
z3C$vjB80s1x{$EjzE2oW0J-us`$y&pFwbl|xm4FS1!&XtDZa2ReSaoW0J+wffghB
zTV|q@06GON7|4SH>J)VEARZJzCpr>~1~aIVfI3|xV)RhU+#^YZy>*zSclbmS0hbi>
zlz}n_)Zw-xsz$P|P5|JFKQ6n8@kas?4_7&{cN81g1RyRV&J)$QT88uz0Ja*ot48y*
z0Bz;#z!>fe;f~gMv9Of;Lb%)SU>uP^pegT@Wjq$ZP4!|5O^B)>WA2{
z2M9csXVgqqo&e#muVTC!0PrGO?Zv7`Exp?(0z_WX&tohj)RAHH)#{l+4N053Xqn4^
z@&WUvYQ|wcpiOkrXFj8oTmrIJIGy_!Sba5#`-n63)7(1N13utPt=WGuYfT?urbaoj
zgf)r}Sd*t!OSvb2x@j5XC6te%aXG`-!@idHs62Vg3+&`59;1t}>J;}{ON@KT>Z&pF
z5blVZj;v+}^N>#{X#FcZD8e1dY%zEpBW4fa76Z0~2k88ob(cvC@D|aoEDj0FEXyb-
z)m5-%1CI!Zt81m^O>?aTITR&je^aaR6`-V~?(F%F>CT`SI=oIEF;7%)wAN;aB`5~q
z^_DJ-5dtqgZ8CpH$P3=LUN?USu%q2w+_c@&%X@$lk~3GIj|_7KIh16m-^GcYro)3`
z#Ct@WrI+p?hm?$#-16OKs|-*}hWxEnS%6|v?~B7M@zFl({A@1;C@HgBp&W+EpPOL_
z(g-(E?)Uo*lKX5B(bJ6;u)av4@pR7OV66MsGZ|F8g
zc}Z=&-?dE}7a`!ZXm9wrtrzV8r6mpUj83-JML`h|xu6PPb%w34m!Jp{mmetK(OILo
zq^w)Iv8+*B3h!*&935q)kP|NPE6cNQ(fFaRj7B*6ekIc9*!lxjfC@7t!%-3!fl`P!l;H=xghpKR}JiP-y7K
zP(Zb*HkE0bU0_CmXvLns1W#tF;Pjet*_+(^=D+c=nDH5
zT`H8HN(+?tx3%yN3ZV+BmwOCky_`dT(iY!5$kys3$fZ9cQB*#dMMM><^6D{^Tj3%j
zx9TVK=}>{vGF3L**56Zt9NLrUY^1Hfmjp>bUETj}H!@;KLgTaMSu%<>PYwY}En9Xg
zYgrVakw5w*Ci;!GwSo>%i?Yxs$MDb{&B5kUHV3FmnZN3B%pWRKK}RVW&yIr9luA)h
z&PtI(nbM{4NrkOHr3DG71zlxxr?7%0pcLw6`Q1I-RY!b({61Dzl&5sTZn)pp-|m70
z@;yn)sncyODFc+Je9(J5EC)S&Vw4Yv0ccb)uT*~A7mYI|V%jJ^0b+ZNEse@&NeeZ)y8OlGd}5yx8$bV7LA7RavCKH|MDj<(3%U)0yhR?ixNBvqcu
z7Bf$vOO>a7&u~w1pvAmr?bSMEkfpUn^u)SOVVGqh0`5;Oa
zkIdL%^7cWKsu@UsY?{djO-e>hZQLeKA+-Z%<%x%P*&DM!`tY=w#afO*^Bz-NAKo_=
zP}S`QD8Cpx{8RgR6AZv691Hdv9DR_aGU@#AiT8EmCk{0g_U$iCVSNy#)Qry_HqGdR
zCM7@j9OZt1MyyXmQXl@cyl+(PeNd#Ttew7PWd$)RN>A8}^`St83hJM!Kd}A*5h}L-
zXsanA7p2y^stN*baIC3IG{R}qvM^q
zBY>Aq-F&8FrUsrh6};2CIr{eXL2`=i-5moBNKQd@JoXF6)Da}78uW&qjvjO$6leB|
zI@i&coezprP$l{muu6d7R7UN+nGvW?)fe+GVhDliq)r~u$I(>hgYu+_xU8?E>DdR}
zNx_=>@mO(sR@G?nST*2Hvv%a3d{KFgBY9<7!nsR#2`EqMq>>ctBzV>obk+4LcJx)}
zgYZ;k*?%P~3+PVesi8mf1hSLBoHmew34&7`z1qph1%i}$ru
zK!bUWpA>B~GP0G+}eSi{1hY$OO4H8KcLHp=p?*Fy~Nm}2d#j@G#T{}qhuS(m_D
zrlQ(8Z?GALr%WLeUSM*Gw>F9Lrnele$$fajB<;WQ9YOR*~KUw
z)S+tQZo64u!OvgAGRZc6doSxNl!qinC-39oa)B&8_4(XPy9e@+eH?1v@92+19!f+~
zQdI}JH{cH1LDPrKG<)!DsXF9~!=}0(s6++m%A@9l@|XLuABw9BeeBofLibQ1F8jur
zlkGJRo-S2Se`ngr1A(ZL8S(>9rUSU`pBO-(5ry?)DA_kyZr3bHc_0#_|9~L6oEm1yqVeo_kMsHFh0p@&j{L}<2}l6O
zUha-Ji38-ssaJchR-+zjNcyOFGH|uf^iV_6LjG={tL3_vLqkSirst+zy=!}*A=w(_
zUFqsQ&jTT;6sg_c)tcQyB}tvvI)HT^JYKSplLzsTz%8_S4H)cdMd5*zRC?;Hp$sq3
zk}PD~H9Taz;T18yG@O+P^(2+3Y$OW_dNSGwqhD`}emA+3bXS0=q?Ye-3v2nD%5t5i
z4tTs&7_^M$3B`9oiZlC08U)#*n(
z%}?I}*vFsYX~n^=RcTEz$Lj#-8>=7T*u)V_wr{
zSASXeP+`(T^YpE(=RjdnM(2INGlCAM<)L*OTOL4Xs_TCChwQpXp}FrPw?TI|N=#Dv
zopv!F9SP0N|70BkLQ`C@$JHv`1C2?i?z4}b8YL!C-Am+QFE47TLWhD_1f&=(A`y(30fIsi5s{%5
zZKUBxDKLnLD99+r@WUL$n2AV{0j1&(CMZ&{P6VV{QblwWd+*(wJv-<7Uip`uJ$t`r
zch7##c{zTx^YNpd7j*kss;o4fDfYdR4TWPX@~f-HPc5qcMM3he2EpgiEWBan}rpTOcvtYXR<7Z48>(j{3
zkcV#2eo9T76OGZgcbMgCo3v^3#=VhE!|W;A#?*OfXwz-e?Q>q^t?*5mqYcehS6}Z8
zwl*!8TcLfKTDSYU(b_cO&-ZCN(EIQQZWvejyusQghu%Hs3!Ol3+W!L!^}czaH`y#%
zENnn;%C(_Ob*_1!cWkq9xiA5_$xZzVVPndz_AZFFcFfaP@~3;I-s+ieqHS|mU!iSG
zsTFPi+UNB4dmuBV(eUSW8hIcy$TUWuQ3i%G|BIE2%P2oDwqq
zy6|HvPHnBeX?J^}q{?y#esUWNo+<;uss1ZSUxKG9WX3dfmJF(=#BmzcEVMsqf#W;{ll$u8eF3?i-|SOqr>Xd^Oe$
z8%f9gW3{2FwW7U0_Oagkj48J4N}CUIS4w3-af*JyVG+HlxQuMvXF9S{ke#-#-{*S!
zN=?~CWE+p^z)DT&sT3x^Wrd}1;P^zAqZITfZMT1=wJinx=_?;^(_dL?>aPxOaK>4i
z?)YYeUJInB#?t2$H0-6P@VkD{ZaTaRaeiv73TRXf%QxFlLo=#
zGgTe4Ek0CJX;X1ZbhY9POJ{o8l$$C>m7itll1Zb~(MX~4&Xz`?bsV>P`y3fKiX9Cw
z>e2Ho-FVWVcAQSCxU;46DGhSRWvtpRkY5LSQ%rUFGA0l_-V{}Np`~}F1Qnkj?ykz~
zY4zr9DFMa9nIJUUQea)IjZDR(Lg=RYToER?8h(j&k+w8tk1V^Ym6uv~aCa>+RcCMa
zXd4inr0UdLNL2!&lhLlLr4fi8*PNQ`S-R*-K=im#s~c06?$jk9dfZ`EUfR+vwiraG
zL}ZKFP8(wNvCB4
zgighvI7u*Skdy!vj}K~9c#|lYVo*G8J?gz7mhL^ppg5)Z>|r9!Q=m9CmOdjyV@ZMH
z6w|?xBBm55PBGQqCSpo~;uO<$qhw5=IC(lUT6zM-$w$p$_YZuz*Jn!h$_F@(nDeZvXi?l_epmkJMB%?RIxV!$R5wG
zs`~?$9$vGsW?V8&4~mirKz6G2+L@x(1CX8eX5=GcZvv3LB5ttu9MNC{kUfR~weC@i
zDIgVq>`DK5OvHr5NipTsh?o#LNvEcHLMI;;kH&3v*L+dNJ}Mr8vg)-+v=$!{og`>o
zEF=K#RFnntmWnL!L2*jYzRN{=`k*+a%BdA1ReVsKJgs|LdIH7C(_O2DCuGh<@ijtm
z4|6=uf~Mz%1VEj1F3vu~y~$GJUa-#Rj_!f%6xe^(%fNETzUpPUCL}sF>j4|ZE_O>97%#^3-|FYfM*gkXwWv28z$181PDlhd~y<6)Q0E;dS2l;Mlc5?{G
zYR(?()^=rsGII}9Jo2j%do7;%17uPf2YP*=ds~1|N~wQppHBS%sgx$njr;Y486cLD
zQPlxygsC6hlc~ag>cS2XOliXW;IN)B10d5#)_86V>toVqx;}!8xdC)xqP}m{H5p_e
z^{FkbJ*w*?$bjs0YTk5QpPB*CX+k95f2q&k0LhfZYB(Xqf`q3oIO%I47Gf!RD)?4-
z0xnJZY0G!glbP^|QOyt1$jo?URYV8Dbw63Z=k&}$q$a+q&wr5NdQUrZN}Wd^r-NA=^nYyQfer4cSh+xTC<gEVMQ!%D%GHp5boHnmSW_mSQA0yJV)IQ*
zfQXv3v|%>i4h6+I^1S61k>|yx;B=d)R*V$sf{04lS$Uht&SFrU4%4DhHnVkrh)UUc
zdbC_FN1pGj5P6P>N}g)R2~UWq6nObPB5*`hQoNu_D2|9qC(TC_Y`$s>QlL0(%e-o_
zEh$i(JpKB9=_yB7KRH$G9U>}m?A8ZtzS#>>W@nLLIcP8%QYm+NSd=nwYI5&U
z|A-I^5tS0XYK}<^8nyF9
z(?CKEKW?7(Vd||YSXuN!2YEo{&w+Q_)k>lPR?dPrUUUGEk{J
zU$?9l=PRNq)p*SsQR9fF6!-1xWZaP8biNk8D9%?vQyJK)mtpr7D06Ggb
zvK8A!ZRUVe8sJ90B?h=GPo(i68|)HWgj`B3@2q!3%kw~Z8b6!=p~p`jxs;-x^`4I2
zM=qt@%6zDE%Lgu{5^QLZHs;(ybL_+W?d|P)`tUl+nuoO6_=(NUAPvvR<@|++qLfe5eh~SDC>k2A)jmLOI)>XUhYxfgAv8?4
zdhNqhIvL0(oEhHqBtOLQ5kCnxf({M?nveKNZTw_M=?V0u&u%=|VT$v!yobi`AT#nD
zo*#Y0&%K=;tqp=FZDdh+pWY5rx{u5muh~!}mo&R~lJrfU*c3oc
zii@rdr>7jgHuRA@DW%HOBBk(Ul#aw6We&5jpNl(NuNC`)+)1A5`U+3LovbPk8a`s@
ziGB_rz&-*et<&o_avigAC-YU?AQ5p^;EZozb@2jfMnh3JFfPAYh={C7A&nj`Lo!SZf|qflsTwbG8u2px1>HWqkl91T_>(uu;qk}M1(&BMOJ#BlfqSNi&BFIj
zY7xt(iF!r2BmqV~Ck2XSPprUBv@82B*?;>8=Ng%
z(D(|vVY9<P>Ns}6H&1<5Tku<}I7wcfm^j0y>H@xBSeYOvXnOt(NebeDf
zP9I-CsT~a5A=&}bWtfVqI2fc$^3k|k_yD?0qM5!&M1x>Sr$qO?qJ#h}lY6~m?+g6^
zD%G$L#cttmZHdUr_lph>Jegc?=N%BKg(yj>we6rtEksFLZqi}79Aq*Te6P=R!Fzy`
z@@nZ&tHXC*9`Yo)n|)NegSne3I&)lCvFZKRjU0Hm<)dcQPZAn9=>eSFC^A}rxVEom`tJ>_=Ailhv4>4LLmUjXaef0=qY}y<(}W(
zu)VA_*;REsD|)ma;JRmPOH+0B$v=DZ04B*M^v2Hx9wL!ry>Ummh1ea5~^#b*F((vo*x?(!_|WdY9ks;TBG
zxtiI|$x--ogYah+W3G1Z(XqoGP_OOhxy-K~QYWG5>A+<)^^iJg#@kU6{w%v)sw~tQ
z{oR6^mvMO__mDcph~!=C@*wCTb<&A$_jMWbJ)};`#pdfpF2YNv92Y0`mutefNN39R
z16(E#53!RJJ8zIs46swK*)mwJ2}MA=^uiFaOURzd1;Q|~CbDPrcRDKmvA8N4;ZEeO
z0s@u!-{n@3|5;&_dCtRkPl~H)l#I*7e!1G*JLPJie|R0<#O)j~lpWP+8%TQE!u;`K
z3jssP5#2EysS-T}Sd^Cxt8M2*5jz4YExdNJSQvnm+)?pPn<9!g3!BEjo-Uu}@{6*E
z51@2LwoMl$hlEP4c*#Se6(gb2n@_)4E>DRbK7i73dStfCQ)2jMdFEe~QA{;|lrcfl
zQ%ps3WlU!0r@>Wy^tgx#8I@w1{e*}K8I_C*Yo(ES(nibGa$*6PD*CRfzl!fdG7XKA
zzj0EXmbiN4!uL-KscxAJ$?Wxs0z;pa3gi&{pterPkON9p;fpR)sh5jN-+M`93sNb~u(Rr2zKHdZN~zhVH;HD8R7w+g
z+bb^L9eeoxNz?H9EiPZ2dq}0!9!I|>+9SS#(u4EmO`_6~N-3u1W)TxoDdp6RH^tr{
zo6>SUcF5)6>Wgj#8+N*UTkj#9Qbo+zEfNpmlw#_+N5%wsPV+_cyJEgTMx}vZ?)zdO
zKt>Hc>C*w}lzep9FMQ-;)SVxTBtb^~`6n(TzK3*5pWW-Q_-v$8>VmueCGr~Slsrvq
ym7dIlQx;tQQBiORsFOX;!w7O`!zZk0(!u}|WG5+{CBsND{#I482BM~_xzjVX7@k``H!~GlZ
zY%-{n5%(ur=d?DE%J~@M@Ko~RGJZm>I=ShsjB`u4QX1v-$_)D5nRJ)$40<
zi8ie&P?vrngVHX#81pY;@Kiy%B6^X!hVD*Fex!PWLXGpi-|0qATgTTSsBWbYSOD~vcu5pqOfn;X4KU-bBr(feDOW5q<&zc5
z=tsMo`>vp?3dsU^ic117Q*rHo*UwD7;>*o|=B`GJVjCpbrdVv9&CBn4n)|OJ{zOFD
zojX;r-Y)8Hrv8lQDy%7O5^K{GOU)cFvu%zSTu(84&D`SwHdku;8ZILT3;yXAe-HEV
zFX&{ehR~H6f-BVA{mUS&NV%ZW<@^=Xg_C&Wuh<<30N&RS0LWN$%?;xv#yI%83lurm
zhv=h4TXL8?uDd$Mf$Kw&u6bi`xaY09LA-jV+`7SLiZ$-?ZxT3k+dg*_@rP|O>lV_e
z-|ZtJ&d<32l0tz%)pQ;Zv7awHNBy6I%n404e3*J#hWtj>X^YDlO%EjFHuY1@mw%gN
z^`t#}n+(xYAiIrHfD`m!8_Sgymf?3$nB1+ogE7F46@Hhu2i3(DQZ_QW71s@c2FZ)i
zs8%9FlP@Z`BH97}%4JK0<=Tc@2DxTcG~^ownx``a=L}MBO)kj#oq-N(96}u@TAddX
zIvU&&1w`1<(LlUo7$CM29VE+EPA=&)Z0y8zSRsc%4>AF_7Fg|JV9>Ec!VM1tTO`&J
zEbYvAb=Kf4qiPJnEKiCSsXgdPYB36_UheFw@uIU#D+LhgOavVjfZrEWph&g_Z5;=(CTM6pwiEv4M`W)ML+UEcQnZDNkl?$Lr+2q)y4$>`_#q<
z{^TMBG9iEk(wfaGrP~7xTyS)+f%rhCL*I5_dmu-*Yahf}wh3wjjZm{SGodN-YhT+He1!@>YPC7vie-$dZzigGE
z8k`&sAz=)7a(9vbtJD>S8B;XyNafWqQi<(qQ8;TX)*OUJM#S9~vU;)j=*D!o7ngV4
z$00R>!Bt+f6&Pe4)(8Pn3(OB@PX(VzN3tbdBS7^$xoZAH7~(e|5-#`URVO;O
z;*e0#b#N7y*j7A%p3dOq&pwf=Rx8XQ52X_!#8PpGQv|A16wa~mhvp?(xFbYOJ<
zb`Hp!o{EQD`~L|?`w6i09@q^|_h(??W8#3UhT@oTm@|NJ$TqxbfK?5(1E>uXnuo{S
zFYliSS6W_oLcc2E3V*-SxrmD;tL?e}REU-i3^u>K?mh_4fh-6zVbWh!vK0fVWHANm
zmmYEK7i~gC9GM`;riz&yn@6BWycn(1eZIy|hRxO~+TV#6V3a69ZNmr4gS)w*W`5f_;=JN(eqK(gG#?nMGL-iJA
zTuUMqvT7)*8U_e`r-b{1%0kTlT*d)U$ZHzPk!QV3!kl58${+X|g|fUdC;YV!i>1D)
z!_*`i_j>2vlf)KF{R#xJ$p&3ptP24^GKtd;;gLdA{cHxyQb?Xyn>ee6=hWc@Pke@g
z1H(xHYK6Vnt$GA#b!11~*32RzagAYm8k=f#mQQ8?05CAntyK`Y}d0EKa44ZwK%%lEEp@
zvp=lpq8Xh=+6kDu(^#N%OcK)FxW6TxxsRA~j%DfBx2UqQ1S-73++sw!E-iYH7E_JM
z(+|24&m6~y;++AujI;XTo^b}f9>`yOGOS;sG7NkwB5ajsFc@iY-^w6A2(b&t6ICWx
zRjo{JM?(z!bzyL8JhcFp-3gRkD(1tSiZ{cIi4*|UQPml8?fK+Ys)iYx@BNG>(rLQ!2x2>3+X8#pexagzxe*iW}jW{u4DEY=NbCW~G=
zC6hx@EDN}I`be9OeHadhGsz}py4)5No7_6OyV!celquw)2Em`FP`=gVRFxnXLtm(x
zYJ`~Iwot>wx?ek$;B1d(PZ5O8BO@SY8l6QGtaKVVi!oM3d3PF{sk%QDPiF-ph$_@_
zFAEZNJ!UY+MOi6^Xu;r64F0fk1_cir)ae;atuDstS&XQ!eh0ExG3xJeFnlIq
zNyl;fOo}7cqH`7_+Dc~aEO#YyZ5AsT9fZ7xm|@(}qJ_4$x5D9(hutNv=3!gnTr)T>n-S$jRlNPGWNyzk?s=VuxJTISm0xRX
z*$?*REk@XsH{Jo+58v;Kv11Nv0k&!!XvvO$ln_9zWAmd-PJTpDu$RxrgW$cnMilf(
zATj-}t$f=wmwY3A;g69%4GDORvQJM0o;d^_{*VhRa;U#*6=!ou1)?fz9uY}z-8`mO
zWL%ZMeA-Bs<)61F(9FJr?>Z#5E!Qrle00udK+!m?nop3@_IcznQ{=T$6`<@MqeS>i
z`vl8xpti-ELe`Q;A!DQ9aW)F{plf)X9b>x@rio)ps+{oj6NFlP{M`2h>CzU*Eg)4G
z(P~DdLE`fy8F){*WQc>CtHR-LPtw8UMaQS;WQuj+Q!LgZtSUvaolR83CBPq+da{0I
zy=_DGLN{IEz(UG~e8<3aXG&eQ5rJmL8A>;{t{qQv6Rh1XVi8NXj`@Z~6e!vwJQg!~
z&ANQCJJt(~RmDJ+SRdi;OsHRC1i-Q-+*#M>aX7q$`{nw^4XMw#JD}znvW0>ina`;5
zDMCd?UIDUYWC}kHf$~vwFs*1l&(ch@y$sC(W2xb=4?^o-8sIlBWVKY>CFd$Zs9b8q
z>dO$mAGR)~nA@9PjzE?%!vU)br~^^eG!_sj6;xHl$(vQKk_&+s3z-~F?D|6HogQzK
zeosc=3&1{3ltU|GnYHH)TSh}mwl3NLH@E)wihS@3@*zFF7jnWp+#;G`4TP7=>f2F
zIaN5O&+|nVIXz!r;Y4AV(k1OGkh%)S2HCza>b|;Y1@lI`*vN^x&az&jU{Fccy~I4w
ztcgX$s(Y6*N8YVpkml6XIpJUtD+GMSjd+>HI+aKD%M?B_5M9m<71~xvZCC4}q2J1O
zd#_xgUS3Rg@$=B4-spLcFc*U1hxwjuf(Gq7EuxAb74OQEDN%tJ#@&K{~mbU_`u`uM@BB
zW>zkaxC3FZH<*sVH%OJ*^fl}=n4V<^*HGcpxJ-P5#wC{6dv7ooc{QzhLf&$c6C=-(Hr<{t_$cQw%$R?O`Y(}?{axLF-C
delta 10750
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
From c4109393eb980d785082b392ea01bb4bcfac11a0 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Tue, 13 May 2014 22:38:08 +0200
Subject: [PATCH 034/676] PROJECT: updated readme
---
readme.txt | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/readme.txt b/readme.txt
index a02ba8d7..cae3be4f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,13 +1,8 @@
[This is a new version of this repository. The old version can be found ]
[here: https://bitbucket.org/mrexodia/x64_dbg_old ]
->Installation guide:
-1) Download the latest 'qt_base_XXX.rar'
-2) Download the latest 'bin_base_XXX.rar'
-3) Download the latest 'release_xxx.rar'
-4) (Optional) Download the latest 'help_XXX.rar'
-5) Extract all in the same directory
-6) Run 'bin\x64\x64_dbg.exe' or 'bin\x32\x32_dbg.exe'
+>Downloads:
+These can be found at https://sf.net/projects/x64dbg/
>Overview:
This is a x64/x32 debugger that is currently in active development.
From 6ebea665dc51741824bc29af42273db1d55c2ed8 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 15 May 2014 01:01:50 +0200
Subject: [PATCH 035/676] PROJECT: updated help (thanks Artic for the idea!)
---
help/Plugins.htm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/help/Plugins.htm b/help/Plugins.htm
index 652777a9..0f15062b 100644
--- a/help/Plugins.htm
+++ b/help/Plugins.htm
@@ -16,5 +16,7 @@ html,body {
Plugins
This section describes
-various plugin functions for x64_dbg.
-
\ No newline at end of file
+various plugin functions for x64_dbg.
+You can install plugins by copying the *.dp32 (x32
+plugins) or *.dp64 (x64
+plugins) to the 'plugins' directory.
From 72b16cf089654b56532c6a29ed4cf100c3d0c6e6 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 15 May 2014 01:18:43 +0200
Subject: [PATCH 036/676] PROJECT: added VERSIONINFO, resolved issue #106
---
x64_dbg_bridge/bridgemain.h | 2 +-
x64_dbg_exe/resource.rc | 43 +++++++++++++++++++++++++++++++++++--
2 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 3aab7c91..83a0dd0b 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -33,7 +33,7 @@ extern "C"
//Bridge defines
#define MAX_SETTING_SIZE 65536
-#define DBG_VERSION 16
+#define DBG_VERSION 17
//Bridge functions
BRIDGE_IMPEXP const char* BridgeInit();
diff --git a/x64_dbg_exe/resource.rc b/x64_dbg_exe/resource.rc
index 1ee25103..229e75ba 100644
--- a/x64_dbg_exe/resource.rc
+++ b/x64_dbg_exe/resource.rc
@@ -1,5 +1,5 @@
-// Generated by ResEdit 1.5.11
-// Copyright (C) 2006-2012
+// Generated by ResEdit 1.6.2
+// Copyright (C) 2006-2014
// http://www.resedit.net
#include
@@ -18,6 +18,45 @@ IDI_ICON1 ICON "..\\bug.ico"
+//
+// Version Information resources
+//
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+1 VERSIONINFO
+ FILEVERSION 0,0,1,7
+ PRODUCTVERSION 0,0,1,7
+ FILEOS VOS_UNKNOWN
+ FILETYPE VFT_UNKNOWN
+ FILESUBTYPE VFT2_UNKNOWN
+ FILEFLAGSMASK 0x00000000
+ FILEFLAGS 0x00000000
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "0400047B"
+ {
+ VALUE "Comments", ""
+ VALUE "CompanyName", ""
+ VALUE "FileDescription", "x64_dbg"
+ VALUE "FileVersion", ""
+ VALUE "InternalName", ""
+ VALUE "LegalCopyright", "x64_dbg.com"
+ VALUE "LegalTrademarks", ""
+ VALUE "OriginalFilename", ""
+ VALUE "PrivateBuild", ""
+ VALUE "ProductName", "x64_dbg"
+ VALUE "ProductVersion", "V1.7ALPHA"
+ VALUE "SpecialBuild", ""
+ }
+ }
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x0400, 0x047B
+ }
+}
+
+
+
//
// Manifest resources
//
From 303723bcb562750164681b851f37854fbe944c00 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 15 May 2014 02:05:34 +0200
Subject: [PATCH 037/676] GUI: deleted custom tab widgets
---
x64_dbg_gui/Project/Src/Gui/TabBar.h | 43 -----
x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 149 ------------------
x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 182 ----------------------
x64_dbg_gui/Project/Src/Gui/tabwidget.h | 77 ---------
4 files changed, 451 deletions(-)
delete mode 100644 x64_dbg_gui/Project/Src/Gui/TabBar.h
delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.cpp
delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.h
diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h
deleted file mode 100644
index 744c2e7e..00000000
--- a/x64_dbg_gui/Project/Src/Gui/TabBar.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef __MHTABBAR_H__
-#define __MHTABBAR_H__
-
-// Qt includes
-#include
-
-// Qt forward class definitions
-class MHTabBar;
-class QMainWindow;
-
-//////////////////////////////////////////////////////////////////////////////
-// Summary:
-// MHTabBar implements the a Tab Bar with tear-off functionality.
-//////////////////////////////////////////////////////////////////////////////
-class MHTabBar: public QTabBar
-{
- Q_OBJECT
-public:
- MHTabBar (QWidget* parent);
- ~MHTabBar (void);
-
-protected:
- void mousePressEvent(QMouseEvent* event);
- void mouseMoveEvent(QMouseEvent* event);
- void dragEnterEvent(QDragEnterEvent* event);
- void dragMoveEvent(QDragMoveEvent* event);
- void dropEvent(QDropEvent* event);
-
-signals:
- // Detach Tab
- void OnDetachTab (int index, QPoint& dropPoint);
- // Move Tab
- void OnMoveTab (int fromIndex, int toIndex);
-
-private:
- QPoint m_dragStartPos;
- QPoint m_dragMovedPos;
- QPoint m_dragDroppedPos;
- bool m_dragInitiated;
- int m_dragCurrentIndex;
-};
-
-#endif // __MHTABBAR_H__
diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
deleted file mode 100644
index 209b9917..00000000
--- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-// Qt includes
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "tabbar.h"
-#include "tabwidget.h"
-
-//////////////////////////////////////////////////////////////
-// Default Constructor
-//////////////////////////////////////////////////////////////
-MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent)
-{
- setAcceptDrops(true);
- setElideMode(Qt::ElideRight);
- setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab);
- setMovable(true);
-}
-
-//////////////////////////////////////////////////////////////
-// Default Destructor
-//////////////////////////////////////////////////////////////
-MHTabBar::~MHTabBar(void)
-{
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabBar::mousePressEvent(QMouseEvent* event)
-{
- if (event->button() == Qt::LeftButton)
- m_dragStartPos = event->pos();
-
- m_dragDroppedPos.setX(0);
- m_dragDroppedPos.setY(0);
- m_dragMovedPos.setX(0);
- m_dragMovedPos.setY(0);
-
- m_dragInitiated = false;
-
- QTabBar::mousePressEvent(event);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabBar::mouseMoveEvent(QMouseEvent* event)
-{
- // Distinguish a drag
- if ( !m_dragStartPos.isNull() &&
- ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
- {
- m_dragInitiated = true;
- }
-
- // The left button is pressed
- // And the move could also be a drag
- // And the mouse moved outside the tab bar
- if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos()))
- {
- // Stop the move to be able to convert to a drag
- {
- QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
- QTabBar::mouseMoveEvent(&finishMoveEvent);
- }
-
- // A crude way to distinguish tab-reordering drops from other ones
- QMimeData* mimeData = new QMimeData;
- mimeData->setData("action", "application/tab-detach");
-
- // Initiate Drag
- QDrag* drag = new QDrag(this);
- drag->setMimeData(mimeData);
-
- // Create transparent screen dump
- QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio);
- QPixmap targetPixmap(pixmap.size());
-
- QPainter painter(&targetPixmap);
- painter.setOpacity(0.5);
- painter.drawPixmap(0, 0, pixmap);
- painter.end();
-
- drag->setPixmap(targetPixmap);
-
- // Handle Detach and Move
- Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction);
-
- if (dragged == Qt::IgnoreAction)
- {
- event->accept();
- OnDetachTab(tabAt(m_dragStartPos), QCursor::pos());
- }
- else if (dragged == Qt::MoveAction)
- {
- if (!m_dragDroppedPos.isNull())
- {
- event->accept();
- OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos));
- }
- }
-
- delete drag;
- }
- else
- {
- QTabBar::mouseMoveEvent(event);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
-{
- // Only accept if it's an tab-reordering request (not a detach request)
- const QMimeData* m = event->mimeData();
-
- if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
- {
- event->acceptProposedAction();
- }
-
- QTabBar::dragEnterEvent(event);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
-{
- // Only accept if it's an tab-reordering request (not a detach request)
- const QMimeData* m = event->mimeData();
-
- if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
- {
- m_dragMovedPos = event->pos();
- event->acceptProposedAction();
- }
-
- QTabBar::dragMoveEvent(event);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabBar::dropEvent(QDropEvent* event)
-{
- // If a dragged Event is dropped within this widget it is not a drag but a move.
- m_dragDroppedPos = event->pos();
-
- QTabBar::dropEvent(event);
-}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
deleted file mode 100644
index 3e58dfbd..00000000
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-// Qt includes
-#include "tabbar.h"
-#include "tabwidget.h"
-
-//////////////////////////////////////////////////////////////
-// Default Constructor
-//////////////////////////////////////////////////////////////
-MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
-{
- m_tabBar = new MHTabBar(this);
- connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
- connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
-
- setTabBar(m_tabBar);
- setMovable(true);
-
- m_Windows.clear();
-}
-
-QTabBar* MHTabWidget::tabBar()
-{
- return m_tabBar;
-}
-
-//////////////////////////////////////////////////////////////
-// Default Destructor
-//////////////////////////////////////////////////////////////
-MHTabWidget::~MHTabWidget(void)
-{
- disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
- disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
- delete m_tabBar;
-}
-
-int MHTabWidget::count() const
-{
- return QTabWidget::count() + m_Windows.size();
-}
-
-QWidget *MHTabWidget::widget(int index) const
-{
- int baseCount = QTabWidget::count();
-
- // Check if it's just a normal tab
- if (index < baseCount)
- return QTabWidget::widget(index);
-
- // Otherwise it's going to be a window
- return m_Windows.at(index - baseCount);
-}
-
-void MHTabWidget::setCurrentIndex(int index)
-{
- // Check if it's just a normal tab
- if (index < QTabWidget::count())
- {
- QTabWidget::setCurrentIndex(index);
- }
- else
- {
- // Otherwise it's going to be a window (just bring it up)
- MHDetachedWindow* window = dynamic_cast(widget(index)->parent());
- window->activateWindow();
- }
-}
-
-void MHTabWidget::setCurrentWidget(QWidget *widget)
-{
- widget = 0;
- // To be implemented.
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabWidget::MoveTab(int fromIndex, int toIndex)
-{
- removeTab(fromIndex);
- insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex));
- setCurrentIndex(toIndex);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabWidget::DetachTab(int index, QPoint& dropPoint)
-{
- // Create the window
- MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this);
- detachedWidget->setWindowModality(Qt::NonModal);
-
- // Find Widget and connect
- connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
-
- detachedWidget->setWindowTitle(tabText(index));
- detachedWidget->setWindowIcon(tabIcon(index));
-
- // Remove from tab bar
- QWidget* tearOffWidget = widget(index);
- tearOffWidget->setParent(detachedWidget);
-
- // Add it to the windows list
- m_Windows.append(tearOffWidget);
-
- // Make first active
- if (count() > 0)
- setCurrentIndex(0);
-
- // Create and show
- detachedWidget->setCentralWidget(tearOffWidget);
-
- // Needs to be done explicitly
- tearOffWidget->show();
- detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480);
- detachedWidget->show();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHTabWidget::AttachTab(QWidget *parent)
-{
- // Retrieve widget
- MHDetachedWindow* detachedWidget = dynamic_cast(parent);
- QWidget* tearOffWidget = detachedWidget->centralWidget();
-
- // Reattach the tab
- int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
-
- // Remove it from the windows list
- for(int i = 0; i < m_Windows.size(); i++)
- {
- if (m_Windows.at(i) == tearOffWidget)
- m_Windows.removeAt(i);
- }
-
- // Make Active
- if (newIndex != -1)
- setCurrentIndex(newIndex);
-
- // Cleanup Window
- disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
- detachedWidget->hide();
- detachedWidget->close();
-}
-
-//----------------------------------------------------------------------------
-
-//////////////////////////////////////////////////////////////////////////////
-MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent)
-{
- m_TabWidget = tabwidget;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-MHDetachedWindow::~MHDetachedWindow(void)
-{
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHDetachedWindow::moveEvent(QMoveEvent *event)
-{
- QRect rect = m_TabWidget->geometry();
- QSize hint = m_TabWidget->tabBar()->sizeHint();
-
- // Height of the actual top tab bar
- rect.setBottom(rect.top() + hint.height());
- QPoint pos1(rect.x(), rect.y());
- pos1=m_TabWidget->mapToGlobal(pos1);
- rect.setX(pos1.x());
- rect.setY(pos1.y());
-
- if (rect.contains(event->pos()))
- {
- m_TabWidget->AttachTab(this);
- event->accept();
- }
- else
- {
- QMainWindow::moveEvent(event);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/)
-{
- emit OnClose(this);
-}
diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h
deleted file mode 100644
index 183a5936..00000000
--- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __MHTABWIDGET_H__
-#define __MHTABWIDGET_H__
-
-// Qt includes
-#include
-#include
-#include
-#include
-
-// Qt forward class definitions
-class MHTabBar;
-
-//////////////////////////////////////////////////////////////////////////////
-// Summary:
-// MHTabWidget implements the a Tab Widget with detach and attach
-// functionality.
-//////////////////////////////////////////////////////////////////////////////
-class MHTabWidget: public QTabWidget
-{
- Q_OBJECT
-
-public:
- MHTabWidget(QWidget *parent);
- virtual ~MHTabWidget(void);
- QTabBar* tabBar();
-
-public slots:
- int count() const;
- QWidget *widget(int index) const;
-
- // Move Tab
- void MoveTab(int fromIndex, int toIndex);
-
- // Detach Tab
- void DetachTab(int index, QPoint&);
-
- // Attach Tab
- void AttachTab(QWidget *parent);
-
-public Q_SLOTS:
- void setCurrentIndex(int index);
- void setCurrentWidget(QWidget *widget);
-
-protected:
-
-private:
- MHTabBar* m_tabBar;
-
- QList m_Windows;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// Summary:
-// MHDetachedWindow implements the WindowContainer for the Detached Widget
-//
-// Conditions:
-// Header : MHTabWidget.h
-//////////////////////////////////////////////////////////////////////////////
-class MHDetachedWindow : public QMainWindow
-{
- Q_OBJECT
-public:
- MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0);
- ~MHDetachedWindow(void);
-
-protected:
- MHTabWidget *m_TabWidget;
-
- virtual void moveEvent(QMoveEvent *event);
- void closeEvent(QCloseEvent *event);
-
-signals:
- void OnClose(QWidget* widget);
-};
-
-#endif // __MHTABWIDGET_H__
-
From 9f6385a0eb095356a2aef418c5ca2d88ca38277e Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 15 May 2014 02:06:02 +0200
Subject: [PATCH 038/676] GUI: now detaching only works with a context menu
---
x64_dbg_gui/Project/Src/TabBar.cpp | 163 ++++++++++++++++++++++
x64_dbg_gui/Project/Src/TabBar.h | 50 +++++++
x64_dbg_gui/Project/Src/TabWidget.cpp | 190 ++++++++++++++++++++++++++
x64_dbg_gui/Project/Src/TabWidget.h | 79 +++++++++++
4 files changed, 482 insertions(+)
create mode 100644 x64_dbg_gui/Project/Src/TabBar.cpp
create mode 100644 x64_dbg_gui/Project/Src/TabBar.h
create mode 100644 x64_dbg_gui/Project/Src/TabWidget.cpp
create mode 100644 x64_dbg_gui/Project/Src/TabWidget.h
diff --git a/x64_dbg_gui/Project/Src/TabBar.cpp b/x64_dbg_gui/Project/Src/TabBar.cpp
new file mode 100644
index 00000000..7898f74b
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/TabBar.cpp
@@ -0,0 +1,163 @@
+// Qt includes
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "tabbar.h"
+#include "tabwidget.h"
+
+//////////////////////////////////////////////////////////////
+// Default Constructor
+//////////////////////////////////////////////////////////////
+MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent)
+{
+ setAcceptDrops(true);
+ setElideMode(Qt::ElideRight);
+ setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab);
+ setMovable(true);
+}
+
+//////////////////////////////////////////////////////////////
+// Default Destructor
+//////////////////////////////////////////////////////////////
+MHTabBar::~MHTabBar(void)
+{
+}
+
+void MHTabBar::contextMenuEvent(QContextMenuEvent* event)
+{
+ QMenu wMenu(this);
+ QAction wDetach("&Detach", this);
+ wMenu.addAction(&wDetach);
+ if(wMenu.exec(event->globalPos())==&wDetach)
+ {
+ OnDetachTab(tabAt(event->pos()), QPoint(0, 0));
+ }
+}
+
+
+/*
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::mousePressEvent(QMouseEvent* event)
+{
+ if (event->button() == Qt::LeftButton)
+ m_dragStartPos = event->pos();
+
+ m_dragDroppedPos.setX(0);
+ m_dragDroppedPos.setY(0);
+ m_dragMovedPos.setX(0);
+ m_dragMovedPos.setY(0);
+
+ m_dragInitiated = false;
+
+ QTabBar::mousePressEvent(event);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::mouseMoveEvent(QMouseEvent* event)
+{
+ // Distinguish a drag
+ if ( !m_dragStartPos.isNull() &&
+ ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
+ {
+ m_dragInitiated = true;
+ }
+
+ // The left button is pressed
+ // And the move could also be a drag
+ // And the mouse moved outside the tab bar
+ if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos()))
+ {
+ // Stop the move to be able to convert to a drag
+ {
+ QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+ QTabBar::mouseMoveEvent(&finishMoveEvent);
+ }
+
+ // A crude way to distinguish tab-reordering drops from other ones
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData("action", "application/tab-detach");
+
+ // Initiate Drag
+ QDrag* drag = new QDrag(this);
+ drag->setMimeData(mimeData);
+
+ // Create transparent screen dump
+ QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio);
+ QPixmap targetPixmap(pixmap.size());
+
+ QPainter painter(&targetPixmap);
+ painter.setOpacity(0.5);
+ painter.drawPixmap(0, 0, pixmap);
+ painter.end();
+
+ drag->setPixmap(targetPixmap);
+
+ // Handle Detach and Move
+ Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction);
+
+ if (dragged == Qt::IgnoreAction)
+ {
+ event->accept();
+ OnDetachTab(tabAt(m_dragStartPos), QCursor::pos());
+ }
+ else if (dragged == Qt::MoveAction)
+ {
+ if (!m_dragDroppedPos.isNull())
+ {
+ event->accept();
+ OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos));
+ }
+ }
+
+ delete drag;
+ }
+ else
+ {
+ QTabBar::mouseMoveEvent(event);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
+{
+ // Only accept if it's an tab-reordering request (not a detach request)
+ const QMimeData* m = event->mimeData();
+
+ if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
+ {
+ event->acceptProposedAction();
+ }
+
+ QTabBar::dragEnterEvent(event);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
+{
+ // Only accept if it's an tab-reordering request (not a detach request)
+ const QMimeData* m = event->mimeData();
+
+ if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
+ {
+ m_dragMovedPos = event->pos();
+ event->acceptProposedAction();
+ }
+
+ QTabBar::dragMoveEvent(event);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabBar::dropEvent(QDropEvent* event)
+{
+ // If a dragged Event is dropped within this widget it is not a drag but a move.
+ m_dragDroppedPos = event->pos();
+
+ QTabBar::dropEvent(event);
+}
+*/
diff --git a/x64_dbg_gui/Project/Src/TabBar.h b/x64_dbg_gui/Project/Src/TabBar.h
new file mode 100644
index 00000000..493b0e28
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/TabBar.h
@@ -0,0 +1,50 @@
+#ifndef __MHTABBAR_H__
+#define __MHTABBAR_H__
+
+// Qt includes
+#include
+#include
+#include
+
+// Qt forward class definitions
+class MHTabBar;
+class QMainWindow;
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHTabBar implements the a Tab Bar with tear-off functionality.
+//////////////////////////////////////////////////////////////////////////////
+class MHTabBar: public QTabBar
+{
+ Q_OBJECT
+public:
+ MHTabBar (QWidget* parent);
+ ~MHTabBar (void);
+
+protected:
+ void contextMenuEvent(QContextMenuEvent* event);
+ /*
+ void mousePressEvent(QMouseEvent* event);
+ void mouseMoveEvent(QMouseEvent* event);
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dragMoveEvent(QDragMoveEvent* event);
+ void dropEvent(QDropEvent* event);
+ */
+
+signals:
+ // Detach Tab
+ void OnDetachTab (int index, QPoint& dropPoint);
+ // Move Tab
+ void OnMoveTab (int fromIndex, int toIndex);
+
+private:
+ /*
+ QPoint m_dragStartPos;
+ QPoint m_dragMovedPos;
+ QPoint m_dragDroppedPos;
+ bool m_dragInitiated;
+ int m_dragCurrentIndex;
+ */
+};
+
+#endif // __MHTABBAR_H__
diff --git a/x64_dbg_gui/Project/Src/TabWidget.cpp b/x64_dbg_gui/Project/Src/TabWidget.cpp
new file mode 100644
index 00000000..fed6f634
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/TabWidget.cpp
@@ -0,0 +1,190 @@
+// Qt includes
+#include "tabbar.h"
+#include "tabwidget.h"
+
+//////////////////////////////////////////////////////////////
+// Default Constructor
+//////////////////////////////////////////////////////////////
+MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent)
+{
+ m_tabBar = new MHTabBar(this);
+ connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
+ connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
+
+ setTabBar(m_tabBar);
+ setMovable(true);
+
+ m_Windows.clear();
+}
+
+QTabBar* MHTabWidget::tabBar()
+{
+ return m_tabBar;
+}
+
+//////////////////////////////////////////////////////////////
+// Default Destructor
+//////////////////////////////////////////////////////////////
+MHTabWidget::~MHTabWidget(void)
+{
+ disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int)));
+ disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&)));
+ delete m_tabBar;
+}
+
+int MHTabWidget::count() const
+{
+ return QTabWidget::count() + m_Windows.size();
+}
+
+QWidget *MHTabWidget::widget(int index) const
+{
+ int baseCount = QTabWidget::count();
+
+ // Check if it's just a normal tab
+ if (index < baseCount)
+ return QTabWidget::widget(index);
+
+ // Otherwise it's going to be a window
+ return m_Windows.at(index - baseCount);
+}
+
+void MHTabWidget::setCurrentIndex(int index)
+{
+ // Check if it's just a normal tab
+ if (index < QTabWidget::count())
+ {
+ QTabWidget::setCurrentIndex(index);
+ }
+ else
+ {
+ // Otherwise it's going to be a window (just bring it up)
+ MHDetachedWindow* window = dynamic_cast(widget(index)->parent());
+ window->activateWindow();
+ }
+}
+
+void MHTabWidget::setCurrentWidget(QWidget *widget)
+{
+ widget = 0;
+ // To be implemented.
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabWidget::MoveTab(int fromIndex, int toIndex)
+{
+ removeTab(fromIndex);
+ insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex));
+ setCurrentIndex(toIndex);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabWidget::DetachTab(int index, QPoint& dropPoint)
+{
+ // Create the window
+ MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this);
+ detachedWidget->setWindowModality(Qt::NonModal);
+
+ // Find Widget and connect
+ connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
+
+ detachedWidget->setWindowTitle(tabText(index));
+ detachedWidget->setWindowIcon(tabIcon(index));
+
+ // Remove from tab bar
+ QWidget* tearOffWidget = widget(index);
+ tearOffWidget->setParent(detachedWidget);
+
+ // Add it to the windows list
+ m_Windows.append(tearOffWidget);
+
+ // Make first active
+ if (count() > 0)
+ setCurrentIndex(0);
+
+ // Create and show
+ detachedWidget->setCentralWidget(tearOffWidget);
+
+ // Needs to be done explicitly
+ tearOffWidget->show();
+ QRect screenGeometry = QApplication::desktop()->screenGeometry();
+ int w = 640;
+ int h = 480;
+ int x = (screenGeometry.width() - w) / 2;
+ int y = (screenGeometry.height() - h) / 2;
+ detachedWidget->show();
+ detachedWidget->setGeometry(x, y, w, h);
+ detachedWidget->show();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+void MHTabWidget::AttachTab(QWidget *parent)
+{
+ // Retrieve widget
+ MHDetachedWindow* detachedWidget = dynamic_cast(parent);
+ QWidget* tearOffWidget = detachedWidget->centralWidget();
+
+ // Reattach the tab
+ int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle());
+
+ // Remove it from the windows list
+ for(int i = 0; i < m_Windows.size(); i++)
+ {
+ if (m_Windows.at(i) == tearOffWidget)
+ m_Windows.removeAt(i);
+ }
+
+ // Make Active
+ if (newIndex != -1)
+ setCurrentIndex(newIndex);
+
+ // Cleanup Window
+ disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*)));
+ detachedWidget->hide();
+ detachedWidget->close();
+}
+
+//----------------------------------------------------------------------------
+
+//////////////////////////////////////////////////////////////////////////////
+MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent)
+{
+ m_TabWidget = tabwidget;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+MHDetachedWindow::~MHDetachedWindow(void)
+{
+}
+
+/*
+//////////////////////////////////////////////////////////////////////////////
+void MHDetachedWindow::moveEvent(QMoveEvent *event)
+{
+ QRect rect = m_TabWidget->geometry();
+ QSize hint = m_TabWidget->tabBar()->sizeHint();
+
+ // Height of the actual top tab bar
+ rect.setBottom(rect.top() + hint.height());
+ QPoint pos1(rect.x(), rect.y());
+ pos1=m_TabWidget->mapToGlobal(pos1);
+ rect.setX(pos1.x());
+ rect.setY(pos1.y());
+
+ if (rect.contains(event->pos()))
+ {
+ m_TabWidget->AttachTab(this);
+ event->accept();
+ }
+ else
+ {
+ QMainWindow::moveEvent(event);
+ }
+}
+*/
+
+//////////////////////////////////////////////////////////////////////////////
+void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/)
+{
+ emit OnClose(this);
+}
diff --git a/x64_dbg_gui/Project/Src/TabWidget.h b/x64_dbg_gui/Project/Src/TabWidget.h
new file mode 100644
index 00000000..874913fb
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/TabWidget.h
@@ -0,0 +1,79 @@
+#ifndef __MHTABWIDGET_H__
+#define __MHTABWIDGET_H__
+
+// Qt includes
+#include
+#include
+#include
+#include
+#include
+#include
+
+// Qt forward class definitions
+class MHTabBar;
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHTabWidget implements the a Tab Widget with detach and attach
+// functionality.
+//////////////////////////////////////////////////////////////////////////////
+class MHTabWidget: public QTabWidget
+{
+ Q_OBJECT
+
+public:
+ MHTabWidget(QWidget *parent);
+ virtual ~MHTabWidget(void);
+ QTabBar* tabBar();
+
+public slots:
+ int count() const;
+ QWidget *widget(int index) const;
+
+ // Move Tab
+ void MoveTab(int fromIndex, int toIndex);
+
+ // Detach Tab
+ void DetachTab(int index, QPoint&);
+
+ // Attach Tab
+ void AttachTab(QWidget *parent);
+
+public Q_SLOTS:
+ void setCurrentIndex(int index);
+ void setCurrentWidget(QWidget *widget);
+
+protected:
+
+private:
+ MHTabBar* m_tabBar;
+
+ QList m_Windows;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+// Summary:
+// MHDetachedWindow implements the WindowContainer for the Detached Widget
+//
+// Conditions:
+// Header : MHTabWidget.h
+//////////////////////////////////////////////////////////////////////////////
+class MHDetachedWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0);
+ ~MHDetachedWindow(void);
+
+protected:
+ MHTabWidget *m_TabWidget;
+
+ //virtual void moveEvent(QMoveEvent *event);
+ void closeEvent(QCloseEvent *event);
+
+signals:
+ void OnClose(QWidget* widget);
+};
+
+#endif // __MHTABWIDGET_H__
+
From f87d2079b7775dff93c56022b1a175088c378b2a Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Thu, 15 May 2014 02:06:42 +0200
Subject: [PATCH 039/676] GUI: some failures
---
x64_dbg_gui/Project/Src/{ => Gui}/TabBar.cpp | 0
x64_dbg_gui/Project/Src/{ => Gui}/TabBar.h | 0
x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.cpp | 0
x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.h | 0
4 files changed, 0 insertions(+), 0 deletions(-)
rename x64_dbg_gui/Project/Src/{ => Gui}/TabBar.cpp (100%)
rename x64_dbg_gui/Project/Src/{ => Gui}/TabBar.h (100%)
rename x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.cpp (100%)
rename x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.h (100%)
diff --git a/x64_dbg_gui/Project/Src/TabBar.cpp b/x64_dbg_gui/Project/Src/Gui/TabBar.cpp
similarity index 100%
rename from x64_dbg_gui/Project/Src/TabBar.cpp
rename to x64_dbg_gui/Project/Src/Gui/TabBar.cpp
diff --git a/x64_dbg_gui/Project/Src/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h
similarity index 100%
rename from x64_dbg_gui/Project/Src/TabBar.h
rename to x64_dbg_gui/Project/Src/Gui/TabBar.h
diff --git a/x64_dbg_gui/Project/Src/TabWidget.cpp b/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp
similarity index 100%
rename from x64_dbg_gui/Project/Src/TabWidget.cpp
rename to x64_dbg_gui/Project/Src/Gui/TabWidget.cpp
diff --git a/x64_dbg_gui/Project/Src/TabWidget.h b/x64_dbg_gui/Project/Src/Gui/TabWidget.h
similarity index 100%
rename from x64_dbg_gui/Project/Src/TabWidget.h
rename to x64_dbg_gui/Project/Src/Gui/TabWidget.h
From 03a18dd9c4ba7bbac5c4e5f3a43a467a972d2e45 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sun, 18 May 2014 02:24:08 +0200
Subject: [PATCH 040/676] GUI: fixed a bug with the reference view (thanks to
Artic for reporting this)
GUI: fixed a bug with the reloadData function
DBG: removed useless DeleteFile calls
---
x64_dbg_dbg/debugger.cpp | 1 -
x64_dbg_dbg/x64_dbg.cpp | 2 --
x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h | 2 +-
x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp | 6 ++++++
x64_dbg_gui/Project/Src/BasicView/Disassembly.h | 1 +
x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp | 5 +++++
6 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp
index 3a82b542..1e3bf2d0 100644
--- a/x64_dbg_dbg/debugger.cpp
+++ b/x64_dbg_dbg/debugger.cpp
@@ -974,7 +974,6 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter)
stopInfo.reserved=0;
plugincbcall(CB_STOPDEBUG, &stopInfo);
//message the user/do final stuff
- DeleteFileA("DLLLoader.exe");
RemoveAllBreakPoints(UE_OPTION_REMOVEALL); //remove all breakpoints
//cleanup
dbclose();
diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp
index 4fadd073..7dd981fa 100644
--- a/x64_dbg_dbg/x64_dbg.cpp
+++ b/x64_dbg_dbg/x64_dbg.cpp
@@ -181,7 +181,6 @@ static DWORD WINAPI DbgCommandLoopThread(void* a)
extern "C" DLL_EXPORT const char* _dbg_dbginit()
{
- DeleteFileA("DLLLoader.exe");
DeleteFileA("alloctrace.txt");
char dir[deflen]="";
if(!GetModuleFileNameA(hInst, dir, deflen))
@@ -211,7 +210,6 @@ extern "C" DLL_EXPORT void _dbg_dbgexitsignal()
cbStopDebug(0, 0);
wait(WAITID_STOP); //after this, debugging stopped
pluginunload();
- DeleteFileA("DLLLoader.exe");
cmdfree(command_list);
varfree();
msgfreestack(gMsgStack);
diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h
index ddfb7187..6d930a70 100644
--- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h
+++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h
@@ -80,7 +80,7 @@ signals:
public slots:
// Update/Reload/Refresh/Repaint
- void reloadData();
+ virtual void reloadData();
void repaint();
// ScrollBar Management
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
index 7258b070..cfc956b2 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp
@@ -995,6 +995,12 @@ void Disassembly::prepareData()
}
}
+void Disassembly::reloadData()
+{
+ emit selectionChanged(rvaToVa(mSelection.firstSelectedIndex));
+ AbstractTableView::reloadData();
+}
+
/************************************************************************************
Public Methods
diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
index 112871c7..fefb8a69 100644
--- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
+++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h
@@ -68,6 +68,7 @@ public:
// Update/Reload/Refresh/Repaint
void prepareData();
+ void reloadData();
// Public Methods
uint_t rvaToVa(int_t rva);
diff --git a/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp b/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp
index 8f83e78b..d639d3a0 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp
@@ -61,10 +61,15 @@ void ReferenceView::setRowCount(int_t count)
void ReferenceView::deleteAllColumns()
{
+ mSearchBox->setText("");
mList->setTableOffset(0);
mList->setSingleSelection(0);
mList->deleteAllColumns();
mList->reloadData();
+ mSearchList->setTableOffset(0);
+ mSearchList->setSingleSelection(0);
+ mSearchList->deleteAllColumns();
+ mSearchList->reloadData();
mSearchStartCol = 1;
}
From 259099f9361f5a086735a845ad5dafeac22df15a Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sun, 18 May 2014 14:13:07 +0200
Subject: [PATCH 041/676] DBG: fixed two small bugs in the script engine
---
x64_dbg_dbg/simplescript.cpp | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/x64_dbg_dbg/simplescript.cpp b/x64_dbg_dbg/simplescript.cpp
index 98409614..82ef418e 100644
--- a/x64_dbg_dbg/simplescript.cpp
+++ b/x64_dbg_dbg/simplescript.cpp
@@ -69,6 +69,12 @@ static bool scriptcreatelinemap(const char* filename)
return false;
}
unsigned int filesize=GetFileSize(hFile, 0);
+ if(!filesize)
+ {
+ CloseHandle(hFile);
+ GuiScriptError(0, "Empty script...");
+ return false;
+ }
char* filedata=(char*)emalloc(filesize+1, "createlinemap:filedata");
memset(filedata, 0, filesize+1);
DWORD read=0;
@@ -507,7 +513,7 @@ void scriptunload()
void scriptrun(int destline)
{
- if(!waitislocked(WAITID_RUN))
+ if(DbgIsDebugging() && !waitislocked(WAITID_RUN))
{
GuiScriptError(0, "Debugger must be paused to run a script!");
return;
From bf7c1fb8c342bf02e1f1d543a07c370c01d4293f Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 21 May 2014 00:20:31 +0200
Subject: [PATCH 042/676] DBG: fixed a few warnings
DBG: updated pattern finder
---
x64_dbg_bridge/x64_dbg_bridge.vcxproj | 10 ++++-----
x64_dbg_dbg/_exports.cpp | 28 +++++++++++------------
x64_dbg_dbg/disasm_helper.cpp | 4 ++--
x64_dbg_dbg/memory.cpp | 32 +++++++++++++++++++--------
x64_dbg_dbg/symbolinfo.cpp | 2 +-
x64_dbg_dbg/thread.cpp | 2 +-
x64_dbg_dbg/x64_dbg_dbg.vcxproj | 4 ++--
x64_dbg_exe/x64_dbg_exe.vcxproj | 10 ++++-----
8 files changed, 53 insertions(+), 39 deletions(-)
diff --git a/x64_dbg_bridge/x64_dbg_bridge.vcxproj b/x64_dbg_bridge/x64_dbg_bridge.vcxproj
index 87471fbf..f6d642f8 100644
--- a/x64_dbg_bridge/x64_dbg_bridge.vcxproj
+++ b/x64_dbg_bridge/x64_dbg_bridge.vcxproj
@@ -19,7 +19,7 @@
- {944D9923-CB1A-6F6C-BCBC-9E00A71954C1}
+ {944D9923-CB1A-6F6C-BCBC-9E00A71954C1}
Win32Proj
@@ -42,14 +42,14 @@
- true
- $(SolutionDir)bin\x32
+ false
+ $(SolutionDir)bin\x32\
$(Platform)\$(Configuration)\
x32_bridge
- true
- $(SolutionDir)bin\x64
+ false
+ $(SolutionDir)bin\x64\
x64_bridge
diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp
index 1983ea7c..73886564 100644
--- a/x64_dbg_dbg/_exports.cpp
+++ b/x64_dbg_dbg/_exports.cpp
@@ -126,41 +126,41 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap)
SectionName="";
int len=strlen(SectionName);
int escape_count=0;
- for(int i=0; itype=arg_memory;
arg->segment=ConvertBeaSeg(Argument->SegmentReg);
- uint value=Argument->Memory.Displacement;
+ uint value=(uint)Argument->Memory.Displacement;
if((Argument->ArgType&RELATIVE_)==RELATIVE_)
- value=Instruction->AddrValue;
+ value=(uint)Instruction->AddrValue;
arg->constant=value;
arg->value=0;
if(!valfromstring(argmnemonic, &value, true, true))
diff --git a/x64_dbg_dbg/memory.cpp b/x64_dbg_dbg/memory.cpp
index 3b9474b0..eaeef393 100644
--- a/x64_dbg_dbg/memory.cpp
+++ b/x64_dbg_dbg/memory.cpp
@@ -99,6 +99,20 @@ void memfree(HANDLE hProcess, uint addr)
VirtualFreeEx(hProcess, (void*)addr, 0, MEM_RELEASE);
}
+static int formathexpattern(char* string)
+{
+ int len=strlen(string);
+ _strupr(string);
+ char* new_string=(char*)emalloc(len+1, "formathexpattern:new_string");
+ memset(new_string, 0, len+1);
+ for(int i=0,j=0; i* pattern)
{
if(!text or !pattern)
@@ -109,6 +123,7 @@ static bool patterntransform(const char* text, std::vector* pattern
return false;
char* newtext=(char*)emalloc(len+2, "transformpattern:newtext");
strcpy(newtext, text);
+ len=formathexpattern(newtext);
if(len%2) //not a multiple of 2
{
newtext[len]='?';
@@ -118,7 +133,13 @@ static bool patterntransform(const char* text, std::vector* pattern
PATTERNBYTE newByte;
for(int i=0,j=0; i* pattern
newByte.n[j].n=val&0xF;
j++;
}
- else if(newtext[i]=='?') //wildcard
- {
- newByte.n[j].all=true; //match anything
- newByte.n[j].n=0;
- j++;
- }
- else //dafug dude..
- return false; //invalid pattern format
+
if(j==2) //two nibbles = one byte
{
j=0;
diff --git a/x64_dbg_dbg/symbolinfo.cpp b/x64_dbg_dbg/symbolinfo.cpp
index 8f2c4141..44e0a0f8 100644
--- a/x64_dbg_dbg/symbolinfo.cpp
+++ b/x64_dbg_dbg/symbolinfo.cpp
@@ -13,7 +13,7 @@ static BOOL CALLBACK EnumSymbols(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID
int len=strlen(pSymInfo->Name);
SYMBOLINFO curSymbol;
memset(&curSymbol, 0, sizeof(SYMBOLINFO));
- curSymbol.addr=pSymInfo->Address;
+ curSymbol.addr=(duint)pSymInfo->Address;
curSymbol.decoratedSymbol=(char*)BridgeAlloc(len+1);
strcpy(curSymbol.decoratedSymbol, pSymInfo->Name);
curSymbol.undecoratedSymbol=(char*)BridgeAlloc(MAX_SYM_NAME);
diff --git a/x64_dbg_dbg/thread.cpp b/x64_dbg_dbg/thread.cpp
index dbc6e2ba..05a385d7 100644
--- a/x64_dbg_dbg/thread.cpp
+++ b/x64_dbg_dbg/thread.cpp
@@ -22,7 +22,7 @@ void threadcreate(CREATE_THREAD_DEBUG_INFO* CreateThread)
void threadexit(DWORD dwThreadId)
{
- for(int i=0; i
- true
+ false
$(SolutionDir)bin\x32\
$(Platform)\$(Configuration)\
x32_dbg
- true
+ false
$(SolutionDir)bin\x64\
x64_dbg
diff --git a/x64_dbg_exe/x64_dbg_exe.vcxproj b/x64_dbg_exe/x64_dbg_exe.vcxproj
index fb81b119..01b36e61 100644
--- a/x64_dbg_exe/x64_dbg_exe.vcxproj
+++ b/x64_dbg_exe/x64_dbg_exe.vcxproj
@@ -20,7 +20,7 @@
- {3A22175E-6B72-FDCC-1603-C4A2163C7900}
+ {3A22175E-6B72-FDCC-1603-C4A2163C7900}
Win32Proj
@@ -43,14 +43,14 @@
- true
- $(SolutionDir)bin\x32
+ false
+ $(SolutionDir)bin\x32\
$(Platform)\$(Configuration)\
x32_dbg
- true
- $(SolutionDir)bin\x64
+ false
+ $(SolutionDir)bin\x64\
x64_dbg
From 673602847982015a63d0ec2ba489ea5622cbd28b Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 21 May 2014 00:21:07 +0200
Subject: [PATCH 043/676] GUI: added CommandHelpView draft
---
.../Project/Src/BasicView/CommandHelpView.cpp | 133 ++++++++++++++++++
.../Project/Src/BasicView/CommandHelpView.h | 41 ++++++
.../Project/Src/BasicView/CommandHelpView.ui | 103 ++++++++++++++
3 files changed, 277 insertions(+)
create mode 100644 x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp
create mode 100644 x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h
create mode 100644 x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui
diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp
new file mode 100644
index 00000000..a2d8b3c7
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp
@@ -0,0 +1,133 @@
+#include "CommandHelpView.h"
+#include "ui_CommandHelpView.h"
+
+CommandHelpView::CommandHelpView(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::CommandHelpView)
+{
+ ui->setupUi(this);
+
+ // Set main layout
+ mMainLayout = new QVBoxLayout;
+ mMainLayout->setContentsMargins(0, 0, 0, 0);
+ mMainLayout->addWidget(ui->mainSplitter);
+ setLayout(mMainLayout);
+
+ // Create reference view
+ mSearchListView = new SearchListView();
+ mSearchListView->mSearchStartCol = 1;
+
+ // Get font information
+ QFont wFont("Monospace", 8);
+ wFont.setStyleHint(QFont::Monospace);
+ wFont.setFixedPitch(true);
+ int charwidth=QFontMetrics(wFont).width(QChar(' '));
+
+ // Create module list
+ mModuleList = new StdTable();
+ mModuleList->addColumnAt(0, "Module", false);
+
+ // Setup symbol list
+ mSearchListView->mList->addColumnAt(0, "Command", true);
+
+ // Setup search list
+ mSearchListView->mSearchList->addColumnAt(0, "Command", true);
+
+ // Setup list splitter
+ ui->listSplitter->addWidget(mModuleList);
+ ui->listSplitter->addWidget(mSearchListView);
+#ifdef _WIN64
+ // mModuleList : mSymbolList = 40 : 100
+ ui->listSplitter->setStretchFactor(0, 40);
+ ui->listSplitter->setStretchFactor(1, 100);
+#else
+ // mModuleList : mSymbolList = 30 : 100
+ ui->listSplitter->setStretchFactor(0, 30);
+ ui->listSplitter->setStretchFactor(1, 100);
+#endif //_WIN64
+
+ // Setup log edit
+ ui->symbolLogEdit->setFont(wFont);
+ ui->symbolLogEdit->setStyleSheet("QTextEdit { background-color: rgb(255, 251, 240) }");
+ ui->symbolLogEdit->setUndoRedoEnabled(false);
+ ui->symbolLogEdit->setReadOnly(true);
+ // Log : List = 2 : 9
+ ui->mainSplitter->setStretchFactor(1, 9);
+ ui->mainSplitter->setStretchFactor(0, 1);
+
+ connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int)));
+ connect(mSearchListView->mList, SIGNAL(selectionChangedSignal(int)), this, SLOT(symbolSelectionChanged(int)));
+
+ //fill with example data
+ mModuleList->setRowCount(2);
+ mModuleList->setCellContent(0, 0, "x64_dbg");
+ mModuleList->setCellContent(1, 0, "testplugin");
+
+ mModuleList->setSingleSelection(0);
+}
+
+CommandHelpView::~CommandHelpView()
+{
+ delete ui;
+}
+
+void CommandHelpView::moduleSelectionChanged(int index)
+{
+ mSearchListView->mList->setRowCount(0);
+
+ if(index==0) //x64_dbg
+ {
+ mCurrentMode=0;
+ mSearchListView->mList->setRowCount(3);
+ mSearchListView->mList->setCellContent(0, 0, "InitDebug");
+ mSearchListView->mList->setCellContent(1, 0, "StopDebug");
+ mSearchListView->mList->setCellContent(2, 0, "run");
+ }
+ else if(index==1) //testplugin
+ {
+ mCurrentMode=1;
+ mSearchListView->mList->setRowCount(2);
+ mSearchListView->mList->setCellContent(0, 0, "plugin1");
+ mSearchListView->mList->setCellContent(1, 0, "grs");
+ }
+
+ mSearchListView->mList->reloadData();
+ mSearchListView->mList->setSingleSelection(0);
+ mSearchListView->mList->setTableOffset(0);
+ mSearchListView->mList->setFocus();
+ mSearchListView->mSearchBox->setText("");
+}
+
+void CommandHelpView::symbolSelectionChanged(int index)
+{
+ QString info="";
+ if(mCurrentMode==0) //x64_dbg
+ {
+ switch(index)
+ {
+ case 0: //InitDebug
+ info="Initialize debugging a file.\n\nExample:\nInitDebug \"C:\\test.exe\", commandline, \"C:\\homeDir\"";
+ break;
+ case 1: //StopDebug
+ info="Stop debugging (terminate the target).\n\nExample:\nStopDebug";
+ break;
+ case 2: //run
+ info="Resume debugging.\n\nExample:\nrun";
+ break;
+ }
+ }
+ else if(mCurrentMode==1) //testplugin
+ {
+ switch(index)
+ {
+ case 0: //plugin1
+ info="Just a simple plugin test command.\n\nExample:\nplugin1";
+ break;
+ case 1: //grs
+ info="Get relocation table size.\n\nExample:\ngrs 404000";
+ break;
+ }
+
+ }
+ ui->symbolLogEdit->setText(info);
+}
diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h
new file mode 100644
index 00000000..8e2a990b
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h
@@ -0,0 +1,41 @@
+#ifndef COMMANDHELPVIEW_H
+#define COMMANDHELPVIEW_H
+
+#include
+#include
+#include
+#include
+#include "StdTable.h"
+#include "Bridge.h"
+#include "SearchListView.h"
+
+namespace Ui {
+class CommandHelpView;
+}
+
+class CommandHelpView : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit CommandHelpView(QWidget *parent = 0);
+ ~CommandHelpView();
+
+private slots:
+ void moduleSelectionChanged(int index);
+ void symbolSelectionChanged(int index);
+
+signals:
+ void showCpu();
+
+private:
+ Ui::CommandHelpView *ui;
+ QVBoxLayout* mMainLayout;
+ QVBoxLayout* mSymbolLayout;
+ QWidget* mSymbolPlaceHolder;
+ SearchListView* mSearchListView;
+ StdTable* mModuleList;
+ int mCurrentMode;
+};
+
+#endif // COMMANDHELPVIEW_H
diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui
new file mode 100644
index 00000000..bed24936
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui
@@ -0,0 +1,103 @@
+
+
+ CommandHelpView
+
+
+
+ 0
+ 0
+ 694
+ 605
+
+
+
+ Form
+
+
+ true
+
+
+
+
+
+
+
+ 0
+ 0
+ 691
+ 601
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Vertical
+
+
+ false
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
+
+
+ 2
+
+
+ false
+
+
+
+
+
+ 3
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 15
+
+
+
+ 0
+
+
+ false
+
+
+
+
+
+
+
+
+
+
From 5777b7364fad0c8641f48e246f76964307afe6eb Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 21 May 2014 00:22:49 +0200
Subject: [PATCH 044/676] DBG: added command auto-completion
BRIDGE: added command auto-completion
GUI: added command auto-completion
GUI: added HistoryLineEdit in the Goto Dialog
---
x64_dbg_bridge/bridgemain.cpp | 15 ++
x64_dbg_bridge/bridgemain.h | 8 +-
x64_dbg_dbg/debugger.cpp | 16 ++
x64_dbg_dbg/debugger.h | 3 +
x64_dbg_dbg/plugin_loader.cpp | 8 +-
x64_dbg_dbg/x64_dbg.cpp | 164 +++++++++---------
x64_dbg_gui/Project/DebuggerX64.pro | 11 +-
.../Project/Src/BasicView/HistoryLineEdit.cpp | 51 ++++++
.../Project/Src/BasicView/HistoryLineEdit.h | 29 ++++
x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp | 11 ++
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 39 +++++
x64_dbg_gui/Project/Src/Bridge/Bridge.h | 6 +
.../Project/Src/Gui/CPUDisassembly.cpp | 9 +-
x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 2 +
x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 11 +-
x64_dbg_gui/Project/Src/Gui/CPUDump.h | 2 +
x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 15 +-
x64_dbg_gui/Project/Src/Gui/CPUStack.h | 2 +
.../Project/Src/Gui/CommandLineEdit.cpp | 69 +++-----
x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h | 29 ++--
x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp | 8 +
x64_dbg_gui/Project/Src/Gui/GotoDialog.h | 2 +
x64_dbg_gui/Project/Src/Gui/GotoDialog.ui | 9 +-
x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 4 +-
24 files changed, 357 insertions(+), 166 deletions(-)
create mode 100644 x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp
create mode 100644 x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h
diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp
index 643e19ae..ea427f10 100644
--- a/x64_dbg_bridge/bridgemain.cpp
+++ b/x64_dbg_bridge/bridgemain.cpp
@@ -829,6 +829,21 @@ BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text)
return (bool)(duint)_gui_sendmessage(GUI_GETLINE_WINDOW, (void*)title, text);
}
+BRIDGE_IMPEXP void GuiAutoCompleteAddCmd(const char* cmd)
+{
+ _gui_sendmessage(GUI_AUTOCOMPLETE_ADDCMD, (void*)cmd, 0);
+}
+
+BRIDGE_IMPEXP void GuiAutoCompleteDelCmd(const char* cmd)
+{
+ _gui_sendmessage(GUI_AUTOCOMPLETE_DELCMD, (void*)cmd, 0);
+}
+
+BRIDGE_IMPEXP void GuiAutoCompleteClearAll()
+{
+ _gui_sendmessage(GUI_AUTOCOMPLETE_CLEARALL, 0, 0);
+}
+
//Main
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 83a0dd0b..15301402 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -549,7 +549,10 @@ enum GUIMSG
GUI_MENU_CLEAR, // param1=int hMenu, param2=unused
GUI_SELECTION_GET, // param1=int hWindow, param2=SELECTIONDATA* selection
GUI_SELECTION_SET, // param1=int hWindow, param2=const SELECTIONDATA* selection
- GUI_GETLINE_WINDOW // param1=const char* title, param2=char* text
+ GUI_GETLINE_WINDOW, // param1=const char* title, param2=char* text
+ GUI_AUTOCOMPLETE_ADDCMD, // param1=const char* cmd, param2=ununsed
+ GUI_AUTOCOMPLETE_DELCMD, // param1=const char* cmd, param2=ununsed
+ GUI_AUTOCOMPLETE_CLEARALL // param1=ununsed, param2=unused
};
//GUI structures
@@ -613,6 +616,9 @@ BRIDGE_IMPEXP void GuiMenuClear(int hMenu);
BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection);
BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection);
BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text);
+BRIDGE_IMPEXP void GuiAutoCompleteAddCmd(const char* cmd);
+BRIDGE_IMPEXP void GuiAutoCompleteDelCmd(const char* cmd);
+BRIDGE_IMPEXP void GuiAutoCompleteClearAll();
#ifdef __cplusplus
}
diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp
index 1e3bf2d0..0dd2568a 100644
--- a/x64_dbg_dbg/debugger.cpp
+++ b/x64_dbg_dbg/debugger.cpp
@@ -99,6 +99,22 @@ bool dbgisignoredexception(unsigned int exception)
return false;
}
+bool dbgcmdnew(const char* name, CBCOMMAND cbCommand, bool debugonly)
+{
+ if(!cmdnew(dbggetcommandlist(), name, cbCommand, debugonly))
+ return false;
+ GuiAutoCompleteAddCmd(name);
+ return true;
+}
+
+bool dbgcmddel(const char* name)
+{
+ if(!cmddel(dbggetcommandlist(), name))
+ return false;
+ GuiAutoCompleteDelCmd(name);
+ return true;
+}
+
void DebugUpdateGui(uint disasm_addr, bool stack)
{
uint cip=GetContextData(UE_CIP);
diff --git a/x64_dbg_dbg/debugger.h b/x64_dbg_dbg/debugger.h
index a0d28ed1..608dfdb4 100644
--- a/x64_dbg_dbg/debugger.h
+++ b/x64_dbg_dbg/debugger.h
@@ -29,6 +29,9 @@ void dbgsetskipexceptions(bool skip);
void dbgclearignoredexceptions();
void dbgaddignoredexception(ExceptionRange range);
bool dbgisignoredexception(unsigned int exception);
+bool dbgcmdnew(const char* name, CBCOMMAND cbCommand, bool debugonly);
+bool dbgcmddel(const char* name);
+
//callbacks
CMDRESULT cbDebugInit(int argc, char* argv[]);
CMDRESULT cbStopDebug(int argc, char* argv[]);
diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp
index d9974921..fc337bdd 100644
--- a/x64_dbg_dbg/plugin_loader.cpp
+++ b/x64_dbg_dbg/plugin_loader.cpp
@@ -1,6 +1,6 @@
#include "plugin_loader.h"
#include "console.h"
-#include "command.h"
+#include "debugger.h"
#include "x64_dbg.h"
static std::vector pluginList;
@@ -105,7 +105,7 @@ static void plugincmdunregisterall(int pluginHandle)
{
if(pluginCommandList.at(i).pluginHandle==pluginHandle)
{
- cmddel(dbggetcommandlist(), pluginCommandList.at(i).command);
+ dbgcmddel(pluginCommandList.at(i).command);
pluginCommandList.erase(pluginCommandList.begin()+i);
}
}
@@ -172,7 +172,7 @@ bool plugincmdregister(int pluginHandle, const char* command, CBPLUGINCOMMAND cb
PLUG_COMMAND plugCmd;
plugCmd.pluginHandle=pluginHandle;
strcpy(plugCmd.command, command);
- if(!cmdnew(dbggetcommandlist(), command, (CBCOMMAND)cbCommand, debugonly))
+ if(!dbgcmdnew(command, (CBCOMMAND)cbCommand, debugonly))
return false;
pluginCommandList.push_back(plugCmd);
dprintf("[PLUGIN] command \"%s\" registered!\n", command);
@@ -188,7 +188,7 @@ bool plugincmdunregister(int pluginHandle, const char* command)
{
if(pluginCommandList.at(i).pluginHandle==pluginHandle and !strcmp(pluginCommandList.at(i).command, command))
{
- if(!cmddel(dbggetcommandlist(), command))
+ if(!dbgcmddel(command))
return false;
pluginCommandList.erase(pluginCommandList.begin()+i);
dprintf("[PLUGIN] command \"%s\" unregistered!\n", command);
diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp
index 7dd981fa..e71d4f1f 100644
--- a/x64_dbg_dbg/x64_dbg.cpp
+++ b/x64_dbg_dbg/x64_dbg.cpp
@@ -49,108 +49,108 @@ static void registercommands()
COMMAND* cmd=command_list=cmdinit();
//debug control
- cmdnew(cmd, "InitDebug\1init\1initdbg", cbDebugInit, false); //init debugger arg1:exefile,[arg2:commandline]
- cmdnew(cmd, "StopDebug\1stop\1dbgstop", cbStopDebug, true); //stop debugger
- cmdnew(cmd, "AttachDebugger\1attach", cbDebugAttach, false); //attach
- cmdnew(cmd, "DetachDebugger\1detach", cbDebugDetach, true); //detach
- cmdnew(cmd, "run\1go\1r\1g", cbDebugRun, true); //unlock WAITID_RUN
- cmdnew(cmd, "erun\1egun\1er\1eg", cbDebugErun, true); //run + skip first chance exceptions
- cmdnew(cmd, "pause", cbDebugPause, true); //pause debugger
- cmdnew(cmd, "StepInto\1sti", cbDebugStepInto, true); //StepInto
- cmdnew(cmd, "eStepInto\1esti", cbDebugeStepInto, true); //StepInto + skip first chance exceptions
- cmdnew(cmd, "StepOver\1step\1sto\1st", cbDebugStepOver, true); //StepOver
- cmdnew(cmd, "eStepOver\1estep\1esto\1est", cbDebugeStepOver, true); //StepOver + skip first chance exceptions
- cmdnew(cmd, "SingleStep\1sstep\1sst", cbDebugSingleStep, true); //SingleStep arg1:count
- cmdnew(cmd, "eSingleStep\1esstep\1esst", cbDebugeSingleStep, true); //SingleStep arg1:count + skip first chance exceptions
- cmdnew(cmd, "StepOut\1rtr", cbDebugRtr, true); //rtr
- cmdnew(cmd, "eStepOut\1ertr", cbDebugeRtr, true); //rtr + skip first chance exceptions
+ dbgcmdnew("InitDebug\1init\1initdbg", cbDebugInit, false); //init debugger arg1:exefile,[arg2:commandline]
+ dbgcmdnew("StopDebug\1stop\1dbgstop", cbStopDebug, true); //stop debugger
+ dbgcmdnew("AttachDebugger\1attach", cbDebugAttach, false); //attach
+ dbgcmdnew("DetachDebugger\1detach", cbDebugDetach, true); //detach
+ dbgcmdnew("run\1go\1r\1g", cbDebugRun, true); //unlock WAITID_RUN
+ dbgcmdnew("erun\1egun\1er\1eg", cbDebugErun, true); //run + skip first chance exceptions
+ dbgcmdnew("pause", cbDebugPause, true); //pause debugger
+ dbgcmdnew("StepInto\1sti", cbDebugStepInto, true); //StepInto
+ dbgcmdnew("eStepInto\1esti", cbDebugeStepInto, true); //StepInto + skip first chance exceptions
+ dbgcmdnew("StepOver\1step\1sto\1st", cbDebugStepOver, true); //StepOver
+ dbgcmdnew("eStepOver\1estep\1esto\1est", cbDebugeStepOver, true); //StepOver + skip first chance exceptions
+ dbgcmdnew("SingleStep\1sstep\1sst", cbDebugSingleStep, true); //SingleStep arg1:count
+ dbgcmdnew("eSingleStep\1esstep\1esst", cbDebugeSingleStep, true); //SingleStep arg1:count + skip first chance exceptions
+ dbgcmdnew("StepOut\1rtr", cbDebugRtr, true); //rtr
+ dbgcmdnew("eStepOut\1ertr", cbDebugeRtr, true); //rtr + skip first chance exceptions
//breakpoints
- cmdnew(cmd, "bplist", cbDebugBplist, true); //breakpoint list
- cmdnew(cmd, "SetBPXOptions\1bptype", cbDebugSetBPXOptions, false); //breakpoint type
- cmdnew(cmd, "SetBPX\1bp\1bpx", cbDebugSetBPX, true); //breakpoint
- cmdnew(cmd, "DeleteBPX\1bpc\1bc", cbDebugDeleteBPX, true); //breakpoint delete
- cmdnew(cmd, "EnableBPX\1bpe\1be", cbDebugEnableBPX, true); //breakpoint enable
- cmdnew(cmd, "DisableBPX\1bpd\1bd", cbDebugDisableBPX, true); //breakpoint disable
- cmdnew(cmd, "SetHardwareBreakpoint\1bph\1bphws", cbDebugSetHardwareBreakpoint, true); //hardware breakpoint
- cmdnew(cmd, "DeleteHardwareBreakpoint\1bphc\1bphwc", cbDebugDeleteHardwareBreakpoint, true); //delete hardware breakpoint
- cmdnew(cmd, "SetMemoryBPX\1membp\1bpm", cbDebugSetMemoryBpx, true); //SetMemoryBPX
- cmdnew(cmd, "DeleteMemoryBPX\1membpc\1bpmc", cbDebugDeleteMemoryBreakpoint, true); //delete memory breakpoint
+ dbgcmdnew("bplist", cbDebugBplist, true); //breakpoint list
+ dbgcmdnew("SetBPXOptions\1bptype", cbDebugSetBPXOptions, false); //breakpoint type
+ dbgcmdnew("SetBPX\1bp\1bpx", cbDebugSetBPX, true); //breakpoint
+ dbgcmdnew("DeleteBPX\1bpc\1bc", cbDebugDeleteBPX, true); //breakpoint delete
+ dbgcmdnew("EnableBPX\1bpe\1be", cbDebugEnableBPX, true); //breakpoint enable
+ dbgcmdnew("DisableBPX\1bpd\1bd", cbDebugDisableBPX, true); //breakpoint disable
+ dbgcmdnew("SetHardwareBreakpoint\1bph\1bphws", cbDebugSetHardwareBreakpoint, true); //hardware breakpoint
+ dbgcmdnew("DeleteHardwareBreakpoint\1bphc\1bphwc", cbDebugDeleteHardwareBreakpoint, true); //delete hardware breakpoint
+ dbgcmdnew("SetMemoryBPX\1membp\1bpm", cbDebugSetMemoryBpx, true); //SetMemoryBPX
+ dbgcmdnew("DeleteMemoryBPX\1membpc\1bpmc", cbDebugDeleteMemoryBreakpoint, true); //delete memory breakpoint
//variables
- cmdnew(cmd, "varnew\1var", cbInstrVar, false); //make a variable arg1:name,[arg2:value]
- cmdnew(cmd, "vardel", cbInstrVarDel, false); //delete a variable, arg1:variable name
- cmdnew(cmd, "varlist", cbInstrVarList, false); //list variables[arg1:type filter]
- cmdnew(cmd, "mov\1set", cbInstrMov, false); //mov a variable, arg1:dest,arg2:src
+ dbgcmdnew("varnew\1var", cbInstrVar, false); //make a variable arg1:name,[arg2:value]
+ dbgcmdnew("vardel", cbInstrVarDel, false); //delete a variable, arg1:variable name
+ dbgcmdnew("varlist", cbInstrVarList, false); //list variables[arg1:type filter]
+ dbgcmdnew("mov\1set", cbInstrMov, false); //mov a variable, arg1:dest,arg2:src
//misc
- cmdnew(cmd, "strlen\1charcount\1ccount", cbStrLen, false); //get strlen, arg1:string
- cmdnew(cmd, "cls\1lc\1lclr", cbCls, false); //clear the log
- cmdnew(cmd, "chd", cbInstrChd, false); //Change directory
- cmdnew(cmd, "disasm\1dis\1d", cbDebugDisasm, true); //doDisasm
- cmdnew(cmd, "HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger
- cmdnew(cmd, "dump", cbDebugDump, true); //dump at address
- cmdnew(cmd, "sdump", cbDebugStackDump, true); //dump at stack address
+ dbgcmdnew("strlen\1charcount\1ccount", cbStrLen, false); //get strlen, arg1:string
+ dbgcmdnew("cls\1lc\1lclr", cbCls, false); //clear the log
+ dbgcmdnew("chd", cbInstrChd, false); //Change directory
+ dbgcmdnew("disasm\1dis\1d", cbDebugDisasm, true); //doDisasm
+ dbgcmdnew("HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger
+ dbgcmdnew("dump", cbDebugDump, true); //dump at address
+ dbgcmdnew("sdump", cbDebugStackDump, true); //dump at stack address
//user database
- cmdnew(cmd, "cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment
- cmdnew(cmd, "cmtc\1cmtdel\1commentdel", cbInstrCmtdel, true); //delete comment
- cmdnew(cmd, "lbl\1lblset\1labelset", cbInstrLbl, true); //set/edit label
- cmdnew(cmd, "lblc\1lbldel\1labeldel", cbInstrLbldel, true); //delete label
- cmdnew(cmd, "bookmark\1bookmarkset", cbInstrBookmarkSet, true); //set bookmark
- cmdnew(cmd, "bookmarkc\1bookmarkdel", cbInstrBookmarkDel, true); //delete bookmark
- cmdnew(cmd, "savedb\1dbsave", cbSavedb, true); //save program database
- cmdnew(cmd, "loaddb\1dbload", cbLoaddb, true); //load program database
- cmdnew(cmd, "functionadd\1func", cbFunctionAdd, true); //function
- cmdnew(cmd, "functiondel\1funcc", cbFunctionDel, true); //function
+ dbgcmdnew("cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment
+ dbgcmdnew("cmtc\1cmtdel\1commentdel", cbInstrCmtdel, true); //delete comment
+ dbgcmdnew("lbl\1lblset\1labelset", cbInstrLbl, true); //set/edit label
+ dbgcmdnew("lblc\1lbldel\1labeldel", cbInstrLbldel, true); //delete label
+ dbgcmdnew("bookmark\1bookmarkset", cbInstrBookmarkSet, true); //set bookmark
+ dbgcmdnew("bookmarkc\1bookmarkdel", cbInstrBookmarkDel, true); //delete bookmark
+ dbgcmdnew("savedb\1dbsave", cbSavedb, true); //save program database
+ dbgcmdnew("loaddb\1dbload", cbLoaddb, true); //load program database
+ dbgcmdnew("functionadd\1func", cbFunctionAdd, true); //function
+ dbgcmdnew("functiondel\1funcc", cbFunctionDel, true); //function
//memory operations
- cmdnew(cmd, "alloc", cbDebugAlloc, true); //allocate memory
- cmdnew(cmd, "free", cbDebugFree, true); //free memory
- cmdnew(cmd, "Fill\1memset", cbDebugMemset, true); //memset
+ dbgcmdnew("alloc", cbDebugAlloc, true); //allocate memory
+ dbgcmdnew("free", cbDebugFree, true); //free memory
+ dbgcmdnew("Fill\1memset", cbDebugMemset, true); //memset
//plugins
- cmdnew(cmd, "StartScylla\1scylla\1imprec", cbStartScylla, false); //start scylla
+ dbgcmdnew("StartScylla\1scylla\1imprec", cbStartScylla, false); //start scylla
//general purpose
- cmdnew(cmd, "cmp", cbInstrCmp, false); //compare
- cmdnew(cmd, "gpa", cbInstrGpa, true);
- cmdnew(cmd, "add", cbInstrAdd, false);
- cmdnew(cmd, "and", cbInstrAnd, false);
- cmdnew(cmd, "dec", cbInstrDec, false);
- cmdnew(cmd, "div", cbInstrDiv, false);
- cmdnew(cmd, "inc", cbInstrInc, false);
- cmdnew(cmd, "mul", cbInstrMul, false);
- cmdnew(cmd, "neg", cbInstrNeg, false);
- cmdnew(cmd, "not", cbInstrNot, false);
- cmdnew(cmd, "or", cbInstrOr, false);
- cmdnew(cmd, "rol", cbInstrRol, false);
- cmdnew(cmd, "ror", cbInstrRor, false);
- cmdnew(cmd, "shl", cbInstrShl, false);
- cmdnew(cmd, "shr", cbInstrShr, false);
- cmdnew(cmd, "sub", cbInstrSub, false);
- cmdnew(cmd, "test", cbInstrTest, false);
- cmdnew(cmd, "xor", cbInstrXor, false);
+ dbgcmdnew("cmp", cbInstrCmp, false); //compare
+ dbgcmdnew("gpa", cbInstrGpa, true);
+ dbgcmdnew("add", cbInstrAdd, false);
+ dbgcmdnew("and", cbInstrAnd, false);
+ dbgcmdnew("dec", cbInstrDec, false);
+ dbgcmdnew("div", cbInstrDiv, false);
+ dbgcmdnew("inc", cbInstrInc, false);
+ dbgcmdnew("mul", cbInstrMul, false);
+ dbgcmdnew("neg", cbInstrNeg, false);
+ dbgcmdnew("not", cbInstrNot, false);
+ dbgcmdnew("or", cbInstrOr, false);
+ dbgcmdnew("rol", cbInstrRol, false);
+ dbgcmdnew("ror", cbInstrRor, false);
+ dbgcmdnew("shl", cbInstrShl, false);
+ dbgcmdnew("shr", cbInstrShr, false);
+ dbgcmdnew("sub", cbInstrSub, false);
+ dbgcmdnew("test", cbInstrTest, false);
+ dbgcmdnew("xor", cbInstrXor, false);
//script
- cmdnew(cmd, "scriptload", cbScriptLoad, false);
- cmdnew(cmd, "msg", cbScriptMsg, false);
- cmdnew(cmd, "msgyn", cbScriptMsgyn, false);
+ dbgcmdnew("scriptload", cbScriptLoad, false);
+ dbgcmdnew("msg", cbScriptMsg, false);
+ dbgcmdnew("msgyn", cbScriptMsgyn, false);
//data
- cmdnew(cmd, "reffind\1findref\1ref", cbInstrRefFind, true);
- cmdnew(cmd, "refstr\1strref", cbInstrRefStr, true);
- cmdnew(cmd, "find", cbInstrFind, true); //find a pattern
+ dbgcmdnew("reffind\1findref\1ref", cbInstrRefFind, true);
+ dbgcmdnew("refstr\1strref", cbInstrRefStr, true);
+ dbgcmdnew("find", cbInstrFind, true); //find a pattern
//undocumented
- cmdnew(cmd, "bench", cbBenchmark, true); //benchmark test (readmem etc)
- cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test
- cmdnew(cmd, "asm", cbAssemble, true); //assemble instruction
- cmdnew(cmd, "dprintf", cbPrintf, false); //printf
- cmdnew(cmd, "refinit", cbInstrRefinit, false);
- cmdnew(cmd, "refadd", cbInstrRefadd, false);
- cmdnew(cmd, "setstr\1strset", cbInstrSetstr, false); //set a string variable
- cmdnew(cmd, "getstr\1strget", cbInstrGetstr, false); //get a string variable
+ dbgcmdnew("bench", cbBenchmark, true); //benchmark test (readmem etc)
+ dbgcmdnew("memwrite", cbMemWrite, true); //memwrite test
+ dbgcmdnew("asm", cbAssemble, true); //assemble instruction
+ dbgcmdnew("dprintf", cbPrintf, false); //printf
+ dbgcmdnew("refinit", cbInstrRefinit, false);
+ dbgcmdnew("refadd", cbInstrRefadd, false);
+ dbgcmdnew("setstr\1strset", cbInstrSetstr, false); //set a string variable
+ dbgcmdnew("getstr\1strget", cbInstrGetstr, false); //get a string variable
}
static bool cbCommandProvider(char* cmd, int maxlen)
diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro
index f94b121c..cb37f955 100644
--- a/x64_dbg_gui/Project/DebuggerX64.pro
+++ b/x64_dbg_gui/Project/DebuggerX64.pro
@@ -62,7 +62,9 @@ SOURCES += \
Src/Gui/ExceptionRangeDialog.cpp \
Src/BasicView/RichTextPainter.cpp \
Src/Gui/TabBar.cpp \
- Src/Gui/TabWidget.cpp
+ Src/Gui/TabWidget.cpp \
+ Src/BasicView/CommandHelpView.cpp \
+ Src/BasicView/HistoryLineEdit.cpp
HEADERS += \
@@ -105,7 +107,9 @@ HEADERS += \
Src/Gui/ExceptionRangeDialog.h \
Src/BasicView/RichTextPainter.h \
Src/Gui/TabBar.h \
- Src/Gui/TabWidget.h
+ Src/Gui/TabWidget.h \
+ Src/BasicView/CommandHelpView.h \
+ Src/BasicView/HistoryLineEdit.h
INCLUDEPATH += \
@@ -130,7 +134,8 @@ FORMS += \
Src/BasicView/SymbolView.ui \
Src/BasicView/SearchListView.ui \
Src/Gui/SettingsDialog.ui \
- Src/Gui/ExceptionRangeDialog.ui
+ Src/Gui/ExceptionRangeDialog.ui \
+ Src/BasicView/CommandHelpView.ui
INCLUDEPATH += $$PWD/Src/Bridge
diff --git a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp
new file mode 100644
index 00000000..b37b4384
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp
@@ -0,0 +1,51 @@
+#include "HistoryLineEdit.h"
+
+HistoryLineEdit::HistoryLineEdit(QWidget *parent) : QLineEdit(parent)
+{
+ mCmdHistory.clear();
+ mCmdIndex = -1;
+}
+
+void HistoryLineEdit::addLineToHistory(QString parLine)
+{
+ mCmdHistory.prepend(parLine);
+
+ if(mCmdHistory.size() > 32)
+ mCmdHistory.removeLast();
+
+ mCmdIndex = -1;
+}
+
+void HistoryLineEdit::keyPressEvent(QKeyEvent* event)
+{
+ int wKey = event->key();
+
+ if(wKey == Qt::Key_Up || wKey == Qt::Key_Down)
+ {
+ if(wKey == Qt::Key_Up)
+ mCmdIndex++;
+ else if(wKey == Qt::Key_Down)
+ mCmdIndex--;
+
+ mCmdIndex = mCmdIndex < -1 ? -1 : mCmdIndex;
+ mCmdIndex = mCmdIndex > mCmdHistory.size() - 1 ? mCmdHistory.size() - 1 : mCmdIndex;
+
+ if(mCmdIndex == -1)
+ {
+ setText("");
+ }
+ else
+ {
+ setText(mCmdHistory.at(mCmdIndex));
+ }
+ }
+
+ QLineEdit::keyPressEvent(event);
+}
+
+void HistoryLineEdit::setFocus()
+{
+ mCmdIndex = -1;
+ QLineEdit::setFocus();
+}
+
diff --git a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h
new file mode 100644
index 00000000..7ef9485a
--- /dev/null
+++ b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h
@@ -0,0 +1,29 @@
+#ifndef HISTORYLINEEDIT_H
+#define HISTORYLINEEDIT_H
+
+#include
+#include
+#include
+
+class HistoryLineEdit : public QLineEdit
+{
+ Q_OBJECT
+public:
+ explicit HistoryLineEdit(QWidget *parent = 0);
+ void keyPressEvent(QKeyEvent* event);
+ void addLineToHistory(QString parLine);
+ void setFocus();
+
+signals:
+ void keyPressed(int parKey);
+
+public slots:
+
+
+private:
+ QList mCmdHistory;
+ int mCmdIndex;
+
+};
+
+#endif // HISTORYLINEEDIT_H
diff --git a/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp b/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp
index 5507f7a3..9e753328 100644
--- a/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp
@@ -30,5 +30,16 @@ void InfoBox::setInfoLine(int line, QString text)
void InfoBox::disasmSelectionChanged(int_t parVA)
{
+ char label[MAX_LABEL_SIZE]="";
+ QString info="";
+ if(DbgGetLabelAt(parVA, SEG_DEFAULT, label))
+ {
+ QString fullLabel="<"+QString(label)+">";
+ char mod[MAX_MODULE_SIZE]="";
+ if(DbgGetModuleAt(parVA, mod))
+ fullLabel="<"+QString(mod)+"."+QString(label)+">";
+ info=QString("%1").arg(parVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper() + " " + fullLabel;
+ }
+ setInfoLine(2, info);
//setInfoLine(0, QString("%1").arg(parVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper());
}
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
index 751e3daf..61b113af 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
@@ -280,6 +280,12 @@ bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection)
while(!hasBridgeResult) //wait for thread completion
Sleep(100);
mBridgeMutex.unlock();
+ if(selection->start > selection->end) //swap start and end
+ {
+ int_t temp=selection->end;
+ selection->end=selection->start;
+ selection->start=temp;
+ }
return true;
}
@@ -321,6 +327,21 @@ bool Bridge::emitGetStrWindow(const QString title, QString* text)
return bridgeResult;
}
+void Bridge::emitAutoCompleteAddCmd(const QString cmd)
+{
+ emit autoCompleteAddCmd(cmd);
+}
+
+void Bridge::emitAutoCompleteDelCmd(const QString cmd)
+{
+ emit autoCompleteDelCmd(cmd);
+}
+
+void Bridge::emitAutoCompleteClearAll()
+{
+ emit autoCompleteClearAll();
+}
+
/************************************************************************************
Static Functions
************************************************************************************/
@@ -640,6 +661,24 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
}
break;
+ case GUI_AUTOCOMPLETE_ADDCMD:
+ {
+ Bridge::getBridge()->emitAutoCompleteAddCmd(QString((const char*)param1));
+ }
+ break;
+
+ case GUI_AUTOCOMPLETE_DELCMD:
+ {
+ Bridge::getBridge()->emitAutoCompleteDelCmd(QString((const char*)param1));
+ }
+ break;
+
+ case GUI_AUTOCOMPLETE_CLEARALL:
+ {
+ Bridge::getBridge()->emitAutoCompleteClearAll();
+ }
+ break;
+
default:
{
}
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
index 4df8b0bd..2a5ccaff 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
@@ -70,6 +70,9 @@ public:
bool emitSelectionGet(int hWindow, SELECTIONDATA* selection);
bool emitSelectionSet(int hWindow, const SELECTIONDATA* selection);
bool emitGetStrWindow(const QString title, QString* text);
+ void emitAutoCompleteAddCmd(const QString cmd);
+ void emitAutoCompleteDelCmd(const QString cmd);
+ void emitAutoCompleteClearAll();
//Public variables
void* winId;
@@ -122,6 +125,9 @@ signals:
void selectionStackGet(SELECTIONDATA* selection);
void selectionStackSet(const SELECTIONDATA* selection);
void getStrWindow(const QString title, QString* text);
+ void autoCompleteAddCmd(const QString cmd);
+ void autoCompleteDelCmd(const QString cmd);
+ void autoCompleteClearAll();
private:
QMutex mBridgeMutex;
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
index 783dc02e..3a94a805 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp
@@ -7,6 +7,8 @@ CPUDisassembly::CPUDisassembly(QWidget *parent) : Disassembly(parent)
connect(Bridge::getBridge(), SIGNAL(selectionDisasmGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*)));
connect(Bridge::getBridge(), SIGNAL(selectionDisasmSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*)));
+
+ mGoto = 0;
}
void CPUDisassembly::mousePressEvent(QMouseEvent* event)
@@ -631,10 +633,11 @@ void CPUDisassembly::gotoExpression()
{
if(!DbgIsDebugging())
return;
- GotoDialog mGoto(this);
- if(mGoto.exec()==QDialog::Accepted)
+ if(!mGoto)
+ mGoto = new GotoDialog(this);
+ if(mGoto->exec()==QDialog::Accepted)
{
- DbgCmdExec(QString().sprintf("disasm \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData());
+ DbgCmdExec(QString().sprintf("disasm \"%s\"", mGoto->expressionText.toUtf8().constData()).toUtf8().constData());
}
}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
index 1ae13df7..606cb107 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h
@@ -87,6 +87,8 @@ private:
QAction* mReferenceSelectedAddress;
QAction* mSearchConstant;
QAction* mSearchStrings;
+
+ GotoDialog* mGoto;
};
#endif // CPUDISASSEMBLY_H
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
index 52ee5884..b7799d90 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp
@@ -9,6 +9,8 @@ CPUDump::CPUDump(QWidget *parent) : HexDump(parent)
connect(Bridge::getBridge(), SIGNAL(selectionDumpSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*)));
setupContextMenu();
+
+ mGoto = 0;
}
void CPUDump::setupContextMenu()
@@ -168,12 +170,13 @@ void CPUDump::gotoExpressionSlot()
{
if(!DbgIsDebugging())
return;
- GotoDialog mGoto(this);
- mGoto.setWindowTitle("Enter expression to follow in Dump...");
- if(mGoto.exec()==QDialog::Accepted)
+ if(!mGoto)
+ mGoto = new GotoDialog(this);
+ mGoto->setWindowTitle("Enter expression to follow in Dump...");
+ if(mGoto->exec()==QDialog::Accepted)
{
QString cmd;
- DbgCmdExec(cmd.sprintf("dump \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData());
+ DbgCmdExec(cmd.sprintf("dump \"%s\"", mGoto->expressionText.toUtf8().constData()).toUtf8().constData());
}
}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.h b/x64_dbg_gui/Project/Src/Gui/CPUDump.h
index 80f07a0e..a617d3c1 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUDump.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.h
@@ -87,6 +87,8 @@ private:
QMenu* mSpecialMenu;
QMenu* mCustomMenu;
+
+ GotoDialog* mGoto;
};
#endif // CPUDUMP_H
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
index 92af0299..f4eda7d4 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp
@@ -30,6 +30,8 @@ CPUStack::CPUStack(QWidget *parent) : HexDump(parent)
connect(Bridge::getBridge(), SIGNAL(selectionStackSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*)));
setupContextMenu();
+
+ mGoto = 0;
}
void CPUStack::setupContextMenu()
@@ -187,14 +189,15 @@ void CPUStack::gotoExpressionSlot()
return;
uint_t size=0;
uint_t base=DbgMemFindBaseAddr(mCsp, &size);
- GotoDialog mGoto(this);
- mGoto.validRangeStart=base;
- mGoto.validRangeEnd=base+size;
- mGoto.setWindowTitle("Enter expression to follow in Stack...");
- if(mGoto.exec()==QDialog::Accepted)
+ if(!mGoto)
+ mGoto = new GotoDialog(this);
+ mGoto->validRangeStart=base;
+ mGoto->validRangeEnd=base+size;
+ mGoto->setWindowTitle("Enter expression to follow in Stack...");
+ if(mGoto->exec()==QDialog::Accepted)
{
QString cmd;
- DbgCmdExec(cmd.sprintf("sdump \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData());
+ DbgCmdExec(cmd.sprintf("sdump \"%s\"", mGoto->expressionText.toUtf8().constData()).toUtf8().constData());
}
}
diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.h b/x64_dbg_gui/Project/Src/Gui/CPUStack.h
index a6596d2a..fb4b5b40 100644
--- a/x64_dbg_gui/Project/Src/Gui/CPUStack.h
+++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.h
@@ -40,6 +40,8 @@ private:
QAction* mFollowDisasm;
QAction* mFollowDump;
QAction* mFollowStack;
+
+ GotoDialog* mGoto;
};
#endif // CPUSTACK_H
diff --git a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp
index 0ad08b16..86afea24 100644
--- a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp
@@ -1,55 +1,40 @@
#include "CommandLineEdit.h"
-CommandLineEdit::CommandLineEdit(QWidget *parent) : QLineEdit(parent)
+CommandLineEdit::CommandLineEdit(QWidget *parent) : HistoryLineEdit(parent)
{
- mCmdHistory.clear();
- mCmdIndex = -1;
+ //Initialize QCompleter
+ mCompleter = new QCompleter(QStringList(), this);
+ mCompleter->setCaseSensitivity(Qt::CaseInsensitive);
+ mCompleter->setCompletionMode(QCompleter::PopupCompletion);
+ this->setCompleter(mCompleter);
+
+ //Setup signals & slots
+ connect(Bridge::getBridge(), SIGNAL(autoCompleteAddCmd(QString)), this, SLOT(autoCompleteAddCmd(QString)));
+ connect(Bridge::getBridge(), SIGNAL(autoCompleteDelCmd(QString)), this, SLOT(autoCompleteDelCmd(QString)));
+ connect(Bridge::getBridge(), SIGNAL(autoCompleteClearAll()), this, SLOT(autoCompleteClearAll()));
}
-
-void CommandLineEdit::addCmdToHistory(QString parCmd)
+void CommandLineEdit::autoCompleteAddCmd(const QString cmd)
{
- mCmdHistory.prepend(parCmd);
-
- if(mCmdHistory.size() > 32)
- mCmdHistory.removeLast();
-
- mCmdIndex = -1;
+ QStringListModel* model = (QStringListModel*)(mCompleter->model());
+ QStringList stringList = model->stringList();
+ stringList << cmd.split(QChar('\1'), QString::SkipEmptyParts);
+ stringList.removeDuplicates();
+ model->setStringList(stringList);
}
-
-void CommandLineEdit::keyPressEvent(QKeyEvent* event)
+void CommandLineEdit::autoCompleteDelCmd(const QString cmd)
{
- int wKey = event->key();
-
- if(wKey == Qt::Key_Up || wKey == Qt::Key_Down)
- {
- if(wKey == Qt::Key_Up)
- mCmdIndex++;
- else if(wKey == Qt::Key_Down)
- mCmdIndex--;
-
- mCmdIndex = mCmdIndex < -1 ? -1 : mCmdIndex;
- mCmdIndex = mCmdIndex > mCmdHistory.size() - 1 ? mCmdHistory.size() - 1 : mCmdIndex;
-
- if(mCmdIndex == -1)
- {
- setText("");
- }
- else
- {
- setText(mCmdHistory.at(mCmdIndex));
- }
- }
-
- QLineEdit::keyPressEvent(event);
+ QStringListModel* model = (QStringListModel*)(mCompleter->model());
+ QStringList stringList = model->stringList();
+ QStringList deleteList = cmd.split(QChar('\1'), QString::SkipEmptyParts);
+ for(int i=0; isetStringList(stringList);
}
-
-
-void CommandLineEdit::setFocusToCmd()
+void CommandLineEdit::autoCompleteClearAll()
{
- mCmdIndex = -1;
- setFocus();
+ QStringListModel* model = (QStringListModel*)(mCompleter->model());
+ model->setStringList(QStringList());
}
-
diff --git a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h
index de7b702c..44b7d824 100644
--- a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h
+++ b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h
@@ -1,29 +1,22 @@
-#ifndef LINEEDIT_H
-#define LINEEDIT_H
+#ifndef COMMANDLINEEDIT_H
+#define COMMANDLINEEDIT_H
-#include
-#include
-#include
+#include "HistoryLineEdit.h"
+#include "Bridge.h"
-class CommandLineEdit : public QLineEdit
+class CommandLineEdit : public HistoryLineEdit
{
Q_OBJECT
public:
explicit CommandLineEdit(QWidget *parent = 0);
- void keyPressEvent(QKeyEvent* event);
- void addCmdToHistory(QString parCmd);
- void setFocusToCmd();
-
-signals:
- void keyPressed(int parKey);
-
-public slots:
+public slots:
+ void autoCompleteAddCmd(const QString cmd);
+ void autoCompleteDelCmd(const QString cmd);
+ void autoCompleteClearAll();
private:
- QList mCmdHistory;
- int mCmdIndex;
-
+ QCompleter* mCompleter;
};
-#endif // LINEEDIT_H
+#endif // COMMANDLINEEDIT_H
diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp b/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp
index 42e93176..e8d5a9b4 100644
--- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp
@@ -82,3 +82,11 @@ bool GotoDialog::IsValidMemoryRange(uint_t addr)
{
return ((!validRangeStart && !validRangeEnd) || (addr >= validRangeStart && addr < validRangeEnd));
}
+
+void GotoDialog::on_buttonOk_clicked()
+{
+ QString expression = ui->editExpression->text();
+ ui->editExpression->addLineToHistory(expression);
+ ui->editExpression->setText("");
+ expressionText = expression;
+}
diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.h b/x64_dbg_gui/Project/Src/Gui/GotoDialog.h
index 2ffddcfb..f82de572 100644
--- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.h
+++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.h
@@ -23,6 +23,8 @@ public:
private slots:
void on_editExpression_textChanged(const QString &arg1);
+ void on_buttonOk_clicked();
+
private:
Ui::GotoDialog *ui;
bool IsValidMemoryRange(uint_t addr);
diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui b/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui
index d4405c77..77c1c9b6 100644
--- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui
+++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui
@@ -26,7 +26,7 @@
-
-
-
+
-
@@ -75,6 +75,13 @@
+
+
+ HistoryLineEdit
+ QLineEdit
+
+
+
editExpression
buttonOk
diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
index fcd102ff..534e7b9b 100644
--- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
+++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp
@@ -271,7 +271,7 @@ void MainWindow::executeCommand()
DbgCmdExec(wCmd.toUtf8().constData());
- mCmdLineEdit->addCmdToHistory(wCmd);
+ mCmdLineEdit->addLineToHistory(wCmd);
mCmdLineEdit->setText("");
}
@@ -288,7 +288,7 @@ void MainWindow::execStepInto()
void MainWindow::setFocusToCommandBar()
{
- mCmdLineEdit->setFocusToCmd();
+ mCmdLineEdit->setFocus();
}
void MainWindow::execClose()
From a339dd2d2f6395fdf99e02c9d934b7d725580115 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 21 May 2014 01:18:20 +0200
Subject: [PATCH 045/676] BRIDGE: added GuiScriptEnableHighlighting
DBG: removed debug printf
DBG: fixed manifest problems
---
x64_dbg_bridge/bridgemain.cpp | 5 +
x64_dbg_bridge/bridgemain.h | 4 +-
x64_dbg_dbg/debugger.h | 1 +
x64_dbg_dbg/plugin_loader.cpp | 1 -
x64_dbg_dbg/simplescript.cpp | 1 +
x64_dbg_exe/x64_dbg_exe.vcxproj | 6 +
.../Project/Src/BasicView/ScriptView.cpp | 258 +++++++++---------
.../Project/Src/BasicView/ScriptView.h | 2 +
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 11 +
x64_dbg_gui/Project/Src/Bridge/Bridge.h | 2 +
10 files changed, 166 insertions(+), 125 deletions(-)
diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp
index ea427f10..b44b0651 100644
--- a/x64_dbg_bridge/bridgemain.cpp
+++ b/x64_dbg_bridge/bridgemain.cpp
@@ -690,6 +690,11 @@ BRIDGE_IMPEXP int GuiScriptMsgyn(const char* message)
return (int)(duint)_gui_sendmessage(GUI_SCRIPT_MSGYN, (void*)message, 0);
}
+BRIDGE_IMPEXP void GuiScriptEnableHighlighting(bool enable)
+{
+ _gui_sendmessage(GUI_SCRIPT_ENABLEHIGHLIGHTING, (void*)(duint)enable, 0);
+}
+
BRIDGE_IMPEXP void GuiSymbolLogAdd(const char* message)
{
_gui_sendmessage(GUI_SYMBOL_LOG_ADD, (void*)message, 0);
diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h
index 15301402..2a1e1fa9 100644
--- a/x64_dbg_bridge/bridgemain.h
+++ b/x64_dbg_bridge/bridgemain.h
@@ -552,7 +552,8 @@ enum GUIMSG
GUI_GETLINE_WINDOW, // param1=const char* title, param2=char* text
GUI_AUTOCOMPLETE_ADDCMD, // param1=const char* cmd, param2=ununsed
GUI_AUTOCOMPLETE_DELCMD, // param1=const char* cmd, param2=ununsed
- GUI_AUTOCOMPLETE_CLEARALL // param1=ununsed, param2=unused
+ GUI_AUTOCOMPLETE_CLEARALL, // param1=ununsed, param2=unused
+ GUI_SCRIPT_ENABLEHIGHLIGHTING // param1=bool enable, param2=unused
};
//GUI structures
@@ -589,6 +590,7 @@ BRIDGE_IMPEXP void GuiScriptSetTitle(const char* title);
BRIDGE_IMPEXP void GuiScriptSetInfoLine(int line, const char* info);
BRIDGE_IMPEXP void GuiScriptMessage(const char* message);
BRIDGE_IMPEXP int GuiScriptMsgyn(const char* message);
+BRIDGE_IMPEXP void GuiScriptEnableHighlighting(bool enable);
BRIDGE_IMPEXP void GuiSymbolLogAdd(const char* message);
BRIDGE_IMPEXP void GuiSymbolLogClear();
BRIDGE_IMPEXP void GuiSymbolSetProgress(int percent);
diff --git a/x64_dbg_dbg/debugger.h b/x64_dbg_dbg/debugger.h
index 608dfdb4..d5312470 100644
--- a/x64_dbg_dbg/debugger.h
+++ b/x64_dbg_dbg/debugger.h
@@ -68,6 +68,7 @@ CMDRESULT cbDebugAttach(int argc, char* argv[]);
CMDRESULT cbDebugDetach(int argc, char* argv[]);
CMDRESULT cbDebugDump(int argc, char* argv[]);
CMDRESULT cbDebugStackDump(int argc, char* argv[]);
+CMDRESULT cbDebugContinue(int argc, char* argv[]);
//variables
extern PROCESS_INFORMATION* fdProcessInfo;
diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp
index fc337bdd..403d265c 100644
--- a/x64_dbg_dbg/plugin_loader.cpp
+++ b/x64_dbg_dbg/plugin_loader.cpp
@@ -289,7 +289,6 @@ bool pluginmenuclear(int hMenu)
void pluginmenucall(int hEntry)
{
- dprintf("pluginmenucall(%d)\n", hEntry);
if(hEntry==-1)
return;
for(unsigned int i=0; i().swap(scriptbplist); //clear breakpoints
std::vector().swap(scriptstack); //clear script stack
diff --git a/x64_dbg_exe/x64_dbg_exe.vcxproj b/x64_dbg_exe/x64_dbg_exe.vcxproj
index 01b36e61..2ad12bb5 100644
--- a/x64_dbg_exe/x64_dbg_exe.vcxproj
+++ b/x64_dbg_exe/x64_dbg_exe.vcxproj
@@ -47,11 +47,13 @@
$(SolutionDir)bin\x32\
$(Platform)\$(Configuration)\
x32_dbg
+ false
false
$(SolutionDir)bin\x64\
x64_dbg
+ false
@@ -68,6 +70,8 @@
true
$(SolutionDir)bin\x32\x32_bridge.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
$(TargetDir)$(TargetName)_exe.pdb
+
+
@@ -84,6 +88,8 @@
true
$(SolutionDir)bin\x64\x64_bridge.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
$(TargetDir)$(TargetName)_exe.pdb
+
+
diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
index 4dd11ecb..a395805b 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
+++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp
@@ -2,6 +2,7 @@
ScriptView::ScriptView(StdTable *parent) : StdTable(parent)
{
+ mEnableSyntaxHighlighting=false;
enableMultiSelection(false);
int charwidth=QFontMetrics(this->font()).width(QChar(' '));
@@ -20,6 +21,7 @@ ScriptView::ScriptView(StdTable *parent) : StdTable(parent)
connect(Bridge::getBridge(), SIGNAL(scriptSetInfoLine(int,QString)), this, SLOT(setInfoLine(int,QString)));
connect(Bridge::getBridge(), SIGNAL(scriptMessage(QString)), this, SLOT(message(QString)));
connect(Bridge::getBridge(), SIGNAL(scriptQuestion(QString)), this, SLOT(question(QString)));
+ connect(Bridge::getBridge(), SIGNAL(scriptEnableHighlighting(bool)), this, SLOT(enableHighlighting(bool)));
setupContextMenu();
}
@@ -67,38 +69,103 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
case 1: //command
{
- //initialize
- painter->save();
- int charwidth=QFontMetrics(this->font()).width(QChar(' '));
- int xadd=charwidth; //for testing
- QList richText;
- CustomRichText_t newRichText;
- QString command=getCellContent(rowBase+rowOffset, col);
+ if(mEnableSyntaxHighlighting)
+ {
+ //initialize
+ painter->save();
+ int charwidth=QFontMetrics(this->font()).width(QChar(' '));
+ int xadd=charwidth; //for testing
+ QList richText;
+ CustomRichText_t newRichText;
+ QString command=getCellContent(rowBase+rowOffset, col);
- //handle comments
- int comment_idx=command.indexOf("//"); //find the index of the space
- QString comment="";
- if(comment_idx!=-1 && command.at(0)!=QChar('/')) //there is a comment
- {
- comment=command.right(command.length()-comment_idx);
- if(command.at(comment_idx-1)==QChar(' '))
- command.truncate(comment_idx-1);
- else
- command.truncate(comment_idx);
- }
-
- //setup the richText list
- switch(linetype)
- {
- case linecommand:
- {
- if(isScriptCommand(command, "ret"))
+ //handle comments
+ int comment_idx=command.indexOf("//"); //find the index of the space
+ QString comment="";
+ if(comment_idx!=-1 && command.at(0)!=QChar('/')) //there is a comment
{
- newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor("#00FFFF");
- newRichText.text="ret";
+ comment=command.right(command.length()-comment_idx);
+ if(command.at(comment_idx-1)==QChar(' '))
+ command.truncate(comment_idx-1);
+ else
+ command.truncate(comment_idx);
+ }
+
+ //setup the richText list
+ switch(linetype)
+ {
+ case linecommand:
+ {
+ if(isScriptCommand(command, "ret"))
+ {
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor("#00FFFF");
+ newRichText.text="ret";
+ richText.push_back(newRichText);
+ QString remainder=command.right(command.length()-3);
+ if(remainder.length())
+ {
+ newRichText.flags=FlagNone;
+ newRichText.text=remainder;
+ richText.push_back(newRichText);
+ }
+ }
+ else
+ {
+ newRichText.flags=FlagNone;
+ newRichText.text=command;
+ richText.push_back(newRichText);
+ }
+ }
+ break;
+
+ case linebranch:
+ {
+ SCRIPTBRANCH branchinfo;
+ DbgScriptGetBranchInfo(line, &branchinfo);
+ //jumps
+ int i=command.indexOf(" "); //find the index of the space
+ switch(branchinfo.type)
+ {
+ case scriptjmp: //unconditional jumps
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor("#FFFF00");
+ break;
+
+ case scriptjnejnz: //conditional jumps
+ case scriptjejz:
+ case scriptjbjl:
+ case scriptjajg:
+ case scriptjbejle:
+ case scriptjaejge:
+ newRichText.flags=FlagAll;
+ newRichText.textBackground=QColor("#FFFF00");
+ newRichText.textColor=QColor("#FF0000");
+ break;
+
+ case scriptcall: //calls
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor("#00FFFF");
+ break;
+
+ default:
+ newRichText.flags=FlagNone;
+ break;
+ }
+ newRichText.text=command.left(i);
richText.push_back(newRichText);
- QString remainder=command.right(command.length()-3);
+ //space
+ newRichText.flags=FlagNone;
+ newRichText.text=" ";
+ richText.push_back(newRichText);
+ //label
+ QString label=branchinfo.branchlabel;
+ newRichText.flags=FlagBackground;
+ newRichText.textBackground=QColor("#FFFF00");
+ newRichText.text=label;
+ richText.push_back(newRichText);
+ //remainder
+ QString remainder=command.right(command.length()-command.indexOf(label)-label.length());
if(remainder.length())
{
newRichText.flags=FlagNone;
@@ -106,113 +173,53 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset
richText.push_back(newRichText);
}
}
- else
+ break;
+
+ case linelabel:
{
- newRichText.flags=FlagNone;
+ newRichText.flags=FlagColor;
+ newRichText.textColor=QColor("#808080");
+ newRichText.text=command;
+ richText.push_back(newRichText);
+ painter->drawLine(QPoint(x+xadd+2, y+h-2), QPoint(x+w-4, y+h-2));
+ }
+ break;
+
+ case linecomment:
+ {
+ newRichText.flags=FlagColor;
+ newRichText.textColor=QColor("#808080");
newRichText.text=command;
richText.push_back(newRichText);
}
- }
- break;
+ break;
- case linebranch:
- {
- SCRIPTBRANCH branchinfo;
- DbgScriptGetBranchInfo(line, &branchinfo);
- //jumps
- int i=command.indexOf(" "); //find the index of the space
- switch(branchinfo.type)
+ case lineempty:
{
- case scriptjmp: //unconditional jumps
- newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor("#FFFF00");
- break;
-
- case scriptjnejnz: //conditional jumps
- case scriptjejz:
- case scriptjbjl:
- case scriptjajg:
- case scriptjbejle:
- case scriptjaejge:
- newRichText.flags=FlagAll;
- newRichText.textBackground=QColor("#FFFF00");
- newRichText.textColor=QColor("#FF0000");
- break;
-
- case scriptcall: //calls
- newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor("#00FFFF");
- break;
-
- default:
- newRichText.flags=FlagNone;
+ }
break;
}
- newRichText.text=command.left(i);
- richText.push_back(newRichText);
- //space
- newRichText.flags=FlagNone;
- newRichText.text=" ";
- richText.push_back(newRichText);
- //label
- QString label=branchinfo.branchlabel;
- newRichText.flags=FlagBackground;
- newRichText.textBackground=QColor("#FFFF00");
- newRichText.text=label;
- richText.push_back(newRichText);
- //remainder
- QString remainder=command.right(command.length()-command.indexOf(label)-label.length());
- if(remainder.length())
+
+ //append the comment (when present)
+ if(comment.length())
{
+ CustomRichText_t newRichText;
newRichText.flags=FlagNone;
- newRichText.text=remainder;
- richText.push_back(newRichText);
+ newRichText.text=" ";
+ richText.push_back(newRichText); //space
+ newRichText.flags=FlagColor;
+ newRichText.textColor=QColor("#808080");
+ newRichText.text=comment;
+ richText.push_back(newRichText); //comment
}
- }
- break;
- case linelabel:
- {
- newRichText.flags=FlagColor;
- newRichText.textColor=QColor("#808080");
- newRichText.text=command;
- richText.push_back(newRichText);
- painter->drawLine(QPoint(x+xadd+2, y+h-2), QPoint(x+w-4, y+h-2));
+ //paint the rich text
+ RichTextPainter::paintRichText(painter, x+1, y, w, h, xadd, &richText, charwidth);
+ painter->restore();
+ returnString="";
}
- break;
-
- case linecomment:
- {
- newRichText.flags=FlagColor;
- newRichText.textColor=QColor("#808080");
- newRichText.text=command;
- richText.push_back(newRichText);
- }
- break;
-
- case lineempty:
- {
- }
- break;
- }
-
- //append the comment (when present)
- if(comment.length())
- {
- CustomRichText_t newRichText;
- newRichText.flags=FlagNone;
- newRichText.text=" ";
- richText.push_back(newRichText); //space
- newRichText.flags=FlagColor;
- newRichText.textColor=QColor("#808080");
- newRichText.text=comment;
- richText.push_back(newRichText); //comment
- }
-
- //paint the rich text
- RichTextPainter::paintRichText(painter, x+1, y, w, h, xadd, &richText, charwidth);
- painter->restore();
- returnString="";
+ else //no syntax highlighting
+ returnString=getCellContent(rowBase+rowOffset, col);
}
break;
@@ -529,3 +536,8 @@ void ScriptView::question(QString message)
else
Bridge::getBridge()->BridgeSetResult(0);
}
+
+void ScriptView::enableHighlighting(bool enable)
+{
+ mEnableSyntaxHighlighting=enable;
+}
diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h
index a045bba6..96ea577d 100644
--- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h
+++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h
@@ -40,6 +40,7 @@ public slots:
void message(QString message);
void newIp();
void question(QString message);
+ void enableHighlighting(bool enable);
private:
//private functions
@@ -49,6 +50,7 @@ private:
//private variables
int mIpLine;
+ bool mEnableSyntaxHighlighting;
QMenu* mLoadMenu;
QAction* mScriptLoad;
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
index 61b113af..af36154e 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
@@ -139,6 +139,11 @@ int Bridge::emitScriptQuestion(QString message)
return bridgeResult;
}
+void Bridge::emitScriptEnableHighlighting(bool enable)
+{
+ emit scriptEnableHighlighting(enable);
+}
+
void Bridge::emitUpdateSymbolList(int module_count, SYMBOLMODULEINFO* modules)
{
emit updateSymbolList(module_count, modules);
@@ -475,6 +480,12 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
}
break;
+ case GUI_SCRIPT_ENABLEHIGHLIGHTING:
+ {
+ Bridge::getBridge()->emitScriptEnableHighlighting((bool)(int_t)param1);
+ }
+ break;
+
case GUI_SYMBOL_UPDATE_MODULE_LIST:
{
Bridge::getBridge()->emitUpdateSymbolList((int)(int_t)param1, (SYMBOLMODULEINFO*)param2);
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
index 2a5ccaff..b4be3915 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h
@@ -46,6 +46,7 @@ public:
void emitScriptSetInfoLine(int line, QString info);
void emitScriptMessage(QString message);
int emitScriptQuestion(QString message);
+ void emitScriptEnableHighlighting(bool enable);
void emitUpdateSymbolList(int module_count, SYMBOLMODULEINFO* modules);
void emitAddMsgToSymbolLog(QString msg);
void emitClearSymbolLog();
@@ -97,6 +98,7 @@ signals:
void scriptSetInfoLine(int line, QString info);
void scriptMessage(QString message);
void scriptQuestion(QString message);
+ void scriptEnableHighlighting(bool enable);
void updateSymbolList(int module_count, SYMBOLMODULEINFO* modules);
void addMsgToSymbolLog(QString msg);
void clearSymbolLog();
From eabf2e293e36c969fc5aa8f14c37e02baff176d9 Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Wed, 21 May 2014 02:22:14 +0200
Subject: [PATCH 046/676] GUI: fixed bugs in GuiSelectionGet & GuiSelectionSet
(thanks to ahmadmansoor for finding)
---
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
index af36154e..3766ad5f 100644
--- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
+++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp
@@ -648,13 +648,13 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa
case GUI_SELECTION_GET:
{
- Bridge::getBridge()->emitSelectionGet((int)(uint_t)param1, (SELECTIONDATA*)param2);
+ return (void*)(int_t)Bridge::getBridge()->emitSelectionGet((int)(uint_t)param1, (SELECTIONDATA*)param2);
}
break;
case GUI_SELECTION_SET:
{
- Bridge::getBridge()->emitSelectionSet((int)(uint_t)param1, (const SELECTIONDATA*)param2);
+ return (void*)(int_t)Bridge::getBridge()->emitSelectionSet((int)(uint_t)param1, (const SELECTIONDATA*)param2);
}
break;
From 4ef078d463cd8f24924a1aa30cafe3b1fe5b0e8a Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Sat, 24 May 2014 02:05:36 +0200
Subject: [PATCH 047/676] resolved issue #105 (commandline support)
---
x64_dbg_dbg/x64_dbg.cpp | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp
index e71d4f1f..7c3406e4 100644
--- a/x64_dbg_dbg/x64_dbg.cpp
+++ b/x64_dbg_dbg/x64_dbg.cpp
@@ -18,6 +18,31 @@
static MESSAGE_STACK* gMsgStack=0;
static COMMAND* command_list=0;
+//Original code by Aurel from http://www.codeguru.com/cpp/w-p/win32/article.php/c1427/A-Simple-Win32-CommandLine-Parser.htm
+static void commandlinefree(int argc, char** argv)
+{
+ for(int i=0; i1) //we have an argument
+ {
+ std::string str="init \"";
+ str+=argv[1];
+ str+="\"";
+ DbgCmdExec(str.c_str());
+ }
+ commandlinefree(argc, argv);
return 0;
}
From 4d5a8f37491e3f59edbb541626f05828efe70e9d Mon Sep 17 00:00:00 2001
From: "Mr. eXoDia"
Date: Mon, 26 May 2014 15:40:14 +0200
Subject: [PATCH 048/676] DBG: fixed a nasty bug in modbasefromname (thanks
Artic!)
DBG: added draft of loop display
GUI: simple status bar API
---
help/Special_Thanks.htm | 4 +-
readme.txt | 1 +
x64_dbg_bridge/bridgemain.cpp | 53 ++++------
x64_dbg_bridge/bridgemain.h | 21 +++-
x64_dbg_dbg/_exports.cpp | 5 +
x64_dbg_dbg/addrinfo.cpp | 101 ++++++++++++++++++--
x64_dbg_dbg/addrinfo.h | 4 +
x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 11 +++
x64_dbg_gui/Project/Src/Bridge/Bridge.h | 2 +
x64_dbg_gui/Project/Src/Gui/StatusLabel.cpp | 3 +
10 files changed, 156 insertions(+), 49 deletions(-)
diff --git a/help/Special_Thanks.htm b/help/Special_Thanks.htm
index 6835ed0c..9afffc79 100644
--- a/help/Special_Thanks.htm
+++ b/help/Special_Thanks.htm
@@ -52,5 +52,7 @@ Rogers