DBG: added bplist

DBG: added bookmark
GUI: many improbments
This commit is contained in:
mr.exodia 2013-11-20 22:28:20 +01:00
parent c15726cf2c
commit 4c2f73518a
27 changed files with 617 additions and 67 deletions

View File

@ -29,3 +29,4 @@ DBGBPGETTYPEAT _dbg_bpgettypeat;
DBGGETREGDUMP _dbg_getregdump;
DBGVALTOSTRING _dbg_valtostring;
DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr;
DBGGETBPLIST _dbg_getbplist;

View File

@ -61,6 +61,7 @@ typedef BPXTYPE (*DBGBPGETTYPEAT)(duint addr);
typedef bool (*DBGGETREGDUMP)(REGDUMP* regdump);
typedef bool (*DBGVALTOSTRING)(const char* string, duint* value);
typedef bool (*DBGMEMISVALIDREADPTR)(duint addr);
typedef int (*DBGGETBPLIST)(BPXTYPE type, BPMAP* bplist);
//DBG functions
extern DBGDBGINIT _dbg_dbginit;
@ -78,5 +79,6 @@ extern DBGBPGETTYPEAT _dbg_bpgettypeat;
extern DBGGETREGDUMP _dbg_getregdump;
extern DBGVALTOSTRING _dbg_valtostring;
extern DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr;
extern DBGGETBPLIST _dbg_getbplist;
#endif // _GLOBAL_H

View File

@ -123,6 +123,10 @@ DLL_IMPEXP const char* BridgeInit()
_dbg_memisvalidreadptr=(DBGMEMISVALIDREADPTR)GetProcAddress(hInstDbg, "_dbg_memisvalidreadptr");
if(!_dbg_memisvalidreadptr)
return "Export \"_dbg_memisvalidreadptr\" could not be found!";
//_dbg_getbplist
_dbg_getbplist=(DBGGETBPLIST)GetProcAddress(hInstDbg, "_dbg_getbplist");
if(!_dbg_getbplist)
return "Export \"_dbg_getbplist\" could not be found!";
return 0;
}
@ -313,6 +317,29 @@ DLL_IMPEXP bool DbgGetModuleAt(duint addr, char* text)
return true;
}
DLL_IMPEXP bool DbgGetBookmarkAt(duint addr)
{
if(!addr)
return false;
ADDRINFO info;
memset(&info, 0, sizeof(info));
info.flags=flagbookmark;
if(!_dbg_addrinfoget(addr, SEG_DEFAULT, &info))
return false;
return info.isbookmark;
}
DLL_IMPEXP bool DbgSetBookmarkAt(duint addr, bool isbookmark)
{
if(!addr)
return false;
ADDRINFO info;
memset(&info, 0, sizeof(info));
info.flags=flagbookmark;
info.isbookmark=isbookmark;
return _dbg_addrinfoset(addr, &info);
}
DLL_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr)
{
return _dbg_bpgettypeat(addr);
@ -341,6 +368,11 @@ DLL_IMPEXP bool DbgMemIsValidReadPtr(duint addr)
return _dbg_memisvalidreadptr(addr);
}
DLL_IMPEXP int DbgGetBpList(BPXTYPE type, BPMAP* list)
{
return _dbg_getbplist(type, list);
}
//GUI
DLL_IMPEXP void GuiDisasmAt(duint addr, duint cip)
{

View File

@ -41,6 +41,7 @@ DLL_IMPEXP bool BridgeSettingSetUint(const char* section, const char* key, duint
#define MAX_LABEL_SIZE 256
#define MAX_COMMENT_SIZE 256
#define MAX_MODULE_SIZE 256
#define MAX_BREAKPOINT_SIZE 256
//Debugger enums
enum DBGSTATE
@ -66,7 +67,8 @@ enum ADDRINFOFLAGS
{
flagmodule=1,
flaglabel=2,
flagcomment=4
flagcomment=4,
flagbookmark=8
};
enum BPXTYPE
@ -90,11 +92,28 @@ struct MEMMAP
MEMPAGE* page;
};
struct BRIDGEBP
{
BPXTYPE type;
duint addr;
bool enabled;
bool singleshoot;
char name[MAX_BREAKPOINT_SIZE];
char mod[MAX_MODULE_SIZE];
};
struct BPMAP
{
int count;
BRIDGEBP* bp;
};
struct ADDRINFO
{
char module[MAX_MODULE_SIZE]; //module the address is in
char label[MAX_LABEL_SIZE];
char comment[MAX_COMMENT_SIZE];
bool isbookmark;
int flags; //ADDRINFOFLAGS
};
@ -162,12 +181,15 @@ DLL_IMPEXP bool DbgGetLabelAt(duint addr, SEGMENTREG segment, char* text);
DLL_IMPEXP bool DbgSetLabelAt(duint addr, const char* text);
DLL_IMPEXP bool DbgGetCommentAt(duint addr, char* text);
DLL_IMPEXP bool DbgSetCommentAt(duint addr, const char* text);
DLL_IMPEXP bool DbgGetBookmarkAt(duint addr);
DLL_IMPEXP bool DbgSetBookmarkAt(duint addr, bool isbookmark);
DLL_IMPEXP bool DbgGetModuleAt(duint addr, char* text);
DLL_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr);
DLL_IMPEXP duint DbgValFromString(const char* string);
DLL_IMPEXP bool DbgGetRegDump(REGDUMP* regdump);
DLL_IMPEXP bool DbgValToString(const char* string, duint value);
DLL_IMPEXP bool DbgMemIsValidReadPtr(duint addr);
DLL_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr);
//GUI functions
DLL_IMPEXP void GuiDisasmAt(duint addr, duint cip);

