mirror of
https://github.com/x64dbg/x64dbg.git
synced 2024-10-07 10:13:31 +00:00
DBG: added bplist
DBG: added bookmark GUI: many improbments
This commit is contained in:
parent
c15726cf2c
commit
4c2f73518a
@ -29,3 +29,4 @@ DBGBPGETTYPEAT _dbg_bpgettypeat;
|
||||
DBGGETREGDUMP _dbg_getregdump;
|
||||
DBGVALTOSTRING _dbg_valtostring;
|
||||
DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr;
|
||||
DBGGETBPLIST _dbg_getbplist;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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()
|
||||
|
@ -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())
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
void prepareData();
|
||||
|
||||
// Public Methods
|
||||
int_t rvaToVa(int_t rva);
|
||||
uint_t rvaToVa(int_t rva);
|
||||
void disassembleClear();
|
||||
|
||||
signals:
|
||||
|
27
x64_dbg_gui/Project/Src/BasicView/LineEditDialog.cpp
Normal file
27
x64_dbg_gui/Project/Src/BasicView/LineEditDialog.cpp
Normal 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;
|
||||
}
|
27
x64_dbg_gui/Project/Src/BasicView/LineEditDialog.h
Normal file
27
x64_dbg_gui/Project/Src/BasicView/LineEditDialog.h
Normal 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
|
107
x64_dbg_gui/Project/Src/BasicView/LineEditDialog.ui
Normal file
107
x64_dbg_gui/Project/Src/BasicView/LineEditDialog.ui
Normal 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>&OK</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="buttonCancel">
|
||||
<property name="text">
|
||||
<string>&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>
|
@ -278,7 +278,7 @@ void RegistersView::updateRegistersSlot()
|
||||
|
||||
void RegistersView::displayEditDialog()
|
||||
{
|
||||
WordEditDialog wEditDial;
|
||||
WordEditDialog wEditDial(this);
|
||||
QString wReg = mRegList->at(mSelected)->text();
|
||||
|
||||
#ifdef _WIN64
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <QMenu>
|
||||
#include "Bridge.h"
|
||||
#include "WordEditDialog.h"
|
||||
#include "LineEditDialog.h"
|
||||
|
||||
namespace Ui {
|
||||
class RegistersView;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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>");
|
||||
|
@ -161,7 +161,7 @@ void MainWindow::displayAboutWidget()
|
||||
|
||||
void MainWindow::on_actionGoto_triggered()
|
||||
{
|
||||
GotoDialog mGoto;
|
||||
GotoDialog mGoto(this);
|
||||
if(mGoto.exec()==QDialog::Accepted)
|
||||
{
|
||||
QString cmd;
|
||||
|
BIN
x64_dbg_gui/Project/images/compile-error.png
Normal file
BIN
x64_dbg_gui/Project/images/compile-error.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 638 B |
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user