View File

@ -161,6 +161,11 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
}
}
}
if(addrinfo->flags&flagbookmark)
{
addrinfo->isbookmark=bookmarkget(addr);
retval=true;
}
return retval;
}
@ -172,11 +177,18 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoset(duint addr, ADDRINFO* addrinfo)
if(labelset(addr, addrinfo->label))
retval=true;
}
else if(addrinfo->flags&flagcomment) //set comment
if(addrinfo->flags&flagcomment) //set comment
{
if(commentset(addr, addrinfo->comment))
retval=true;
}
if(addrinfo->flags&flagbookmark) //set bookmark
{
if(addrinfo->isbookmark)
retval=bookmarkset(addr);
else
retval=bookmarkdel(addr);
}
return retval;
}
@ -305,3 +317,63 @@ extern "C" DLL_EXPORT bool _dbg_valtostring(const char* string, duint* value)
{
return valtostring(string, value, true);
}
extern "C" DLL_EXPORT int _dbg_getbplist(BPXTYPE type, BPMAP* bplist)
{
if(!bplist)
return 0;
BREAKPOINT* list;
int bpcount=bpgetlist(&list);
if(!bpcount)
return 0;
int retcount=0;
std::vector<BRIDGEBP> bridgeList;
BRIDGEBP curBp;
for(int i=0; i<bpcount; i++)
{
switch(type)
{
case bp_none: //all types
break;
case bp_normal: //normal
if(list[i].type!=BPNORMAL)
continue;
break;
case bp_hardware: //hardware
if(list[i].type!=BPHARDWARE)
continue;
break;
case bp_memory: //memory
if(list[i].type!=BPMEMORY)
continue;
break;
default:
return 0;
}
switch(list[i].type)
{
case BPNORMAL:
curBp.type=bp_normal;
break;
case BPHARDWARE:
curBp.type=bp_hardware;
break;
case BPMEMORY:
curBp.type=bp_memory;
break;
}
curBp.addr=list[i].addr;
curBp.enabled=list[i].enabled;
strcpy(curBp.mod, list[i].mod);
strcpy(curBp.name, list[i].name);
curBp.singleshoot=list[i].singleshoot;
bridgeList.push_back(curBp);
retcount++;
}
bplist->count=retcount;
bplist->bp=(BRIDGEBP*)BridgeAlloc(sizeof(BRIDGEBP)*retcount);
for(int i=0; i<retcount; i++)
memcpy(&bplist->bp[i], &bridgeList.at(i), sizeof(BRIDGEBP));
return retcount;
}

View File

@ -20,6 +20,7 @@ DLL_EXPORT bool _dbg_addrinfoset(duint addr, ADDRINFO* addrinfo);
DLL_EXPORT int _dbg_bpgettypeat(duint addr);
DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump);
DLL_EXPORT bool _dbg_valtostring(const char* string, duint* value);
DLL_EXPORT int _dbg_getbplist(BPXTYPE type, BPMAP* bplist);
#ifdef __cplusplus
}

View File

@ -17,9 +17,11 @@ void dbinit()
return;
}
sqlloadsavedb(userdb, dbpath, false);
if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)"))
dprintf("SQL Error: %s\n", sqllasterror());
if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS comments (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)"))
dprintf("SQL Error: %s\n", sqllasterror());
if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)"))
if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS bookmarks (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL)"))
dprintf("SQL Error: %s\n", sqllasterror());
if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS breakpoints (id INTEGER PRIMARY KEY AUTOINCREMENT, addr INT64 NOT NULL, enabled INT NOT NULL, singleshoot INT NOT NULL, oldbytes INT NOT NULL, type INT NOT NULL, titantype INT NOT NULL, mod TEXT, name TEXT)"))
dprintf("SQL Error: %s\n", sqllasterror());
@ -397,3 +399,79 @@ bool labeldel(uint addr)
GuiUpdateAllViews();
return true;
}
///bookmark functions
bool bookmarkset(uint addr)
{
if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[35]="";
char sql[deflen]="";
if(!modnamefromaddr(addr, modname, true)) //bookmarks without module
{
sprintf(sql, "SELECT * FROM bookmarks WHERE mod IS NULL AND addr=%"fext"d", addr);
if(sqlhasresult(userdb, sql)) //there is a bookmark already
return true;
else //insert
sprintf(sql, "INSERT INTO bookmarks (addr) VALUES (%"fext"d)", addr);
}
else
{
uint modbase=modbasefromaddr(addr);
uint rva=addr-modbase;
sprintf(sql, "SELECT * FROM bookmarks WHERE mod='%s' AND addr=%"fext"d", modname, rva);
if(sqlhasresult(userdb, sql)) //there is a bookmark already
return true;
else //insert
sprintf(sql, "INSERT INTO bookmarks (mod,addr) VALUES ('%s',%"fext"d)", modname, rva);
}
if(!sqlexec(userdb, sql))
{
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
}
bool bookmarkget(uint addr)
{
if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[35]="";
char sql[deflen]="";
if(!modnamefromaddr(addr, modname, true)) //bookmarks without module
sprintf(sql, "SELECT * FROM bookmarks WHERE mod IS NULL AND addr=%"fext"d", addr);
else
sprintf(sql, "SELECT * FROM bookmarks WHERE mod='%s' AND addr=%"fext"d", modname, addr-modbasefromaddr(addr));
return sqlhasresult(userdb, sql);
}
bool bookmarkdel(uint addr)
{
if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[35]="";
char sql[deflen]="";
if(!modnamefromaddr(addr, modname, true)) //bookmarks without module
sprintf(sql, "SELECT id FROM bookmarks WHERE mod IS NULL AND addr=%"fext"d", addr);
else
{
uint modbase=modbasefromaddr(addr);
uint rva=addr-modbase;
sprintf(sql, "SELECT id FROM bookmarks WHERE mod='%s' AND addr=%"fext"d", modname, rva);
}
int del_id=0;
if(!sqlgetint(userdb, sql, &del_id))
return false;
sprintf(sql, "DELETE FROM bookmarks WHERE id=%d", del_id);
if(!sqlexec(userdb, sql))
{
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
dbsave();
GuiUpdateAllViews();
return true;
}

View File

@ -35,5 +35,8 @@ bool commentdel(uint addr);
bool labelset(uint addr, const char* text);
bool labelget(uint addr, char* text);
bool labeldel(uint addr);
bool bookmarkset(uint addr);
bool bookmarkget(uint addr);
bool bookmarkdel(uint addr);
#endif // _ADDRINFO_H

View File

@ -20,7 +20,7 @@ bool bpnew(uint addr, bool enabled, bool singleshoot, short oldbytes, BP_TYPE ty
return false;
char modname[256]="";
char sql[deflen]="";
char bpname[MAX_BREAKPOINT_NAME]="";
char bpname[MAX_BREAKPOINT_SIZE]="";
if(modnamefromaddr(addr, modname, true)) //no module
{
uint modbase=modbasefromaddr(addr);
@ -56,7 +56,7 @@ bool bpget(uint addr, BP_TYPE type, const char* name, BREAKPOINT* bp)
{
char sql[deflen]="";
char modname[256]="";
char bpname[MAX_BREAKPOINT_NAME]="";
char bpname[MAX_BREAKPOINT_SIZE]="";
uint modbase=0;
if(!modnamefromaddr(addr, modname, true)) //no module
{
@ -178,7 +178,7 @@ bool bpsetname(uint addr, BP_TYPE type, const char* name)
return false;
char modname[256]="";
char sql[deflen]="";
char bpname[MAX_BREAKPOINT_NAME]="";
char bpname[MAX_BREAKPOINT_SIZE]="";
sqlstringescape(name, bpname);
if(!modnamefromaddr(addr, modname, true)) //no module
sprintf(sql, "UPDATE breakpoints SET name='%s' WHERE addr=%"fext"d AND mod IS NULL AND type=%d", bpname, addr, type);

View File

@ -4,8 +4,6 @@
#include "_global.h"
#include "TitanEngine\TitanEngine.h"
#define MAX_BREAKPOINT_NAME 256
//enums
enum BP_TYPE
{
@ -24,7 +22,7 @@ struct BREAKPOINT
short oldbytes;
BP_TYPE type;
DWORD titantype;
char name[MAX_BREAKPOINT_NAME];
char name[MAX_BREAKPOINT_SIZE];
char mod[32];
};
#pragma pack()

View File

@ -218,7 +218,10 @@ CMDRESULT cbInstrCmt(const char* cmd)
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
}
char arg2[deflen]="";
if(!argget(cmd, arg2, 1, false))
return STATUS_ERROR;
@ -237,7 +240,10 @@ CMDRESULT cbInstrCmtdel(const char* cmd)
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
}
if(!commentdel(addr))
{
dputs("error deleting comment");
@ -253,7 +259,10 @@ CMDRESULT cbInstrLbl(const char* cmd)
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
}
char arg2[deflen]="";
if(!argget(cmd, arg2, 1, false))
return STATUS_ERROR;
@ -272,7 +281,11 @@ CMDRESULT cbInstrLbldel(const char* cmd)
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
}
if(!labeldel(addr))
{
dputs("error deleting label");
@ -281,6 +294,46 @@ CMDRESULT cbInstrLbldel(const char* cmd)
return STATUS_CONTINUE;
}
CMDRESULT cbInstrBookmarkSet(const char* cmd)
{
char arg1[deflen]="";
if(!argget(cmd, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
}
if(!bookmarkset(addr))
{
dputs("failed to set bookmark!");
return STATUS_ERROR;
}
dputs("bookmark set!");
return STATUS_CONTINUE;
}
CMDRESULT cbInstrBookmarkDel(const char* cmd)
{
char arg1[deflen]="";
if(!argget(cmd, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
}
if(!bookmarkdel(addr))
{
dputs("failed to delete bookmark!");
return STATUS_ERROR;
}
dputs("bookmark deleted!");
return STATUS_CONTINUE;
}
CMDRESULT cbLoaddb(const char* cmd)
{
if(!dbload())

View File

@ -15,6 +15,8 @@ CMDRESULT cbInstrCmt(const char* cmd);
CMDRESULT cbInstrCmtdel(const char* cmd);
CMDRESULT cbInstrLbl(const char* cmd);
CMDRESULT cbInstrLbldel(const char* cmd);
CMDRESULT cbInstrBookmarkSet(const char* cmd);
CMDRESULT cbInstrBookmarkDel(const char* cmd);
CMDRESULT cbLoaddb(const char* cmd);
CMDRESULT cbSavedb(const char* cmd);

View File

@ -69,6 +69,8 @@ static void registercommands()
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, "DeleteHardwareBreakpoint\1bphc\1bphwc", cbDebugDeleteHardwareBreakpoint, true); //delete hardware breakpoint

View File

@ -46,7 +46,8 @@ SOURCES += \
Src/BasicView/RegistersView.cpp \
Src/Gui/StatusLabel.cpp \
Src/BasicView/WordEditDialog.cpp \
Src/Gui/CPUDisassembly.cpp
Src/Gui/CPUDisassembly.cpp \
Src/BasicView/LineEditDialog.cpp
HEADERS += \
@ -73,7 +74,8 @@ HEADERS += \
Src/BasicView/RegistersView.h \
Src/Gui/StatusLabel.h \
Src/BasicView/WordEditDialog.h \
Src/Gui/CPUDisassembly.h
Src/Gui/CPUDisassembly.h \
Src/BasicView/LineEditDialog.h
INCLUDEPATH += \
Src \
@ -91,7 +93,8 @@ FORMS += \
Src/Dummy.ui \
Src/Gui/CPUWidget.ui \
Src/Gui/GotoDialog.ui \
Src/BasicView/WordEditDialog.ui
Src/BasicView/WordEditDialog.ui \
Src/BasicView/LineEditDialog.ui
INCLUDEPATH += $$PWD/Src/Bridge

View File

@ -126,61 +126,80 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse
else
*label=0;
BPXTYPE bpxtype=DbgGetBpxTypeAt(cur_addr);
bool isbookmark=DbgGetBookmarkAt(cur_addr);
painter->save();
if(mInstBuffer.at(rowOffset).rva == mCipRva) //cip
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor(0,0,0)));
if(bpxtype&bp_normal) //breakpoint
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000")));
if(!isbookmark)
{
painter->setPen(QPen(QColor("#ff0000")));
if(bpxtype&bp_normal) //breakpoint
{
painter->setPen(QPen(QColor("#ff0000")));
}
else
{
painter->setPen(QPen(QColor("#fffbf0")));
}
}
else
{
painter->setPen(QPen(QColor("#fffbf0")));
painter->setPen(QPen(QColor("#fee970")));
}
}
else //other address
{
if(*label) //label
if(!isbookmark)
{
if(bpxtype==bp_none) //label only
painter->setPen(QPen(QColor("#ff0000"))); //red -> address + label text
else //label+breakpoint
if(*label) //label
{
if(bpxtype&bp_normal)
if(bpxtype==bp_none) //label only
painter->setPen(QPen(QColor("#ff0000"))); //red -> address + label text
else //label+breakpoint
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red
}
else
{
painter->setPen(QPen(QColor("#000000"))); //black address
if(bpxtype&bp_normal)
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red
}
else
{
painter->setPen(QPen(QColor("#000000"))); //black address
}
}
}
}
else //no label
{
if(bpxtype==bp_none) //no label, no breakpoint
else //no label
{
if(wIsSelected)
painter->setPen(QPen(QColor("#000000"))); //black address
else
painter->setPen(QPen(QColor("#808080")));
}
else //breakpoint only
{
if(bpxtype&bp_normal)
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red
}
else
if(bpxtype==bp_none) //no label, no breakpoint
{
if(wIsSelected)
painter->setPen(QPen(QColor("#000000"))); //black address
else
painter->setPen(QPen(QColor("#808080")));
}
else //breakpoint only
{
if(bpxtype&bp_normal)
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red
}
else
{
if(wIsSelected)
painter->setPen(QPen(QColor("#000000"))); //black address
else
painter->setPen(QPen(QColor("#808080")));
}
}
}
}
else
{
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#fee970")));
if(wIsSelected)
painter->setPen(QPen(QColor("#000000"))); //black address
else
painter->setPen(QPen(QColor("#808080")));
}
}
painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, addrText);
painter->restore();
@ -809,7 +828,7 @@ void Disassembly::prepareData()
/************************************************************************************
Public Methods
************************************************************************************/
int_t Disassembly::rvaToVa(int_t rva)
uint_t Disassembly::rvaToVa(int_t rva)
{
return mBase + rva;
}

View File

@ -55,7 +55,7 @@ public:
void prepareData();
// Public Methods
int_t rvaToVa(int_t rva);
uint_t rvaToVa(int_t rva);
void disassembleClear();
signals:

View File

@ -0,0 +1,27 @@
#include "LineEditDialog.h"
#include "ui_LineEditDialog.h"
LineEditDialog::LineEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LineEditDialog)
{
ui->setupUi(this);
setModal(true);
setWindowFlags(Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint);
setFixedSize(this->size()); //fixed size
setModal(true); //modal window
}
LineEditDialog::~LineEditDialog()
{
delete ui;
}
void LineEditDialog::setText(const QString &text)
{
ui->textEdit->setText(text);
ui->textEdit->selectAll();
}
void LineEditDialog::on_textEdit_textChanged(const QString &arg1)
{
editText=arg1;
}

View File

@ -0,0 +1,27 @@
#ifndef LINEEDITDIALOG_H
#define LINEEDITDIALOG_H
#include <QDialog>
namespace Ui {
class LineEditDialog;
}
class LineEditDialog : public QDialog
{
Q_OBJECT
public:
explicit LineEditDialog(QWidget *parent = 0);
~LineEditDialog();
QString editText;
void setText(const QString &text);
private slots:
void on_textEdit_textChanged(const QString &arg1);
private:
Ui::LineEditDialog *ui;
};
#endif // LINEEDITDIALOG_H

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LineEditDialog</class>
<widget class="QDialog" name="LineEditDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>373</width>
<height>72</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<property name="windowIcon">
<iconset resource="../../resource.qrc">
<normaloff>:/icons/images/ui-combo-box-edit.png</normaloff>:/icons/images/ui-combo-box-edit.png</iconset>
</property>
<widget class="QWidget" name="">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>351</width>
<height>53</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLineEdit" name="textEdit"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonOk">
<property name="text">
<string>&amp;OK</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonCancel">
<property name="text">
<string>&amp;Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources>
<include location="../../resource.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonOk</sender>
<signal>clicked()</signal>
<receiver>LineEditDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>243</x>
<y>49</y>
</hint>
<hint type="destinationlabel">
<x>150</x>
<y>57</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonCancel</sender>
<signal>clicked()</signal>
<receiver>LineEditDialog</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>320</x>
<y>51</y>
</hint>
<hint type="destinationlabel">
<x>150</x>
<y>41</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -278,7 +278,7 @@ void RegistersView::updateRegistersSlot()
void RegistersView::displayEditDialog()
{
WordEditDialog wEditDial;
WordEditDialog wEditDial(this);
QString wReg = mRegList->at(mSelected)->text();
#ifdef _WIN64

View File

@ -6,6 +6,7 @@
#include <QMenu>
#include "Bridge.h"
#include "WordEditDialog.h"
#include "LineEditDialog.h"
namespace Ui {
class RegistersView;

View File

@ -20,7 +20,7 @@ CPUDisassembly::CPUDisassembly(QWidget *parent) : Disassembly(parent)
*/
void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
{
int_t wVA = rvaToVa(getInitialSelection());
uint_t wVA = rvaToVa(getInitialSelection());
BPXTYPE wBpType = DbgGetBpxTypeAt(wVA);
if((wBpType & bp_hardware) == bp_hardware)
@ -32,7 +32,7 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
mToggleHwBpAction->setText("Set Hardware on Execution");
}
QAction* wAction = mRigthClickContextMenu->exec(event->globalPos());
QAction* wAction = mRightClickContextMenu->exec(event->globalPos());
}
@ -41,13 +41,43 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event)
************************************************************************************/
void CPUDisassembly::setupRightClickContextMenu()
{
mRigthClickContextMenu = new QMenu(this);
mRightClickContextMenu = new QMenu(this);
//---------------------- Breakpoints -----------------------------
QMenu* wBPMenu = new QMenu("Breakpoints", this);
//label/comment
mSetLabel = new QAction("Label", this);
mSetLabel->setShortcutContext(Qt::WidgetShortcut);
mSetLabel->setShortcut(QKeySequence(":"));
this->addAction(mSetLabel);
connect(mSetLabel, SIGNAL(triggered()), this, SLOT(setLabel()));
// INT3 BP
mToggleInt3BpAction = new QAction("Toggle INT3", this);
mSetComment = new QAction("Comment", this);
mSetComment->setShortcutContext(Qt::WidgetShortcut);
mSetComment->setShortcut(QKeySequence(";"));
this->addAction(mSetComment);
connect(mSetComment, SIGNAL(triggered()), this, SLOT(setComment()));
mSetBookmark = new QAction("Bookmark", this);
mSetBookmark->setShortcutContext(Qt::WidgetShortcut);
mSetBookmark->setShortcut(QKeySequence("ctrl+d"));
this->addAction(mSetBookmark);
connect(mSetBookmark, SIGNAL(triggered()), this, SLOT(setBookmark()));
//---------------------- Go to -----------------------------------
QMenu* wGotoMenu = new QMenu("Go to", this);
mGotoOrigin = new QAction("Origin", this);
mGotoOrigin->setShortcutContext(Qt::WidgetShortcut);
mGotoOrigin->setShortcut(QKeySequence("*"));
this->addAction(mGotoOrigin);
connect(mGotoOrigin, SIGNAL(triggered()), this, SLOT(gotoOrigin()));
wGotoMenu->addAction(mGotoOrigin);
//---------------------- Breakpoints -----------------------------
QMenu* wBPMenu = 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);
@ -59,25 +89,32 @@ void CPUDisassembly::setupRightClickContextMenu()
connect(mToggleHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot()));
wBPMenu->addAction(mToggleHwBpAction);
mRigthClickContextMenu->addMenu(wBPMenu);
// Separator
mRigthClickContextMenu->addSeparator();
//---------------------- New origin here -----------------------------
//---------------------- 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()));
mRigthClickContextMenu->addAction(mSetNewOriginHere);
//Add to menu
mRightClickContextMenu->addAction(mSetLabel);
mRightClickContextMenu->addAction(mSetComment);
mRightClickContextMenu->addAction(mSetBookmark);
mRightClickContextMenu->addMenu(wBPMenu); //Breakpoint->
mRightClickContextMenu->addSeparator(); //Seperator
mRightClickContextMenu->addMenu(wGotoMenu); //Go to->
mRightClickContextMenu->addAction(mSetNewOriginHere); //New origin here
}
void CPUDisassembly::gotoOrigin()
{
Bridge::getBridge()->execCmd("d cip");
}
void CPUDisassembly::toggleInt3BPAction()
{
int_t wVA = rvaToVa(getInitialSelection());
uint_t wVA = rvaToVa(getInitialSelection());
BPXTYPE wBpType = DbgGetBpxTypeAt(wVA);
QString wCmd;
@ -96,7 +133,7 @@ void CPUDisassembly::toggleInt3BPAction()
void CPUDisassembly::toggleHwBpActionSlot()
{
int_t wVA = rvaToVa(getInitialSelection());
uint_t wVA = rvaToVa(getInitialSelection());
BPXTYPE wBpType = DbgGetBpxTypeAt(wVA);
QString wCmd;
@ -115,7 +152,61 @@ void CPUDisassembly::toggleHwBpActionSlot()
void CPUDisassembly::setNewOriginHereActionSlot()
{
int_t wVA = rvaToVa(getInitialSelection());
uint_t wVA = rvaToVa(getInitialSelection());
QString wCmd = "cip=" + QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
Bridge::getBridge()->execCmd(wCmd.toUtf8().constData());
}
void CPUDisassembly::setLabel()
{
uint_t wVA = rvaToVa(getInitialSelection());
LineEditDialog mLineEdit(this);
QString addr_text=QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
char label_text[MAX_COMMENT_SIZE]="";
if(DbgGetLabelAt((duint)wVA, SEG_DEFAULT, label_text))
mLineEdit.setText(QString(label_text));
mLineEdit.setWindowTitle("Add label at " + addr_text);
if(mLineEdit.exec()!=QDialog::Accepted)
return;
if(!DbgSetLabelAt(wVA, mLineEdit.editText.toUtf8().constData()))
{
QMessageBox msg(QMessageBox::Critical, "Error!", "DbgSetLabelAt failed!");
msg.setWindowIcon(QIcon(":/icons/images/compile-error.png"));
msg.exec();
}
}
void CPUDisassembly::setComment()
{
uint_t wVA = rvaToVa(getInitialSelection());
LineEditDialog mLineEdit(this);
QString addr_text=QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper();
char comment_text[MAX_COMMENT_SIZE]="";
if(DbgGetCommentAt((duint)wVA, comment_text))
mLineEdit.setText(QString(comment_text));
mLineEdit.setWindowTitle("Add comment at " + addr_text);
if(mLineEdit.exec()!=QDialog::Accepted)
return;
if(!DbgSetCommentAt(wVA, mLineEdit.editText.toUtf8().constData()))
{
QMessageBox msg(QMessageBox::Critical, "Error!", "DbgSetCommentAt failed!");
msg.setWindowIcon(QIcon(":/icons/images/compile-error.png"));
msg.exec();
}
}
void CPUDisassembly::setBookmark()
{
uint_t wVA = rvaToVa(getInitialSelection());
bool result;
if(DbgGetBookmarkAt(wVA))
result=DbgSetBookmarkAt(wVA, false);
else
result=DbgSetBookmarkAt(wVA, true);
if(!result)
{
QMessageBox msg(QMessageBox::Critical, "Error!", "DbgSetBookmarkAt failed!");
msg.setWindowIcon(QIcon(":/icons/images/compile-error.png"));
msg.exec();
}
}

View File

@ -6,7 +6,7 @@
#include "NewTypes.h"
#include "Disassembly.h"
#include "Bridge.h"
#include "LineEditDialog.h"
class CPUDisassembly : public Disassembly
{
@ -26,14 +26,22 @@ public slots:
void toggleInt3BPAction();
void toggleHwBpActionSlot();
void setNewOriginHereActionSlot();
void gotoOrigin();
void setLabel();
void setComment();
void setBookmark();
private:
// Rigth Click Context Menu
QMenu* mRigthClickContextMenu;
QMenu* mRightClickContextMenu;
QAction* mToggleInt3BpAction;
QAction* mToggleHwBpAction;
QAction* mSetNewOriginHere;
QAction* mGotoOrigin;
QAction* mSetComment;
QAction* mSetLabel;
QAction* mSetBookmark;
};
#endif // CPUDISASSEMBLY_H

View File

@ -7,9 +7,9 @@ GotoDialog::GotoDialog(QWidget *parent) :
{
//setup UI first
ui->setupUi(this);
setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
setModal(true);
setWindowFlags(Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint);
setFixedSize(this->size()); //fixed size
setModal(true); //modal window
//initialize stuff
if(!DbgIsDebugging()) //not debugging
ui->labelError->setText("<font color='red'><b>Not debugging...</b></color>");

View File

@ -161,7 +161,7 @@ void MainWindow::displayAboutWidget()
void MainWindow::on_actionGoto_triggered()
{
GotoDialog mGoto;
GotoDialog mGoto(this);
if(mGoto.exec()==QDialog::Accepted)
{
QString cmd;

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

View File

@ -17,5 +17,6 @@
<file>images/processor-cpu.png</file>
<file>images/ui-combo-box-edit.png</file>
<file>images/scylla.png</file>
<file>images/compile-error.png</file>
</qresource>
</RCC>