DBG: started massive performance improvement (cache the database in std::map and std::vector) this will impove the disassembly scrolling performance very very much.

GUI: manually refresh the GUI
This commit is contained in:
Mr. eXoDia 2014-06-15 04:07:55 +02:00
parent ad9c2d3ea2
commit d2d0960bfd
9 changed files with 389 additions and 106 deletions

View File

@ -250,6 +250,21 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
}
}
}
if(addrinfo->flags&flagbookmark)
{
addrinfo->isbookmark=bookmarkget(addr);
retval=true;
}
if(addrinfo->flags&flagfunction)
{
if(functionget(addr, &addrinfo->function.start, &addrinfo->function.end))
retval=true;
}
if(addrinfo->flags&flagloop)
{
if(loopget(addrinfo->loop.depth, addr, &addrinfo->loop.start, &addrinfo->loop.end))
retval=true;
}
if(addrinfo->flags&flagcomment)
{
*addrinfo->comment=0;
@ -274,19 +289,23 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
}
else //no line number
{
/*
DISASM_INSTR instr;
std::string temp_string;
ADDRINFO newinfo;
char ascii[256*2]="";
char unicode[256*2]="";
memset(&instr, 0, sizeof(DISASM_INSTR));
disasmget(addr, &instr);
int len_left=MAX_COMMENT_SIZE;
for(int i=0,j=0; i<instr.argcount; i++)
{
char temp_string[MAX_COMMENT_SIZE*2]="";
ADDRINFO newinfo;
memset(&newinfo, 0, sizeof(ADDRINFO));
newinfo.flags=flaglabel;
char ascii[256]="";
char unicode[256]="";
STRING_TYPE strtype=str_none;
if(instr.arg[i].constant==instr.arg[i].value) //avoid: call <module.label> ; addr:label
{
if(instr.type==instr_branch or !disasmgetstringat(instr.arg[i].constant, &strtype, ascii, unicode, len_left) or strtype==str_none)
@ -296,14 +315,16 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
case str_none:
break;
case str_ascii:
len_left-=sprintf(temp_string, "%s:\"%s\"", instr.arg[i].mnemonic, ascii);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
temp_string=instr.arg[i].mnemonic;
temp_string.append(":\"");
temp_string.append(ascii);
temp_string.append("\"");
break;
case str_unicode:
len_left-=sprintf(temp_string, "%s:L\"%s\"", instr.arg[i].mnemonic, unicode);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
temp_string=instr.arg[i].mnemonic;
temp_string.append(":L\"");
temp_string.append(unicode);
temp_string.append("\"");
break;
}
}
@ -313,19 +334,24 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
{
case str_none:
if(*newinfo.label)
len_left-=sprintf(temp_string, "[%s]:%s", instr.arg[i].mnemonic, newinfo.label);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
{
temp_string="[";
temp_string.append(instr.arg[i].mnemonic);
temp_string.append("]:");
temp_string.append(newinfo.label);
}
break;
case str_ascii:
len_left-=sprintf(temp_string, "[%s]:\"%s\"", instr.arg[i].mnemonic, ascii);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
temp_string="[";
temp_string.append(instr.arg[i].mnemonic);
temp_string.append("]:");
temp_string.append(ascii);
break;
case str_unicode:
len_left-=sprintf(temp_string, "[%s]:L\"%s\"", instr.arg[i].mnemonic, unicode);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
temp_string="[";
temp_string.append(instr.arg[i].mnemonic);
temp_string.append("]:");
temp_string.append(unicode);
break;
}
}
@ -337,51 +363,45 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
{
case str_none:
if(*newinfo.label)
len_left-=sprintf(temp_string, "%s:%s", instr.arg[i].mnemonic, newinfo.label);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
{
temp_string=instr.arg[i].mnemonic;
temp_string.append(":");
temp_string.append(newinfo.label);
}
break;
case str_ascii:
len_left-=sprintf(temp_string, "%s:\"%s\"", instr.arg[i].mnemonic, ascii);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
temp_string=instr.arg[i].mnemonic;
temp_string.append(":\"");
temp_string.append(ascii);
temp_string.append("\"");
break;
case str_unicode:
len_left-=sprintf(temp_string, "%s:L\"%s\"", instr.arg[i].mnemonic, unicode);
if(len_left<0)
temp_string[MAX_COMMENT_SIZE]=0;
temp_string=instr.arg[i].mnemonic;
temp_string.append(":L\"");
temp_string.append(unicode);
temp_string.append("\"");
break;
}
}
else
continue;
if(!strstr(addrinfo->comment, temp_string))
if(!strstr(addrinfo->comment, temp_string.c_str()))
{
unsigned int maxlen=MAX_COMMENT_SIZE-j-1;
if(maxlen<temp_string.length())
temp_string.at(maxlen-1)=0;
if(j)
j+=sprintf(addrinfo->comment+j, ", %s", temp_string);
j+=sprintf(addrinfo->comment+j, ", %s", temp_string.c_str());
else
j+=sprintf(addrinfo->comment+j, "%s", temp_string);
j+=sprintf(addrinfo->comment+j, "%s", temp_string.c_str());
retval=true;
}
}
*/
}
}
}
if(addrinfo->flags&flagbookmark)
{
addrinfo->isbookmark=bookmarkget(addr);
retval=true;
}
if(addrinfo->flags&flagfunction)
{
if(functionget(addr, &addrinfo->function.start, &addrinfo->function.end))
retval=true;
}
if(addrinfo->flags&flagloop)
{
if(loopget(addrinfo->loop.depth, addr, &addrinfo->loop.start, &addrinfo->loop.end))
retval=true;
}
return retval;
}
@ -882,7 +902,7 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par
case DBG_LOOP_OVERLAPS:
{
FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1;
return (uint)loopoverlaps(info->depth, info->start, info->end);
return (uint)loopoverlaps(info->depth, info->start, info->end, 0);
}
break;

View File

@ -8,7 +8,12 @@
#include "symbolinfo.h"
sqlite3* userdb;
static std::vector<MODINFO> modinfo;
static ModulesInfo modinfo;
static CommentsInfo comments;
static LabelsInfo labels;
static BookmarksInfo bookmarks;
static FunctionsInfo functions;
static LoopsInfo loops;
///basic database functions
void dbinit()
@ -35,7 +40,6 @@ void dbinit()
dprintf("SQL Error: %s\n", sqllasterror());
if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS loops (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, start INT64 NOT NULL, end INT64 NOT NULL, parent INT, depth INT NOT NULL, manual BOOL NOT NULL)"))
dprintf("SQL Error: %s\n", sqllasterror());
dbsave();
bpenumall(0); //update breakpoint list
GuiUpdateBreakpointsView();
}
@ -122,7 +126,7 @@ bool modunload(uint base)
void modclear()
{
std::vector<MODINFO>().swap(modinfo);
ModulesInfo().swap(modinfo);
symupdatemodulelist();
}
@ -130,6 +134,7 @@ bool modnamefromaddr(uint addr, char* modname, bool extension)
{
if(!modname)
return false;
*modname=0;
int total=modinfo.size();
for(int i=0; i<total; i++)
{
@ -258,6 +263,20 @@ bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum)
///comment functions
bool commentset(uint addr, const char* text)
{
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_COMMENT_SIZE-1)
return false;
if(!*text) //NOTE: delete when there is no text
return commentdel(addr);
COMMENTSINFO info;
sqlstringescape(text, info.text);
modnamefromaddr(addr, info.mod, true);
info.addr=addr-modbasefromaddr(addr);
if(comments.count(addr)) //contains addr
comments[addr]=info;
else
comments.insert(std::make_pair(addr, info));
return true;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_COMMENT_SIZE-1)
return false;
if(!*text) //NOTE: delete when there is no text
@ -289,13 +308,21 @@ bool commentset(uint addr, const char* text)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
*/
}
bool commentget(uint addr, char* text)
{
if(!DbgIsDebugging())
return false;
if(comments.count(addr)) //contains
{
strcpy(text, comments[addr].text);
return true;
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text)
return false;
char modname[MAX_MODULE_SIZE]="";
@ -305,10 +332,20 @@ bool commentget(uint addr, char* text)
else
sprintf(sql, "SELECT text FROM comments WHERE mod='%s' AND addr=%"fext"d", modname, addr-modbasefromaddr(addr));
return sqlgettext(userdb, sql, text);
*/
}
bool commentdel(uint addr)
{
if(!DbgIsDebugging())
return false;
if(comments.count(addr)) //contains
{
comments.erase(addr);
return true;
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[MAX_MODULE_SIZE]="";
@ -330,9 +367,8 @@ bool commentdel(uint addr)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
*/
}
///label functions
@ -342,10 +378,16 @@ bool labelset(uint addr, const char* text)
return false;
if(!*text) //NOTE: delete when there is no text
return labeldel(addr);
char labeltext[MAX_LABEL_SIZE]="";
sqlstringescape(text, labeltext);
char modname[MAX_MODULE_SIZE]="";
char sql[deflen]="";
LABELSINFO label;
sqlstringescape(text, label.text);
modnamefromaddr(addr, label.mod, true);
label.addr=addr-modbasefromaddr(addr);
if(labels.count(addr)) //contains
labels[addr]=label;
else
labels.insert(std::make_pair(addr, label));
return true;
/*
if(!modnamefromaddr(addr, modname, true)) //labels without module
{
sprintf(sql, "SELECT text FROM labels WHERE mod IS NULL AND addr=%"fext"d", addr);
@ -369,13 +411,27 @@ bool labelset(uint addr, const char* text)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
*/
}
bool labelfromstring(const char* text, uint* addr)
{
if(!DbgIsDebugging())
return false;
char labeltext[MAX_LABEL_SIZE]="";
sqlstringescape(text, labeltext);
for(LabelsInfo::iterator i=labels.begin(); i!=labels.end(); ++i)
{
if(!strcmp(i->second.text, labeltext))
{
if(addr)
*addr=i->first;
return true;
}
}
return false;
/*
if(!text or !strlen(text) or !addr)
return 0;
char labeltext[MAX_LABEL_SIZE]="";
@ -413,10 +469,20 @@ bool labelfromstring(const char* text, uint* addr)
sqlite3_finalize(stmt);
unlock(WAITID_USERDB);
return true;
*/
}
bool labelget(uint addr, char* text)
{
if(!DbgIsDebugging())
return false;
if(labels.count(addr)) //contains
{
strcpy(text, labels[addr].text);
return true;
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text)
return false;
char modname[MAX_MODULE_SIZE]="";
@ -426,10 +492,20 @@ bool labelget(uint addr, char* text)
else
sprintf(sql, "SELECT text FROM labels WHERE mod='%s' AND addr=%"fext"d", modname, addr-modbasefromaddr(addr));
return sqlgettext(userdb, sql, text);
*/
}
bool labeldel(uint addr)
{
if(!DbgIsDebugging())
return false;
if(labels.count(addr))
{
labels.erase(addr);
return true;
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[MAX_MODULE_SIZE]="";
@ -451,9 +527,8 @@ bool labeldel(uint addr)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
dbsave();
GuiUpdateAllViews();
return true;
*/
}
///bookmark functions
@ -461,6 +536,12 @@ bool bookmarkset(uint addr)
{
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
BOOKMARKSINFO bookmark;
modnamefromaddr(addr, bookmark.mod, true);
bookmark.addr=addr-modbasefromaddr(addr);
bookmarks.insert(std::make_pair(addr, bookmark));
return true;
/*
char modname[MAX_MODULE_SIZE]="";
char sql[deflen]="";
if(!modnamefromaddr(addr, modname, true)) //bookmarks without module
@ -486,13 +567,18 @@ bool bookmarkset(uint addr)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
*/
}
bool bookmarkget(uint addr)
{
if(!DbgIsDebugging())
return false;
if(bookmarks.count(addr))
return true;
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[MAX_MODULE_SIZE]="";
@ -502,10 +588,20 @@ bool bookmarkget(uint 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(!DbgIsDebugging())
return false;
if(bookmarks.count(addr))
{
bookmarks.erase(addr);
return true;
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[MAX_MODULE_SIZE]="";
@ -527,14 +623,29 @@ bool bookmarkdel(uint addr)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
dbsave();
GuiUpdateAllViews();
return true;
*/
}
///function database
bool functionget(duint addr, duint* start, duint* end)
bool functionget(uint addr, uint* start, uint* end)
{
if(!DbgIsDebugging())
return false;
for(FunctionsInfo::iterator i=functions.begin(); i!=functions.end(); ++i)
{
uint curAddr=addr-i->modbase;
if(i->start<=curAddr and i->end>=curAddr)
{
if(start)
*start=i->start+i->modbase;
if(end)
*end=i->end+i->modbase;
return true;
}
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[MAX_MODULE_SIZE]="";
@ -576,10 +687,22 @@ bool functionget(duint addr, duint* start, duint* end)
*end=dbend;
unlock(WAITID_USERDB);
return true;
*/
}
bool functionoverlaps(uint start, uint end)
{
if(!DbgIsDebugging())
return false;
for(FunctionsInfo::iterator i=functions.begin(); i!=functions.end(); ++i)
{
uint curStart=start-i->modbase;
uint curEnd=end-i->modbase;
if(i->start<=curEnd and i->end>=curStart)
return true;
}
return false;
/*
char sql[deflen]="";
char modname[MAX_MODULE_SIZE]="";
//check for function overlaps
@ -593,12 +716,24 @@ bool functionoverlaps(uint start, uint end)
if(sqlhasresult(userdb, sql)) //functions overlap
return true;
return false;
*/
}
bool functionadd(uint start, uint end, bool manual)
{
if(!DbgIsDebugging() or end<start or memfindbaseaddr(fdProcessInfo->hProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)) //the function boundaries are not in the same mem page
if(!DbgIsDebugging() or end<start or memfindbaseaddr(fdProcessInfo->hProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page
return false;
if(functionoverlaps(start, end))
return false;
FUNCTIONSINFO function;
modnamefromaddr(start, function.mod, true);
function.modbase=modbasefromaddr(start);
function.start=start-function.modbase;
function.end=end-function.modbase;
function.manual=manual;
functions.push_back(function);
return true;
/*
char sql[deflen]="";
char modname[MAX_MODULE_SIZE]="";
uint modbase=0;
@ -621,15 +756,25 @@ bool functionadd(uint start, uint end, bool manual)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
*/
}
bool functiondel(uint addr)
{
if(!DbgIsDebugging() or !functionget(addr, 0, 0))
if(!DbgIsDebugging())
return false;
for(FunctionsInfo::iterator i=functions.begin(); i!=functions.end(); ++i)
{
uint curAddr=addr-i->modbase;
if(i->start<=curAddr and i->end>=curAddr)
{
functions.erase(i);
return true;
}
}
return false;
/*
char modname[MAX_MODULE_SIZE]="";
char sql[deflen]="";
if(!modnamefromaddr(addr, modname, true))
@ -644,13 +789,28 @@ bool functiondel(uint addr)
dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql);
return false;
}
GuiUpdateAllViews();
dbsave();
return true;
*/
}
bool loopget(int depth, uint addr, uint* start, uint* end)
{
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i)
{
uint curAddr=addr-i->modbase;
if(i->start<=curAddr and i->end>=curAddr and i->depth==depth)
{
if(start)
*start=i->start+i->modbase;
if(end)
*end=i->end+i->modbase;
return true;
}
}
return false;
/*
if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr))
return false;
char modname[MAX_MODULE_SIZE]="";
@ -692,16 +852,57 @@ bool loopget(int depth, uint addr, uint* start, uint* end)
*end=dbend;
unlock(WAITID_USERDB);
return true;
*/
}
bool loopadd(uint start, uint end, bool manual)
{
if(!DbgIsDebugging() or end<start or memfindbaseaddr(fdProcessInfo->hProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page
return false;
int finaldepth;
if(loopoverlaps(0, start, end, &finaldepth)) //loop cannot overlap another loop
return false;
LOOPSINFO loop;
modnamefromaddr(start, loop.mod, true);
loop.modbase=modbasefromaddr(start);
loop.start=start-loop.modbase;
loop.end=end-loop.modbase;
loop.depth=finaldepth;
if(finaldepth)
loop.parent=finaldepth-1;
else
loop.parent=0;
loop.manual=manual;
return false;
}
//check if a loop overlaps a range, inside is not overlapping
bool loopoverlaps(int depth, uint start, uint end)
bool loopoverlaps(int depth, uint start, uint end, int* finaldepth)
{
if(!DbgIsDebugging())
return false;
//check if the new loop fits in the old loop
for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i)
{
uint curStart=start-i->modbase;
uint curEnd=end-i->modbase;
if(i->start<curStart and i->end>curEnd and i->depth==depth)
return loopoverlaps(depth+1, start, end, finaldepth);
}
if(finaldepth)
*finaldepth=depth;
//check for loop overlaps
for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i)
{
uint curStart=start-i->modbase;
uint curEnd=end-i->modbase;
if(i->start<=curEnd and i->end>=curStart and i->depth==depth)
return true;
}
return false;
/*
char sql[deflen]="";
char modname[MAX_MODULE_SIZE]="";
@ -724,10 +925,12 @@ bool loopoverlaps(int depth, uint start, uint end)
uint modbase=modbasefromaddr(start);
sprintf(sql, "SELECT manual FROM loops WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", modname, end-modbase, start-modbase, depth);
}
if(finaldepth)
*finaldepth=depth;
if(sqlhasresult(userdb, sql)) //loops overlap
return true;
return false;
*/
}
bool loopdel(int depth, uint addr)

View File

@ -2,13 +2,11 @@
#define _ADDRINFO_H
#include "_global.h"
#include <map>
//superglobal variables
extern sqlite3* userdb;
//typedefs
typedef void (*EXPORTENUMCALLBACK)(uint base, const char* mod, const char* name, uint addr);
//structures
struct MODINFO
{
@ -18,6 +16,56 @@ struct MODINFO
char extension[MAX_MODULE_SIZE];
};
struct COMMENTSINFO
{
char mod[MAX_MODULE_SIZE];
uint addr;
char text[MAX_COMMENT_SIZE];
};
struct LABELSINFO
{
char mod[MAX_MODULE_SIZE];
uint addr;
char text[MAX_LABEL_SIZE];
};
struct BOOKMARKSINFO
{
char mod[MAX_MODULE_SIZE];
uint addr;
};
struct FUNCTIONSINFO
{
char mod[MAX_MODULE_SIZE];
uint modbase;
uint start;
uint end;
bool manual;
};
struct LOOPSINFO
{
char mod[MAX_MODULE_SIZE];
uint modbase;
uint start;
uint end;
int parent;
int depth;
bool manual;
};
//typedefs
typedef void (*EXPORTENUMCALLBACK)(uint base, const char* mod, const char* name, uint addr);
typedef std::vector<MODINFO> ModulesInfo;
typedef std::map<uint, COMMENTSINFO> CommentsInfo;
typedef std::map<uint, LABELSINFO> LabelsInfo;
typedef std::map<uint, BOOKMARKSINFO> BookmarksInfo;
typedef std::vector<FUNCTIONSINFO> FunctionsInfo;
typedef std::vector<LOOPSINFO> LoopsInfo;
void dbinit();
bool dbsave();
bool dbload();
@ -39,12 +87,12 @@ bool labeldel(uint addr);
bool bookmarkset(uint addr);
bool bookmarkget(uint addr);
bool bookmarkdel(uint addr);
bool functionget(duint addr, duint* start, duint* end);
bool functionget(uint addr, uint* start, uint* end);
bool functionoverlaps(uint start, uint end);
bool functionadd(uint start, uint end, bool manual);
bool functiondel(uint addr);
bool loopget(int depth, uint addr, uint* start, uint* end);
bool loopoverlaps(int depth, uint start, uint end);
bool loopoverlaps(int depth, uint start, uint end, int* finaldepth);
bool loopadd(uint start, uint end, bool manual);
bool loopdel(int depth, uint addr);

View File

@ -13,6 +13,5 @@ bool assembleat(uint addr, const char* instruction)
if(XEDParseAssemble(&parse)==XEDPARSE_ERROR)
return false;
bool ret=memwrite(fdProcessInfo->hProcess, (void*)addr, parse.dest, parse.dest_size, 0);
GuiUpdateAllViews();
return ret;
}

View File

@ -50,7 +50,6 @@ bool bpnew(uint addr, bool enabled, bool singleshoot, short oldbytes, BP_TYPE ty
return false;
}
bpenumall(0); //update breakpoint list
dbsave();
GuiUpdateBreakpointsView();
return true;
}
@ -159,7 +158,6 @@ bool bpdel(uint addr, BP_TYPE type)
return false;
}
bpenumall(0); //update breakpoint list
dbsave();
GuiUpdateBreakpointsView();
return true;
}
@ -181,7 +179,6 @@ bool bpenable(uint addr, BP_TYPE type, bool enable)
return false;
}
bpenumall(0); //update breakpoint list
dbsave();
GuiUpdateBreakpointsView();
return true;
}
@ -204,7 +201,6 @@ bool bpsetname(uint addr, BP_TYPE type, const char* name)
return false;
}
bpenumall(0); //update breakpoint list
dbsave();
GuiUpdateBreakpointsView();
return true;
}

View File

@ -1192,16 +1192,16 @@ CMDRESULT cbDebugSetBPX(int argc, char* argv[]) //bp addr [,name [,type]]
dprintf("error setting breakpoint at "fhex"!\n (memread)", addr);
return STATUS_ERROR;
}
else if(!SetBPX(addr, type, (void*)cbUserBreakpoint))
{
dprintf("error setting breakpoint at "fhex"! (SetBPX)\n", addr);
return STATUS_ERROR;
}
else if(!bpnew(addr, true, singleshoot, oldbytes, BPNORMAL, type, bpname))
{
dprintf("error setting breakpoint at "fhex"!\n (bpnew)", addr);
return STATUS_ERROR;
}
else if(!SetBPX(addr, type, (void*)cbUserBreakpoint))
{
dprintf("error setting breakpoint at "fhex"! (SetBPX)\n", addr);
return STATUS_ERROR;
}
dprintf("breakpoint at "fhex" set!\n", addr);
GuiUpdateAllViews();
return STATUS_CONTINUE;
@ -1259,7 +1259,7 @@ CMDRESULT cbDebugDeleteBPX(int argc, char* argv[])
static bool cbEnableAllBreakpoints(const BREAKPOINT* bp)
{
if(!SetBPX(bp->addr, bp->titantype, (void*)cbUserBreakpoint) or !bpenable(bp->addr, BPNORMAL, true))
if(!bpenable(bp->addr, BPNORMAL, true) or !SetBPX(bp->addr, bp->titantype, (void*)cbUserBreakpoint))
{
dprintf("could not enable "fhex"\n", bp->addr);
return false;
@ -1286,7 +1286,7 @@ CMDRESULT cbDebugEnableBPX(int argc, char* argv[])
BREAKPOINT found;
if(bpget(0, BPNORMAL, arg1, &found)) //found a breakpoint with name
{
if(!SetBPX(found.addr, found.titantype, (void*)cbUserBreakpoint) or !bpenable(found.addr, BPNORMAL, true))
if(!bpenable(found.addr, BPNORMAL, true) or !SetBPX(found.addr, found.titantype, (void*)cbUserBreakpoint))
{
dprintf("could not enable "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1306,7 +1306,7 @@ CMDRESULT cbDebugEnableBPX(int argc, char* argv[])
GuiUpdateAllViews();
return STATUS_CONTINUE;
}
if(!SetBPX(found.addr, found.titantype, (void*)cbUserBreakpoint) or !bpenable(found.addr, BPNORMAL, true))
if(!bpenable(found.addr, BPNORMAL, true) or !SetBPX(found.addr, found.titantype, (void*)cbUserBreakpoint))
{
dprintf("could not enable "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1318,7 +1318,7 @@ CMDRESULT cbDebugEnableBPX(int argc, char* argv[])
static bool cbDisableAllBreakpoints(const BREAKPOINT* bp)
{
if(!DeleteBPX(bp->addr) or !bpenable(bp->addr, BPNORMAL, false))
if(!bpenable(bp->addr, BPNORMAL, false) or !DeleteBPX(bp->addr))
{
dprintf("could not disable "fhex"\n", bp->addr);
return false;
@ -1345,7 +1345,7 @@ CMDRESULT cbDebugDisableBPX(int argc, char* argv[])
BREAKPOINT found;
if(bpget(0, BPNORMAL, arg1, &found)) //found a breakpoint with name
{
if(!DeleteBPX(found.addr) or !bpenable(found.addr, BPNORMAL, false))
if(!bpenable(found.addr, BPNORMAL, false) or !DeleteBPX(found.addr))
{
dprintf("could not disable "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1364,7 +1364,7 @@ CMDRESULT cbDebugDisableBPX(int argc, char* argv[])
dputs("breakpoint already disabled!");
return STATUS_CONTINUE;
}
if(!DeleteBPX(found.addr) or !bpenable(found.addr, BPNORMAL, false))
if(!bpenable(found.addr, BPNORMAL, false) or !DeleteBPX(found.addr))
{
dprintf("could not disable "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1518,7 +1518,7 @@ CMDRESULT cbDebugSetMemoryBpx(int argc, char* argv[])
dputs("hardware breakpoint already set!");
return STATUS_CONTINUE;
}
if(!SetMemoryBPXEx(base, size, type, restore, (void*)cbMemoryBreakpoint) or !bpnew(base, true, singleshoot, 0, BPMEMORY, type, 0))
if(!bpnew(base, true, singleshoot, 0, BPMEMORY, type, 0) or !SetMemoryBPXEx(base, size, type, restore, (void*)cbMemoryBreakpoint))
{
dputs("error setting memory breakpoint!");
return STATUS_ERROR;
@ -1534,7 +1534,7 @@ static bool cbDeleteAllMemoryBreakpoints(const BREAKPOINT* bp)
return true;
uint size;
memfindbaseaddr(fdProcessInfo->hProcess, bp->addr, &size);
if(!RemoveMemoryBPX(bp->addr, size) or !bpdel(bp->addr, BPMEMORY))
if(!bpdel(bp->addr, BPMEMORY) or !RemoveMemoryBPX(bp->addr, size))
{
dprintf("delete memory breakpoint failed: "fhex"\n", bp->addr);
return STATUS_ERROR;
@ -1563,7 +1563,7 @@ CMDRESULT cbDebugDeleteMemoryBreakpoint(int argc, char* argv[])
{
uint size;
memfindbaseaddr(fdProcessInfo->hProcess, found.addr, &size);
if(!RemoveMemoryBPX(found.addr, size) or !bpdel(found.addr, BPMEMORY))
if(!bpdel(found.addr, BPMEMORY) or !RemoveMemoryBPX(found.addr, size))
{
dprintf("delete memory breakpoint failed: "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1578,7 +1578,7 @@ CMDRESULT cbDebugDeleteMemoryBreakpoint(int argc, char* argv[])
}
uint size;
memfindbaseaddr(fdProcessInfo->hProcess, found.addr, &size);
if(!RemoveMemoryBPX(found.addr, size) or !bpdel(found.addr, BPMEMORY))
if(!bpdel(found.addr, BPMEMORY) or !RemoveMemoryBPX(found.addr, size))
{
dprintf("delete memory breakpoint failed: "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1670,7 +1670,7 @@ CMDRESULT cbDebugSetHardwareBreakpoint(int argc, char* argv[])
dputs("hardware breakpoint already set!");
return STATUS_CONTINUE;
}
if(!SetHardwareBreakPoint(addr, drx, type, size, (void*)cbHardwareBreakpoint) or !bpnew(addr, true, false, 0, BPHARDWARE, titantype, 0))
if(!bpnew(addr, true, false, 0, BPHARDWARE, titantype, 0) or !SetHardwareBreakPoint(addr, drx, type, size, (void*)cbHardwareBreakpoint))
{
dputs("error setting hardware breakpoint!");
return STATUS_ERROR;
@ -1684,7 +1684,7 @@ static bool cbDeleteAllHardwareBreakpoints(const BREAKPOINT* bp)
{
if(!bp->enabled)
return true;
if(!DeleteHardwareBreakPoint((bp->titantype>>8)&0xF) or !bpdel(bp->addr, BPHARDWARE))
if(!bpdel(bp->addr, BPHARDWARE) or !DeleteHardwareBreakPoint((bp->titantype>>8)&0xF))
{
dprintf("delete hardware breakpoint failed: "fhex"\n", bp->addr);
return STATUS_ERROR;
@ -1711,7 +1711,7 @@ CMDRESULT cbDebugDeleteHardwareBreakpoint(int argc, char* argv[])
BREAKPOINT found;
if(bpget(0, BPHARDWARE, arg1, &found)) //found a breakpoint with name
{
if(!DeleteHardwareBreakPoint((found.titantype>>8)&0xF) or !bpdel(found.addr, BPHARDWARE))
if(!bpdel(found.addr, BPHARDWARE) or !DeleteHardwareBreakPoint((found.titantype>>8)&0xF))
{
dprintf("delete hardware breakpoint failed: "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1724,7 +1724,7 @@ CMDRESULT cbDebugDeleteHardwareBreakpoint(int argc, char* argv[])
dprintf("no such hardware breakpoint \"%s\"\n", arg1);
return STATUS_ERROR;
}
if(!DeleteHardwareBreakPoint((found.titantype>>8)&0xF) or !bpdel(found.addr, BPHARDWARE))
if(!bpdel(found.addr, BPHARDWARE) or !DeleteHardwareBreakPoint((found.titantype>>8)&0xF))
{
dprintf("delete hardware breakpoint failed: "fhex"\n", found.addr);
return STATUS_ERROR;
@ -1817,6 +1817,15 @@ CMDRESULT cbDebugMemset(int argc, char* argv[])
CMDRESULT cbBenchmark(int argc, char* argv[])
{
uint addr=GetContextData(UE_CIP);
DWORD ticks=GetTickCount();
char comment[MAX_COMMENT_SIZE]="";
for(uint i=addr; i<addr+100000; i++)
{
DbgGetCommentAt(i, comment);
}
//DbgGetCommentAt(addr+1493, comment);
dprintf("%ums\n", GetTickCount()-ticks);
return STATUS_CONTINUE;
}

View File

@ -259,6 +259,7 @@ CMDRESULT cbInstrCmtdel(int argc, char* argv[])
dputs("error deleting comment");
return STATUS_ERROR;
}
GuiUpdateAllViews();
return STATUS_CONTINUE;
}
@ -277,6 +278,7 @@ CMDRESULT cbInstrLbl(int argc, char* argv[])
dputs("error setting label");
return STATUS_ERROR;
}
GuiUpdateAllViews();
return STATUS_CONTINUE;
}
@ -380,6 +382,7 @@ CMDRESULT cbAssemble(int argc, char* argv[])
dprintf("failed to assemble \"%s\"\n", argv[2]);
return STATUS_ERROR;
}
GuiUpdateAllViews();
return STATUS_CONTINUE;
}
@ -400,6 +403,7 @@ CMDRESULT cbFunctionAdd(int argc, char* argv[])
return STATUS_ERROR;
}
dputs("function added!");
GuiUpdateAllViews();
return STATUS_CONTINUE;
}
@ -419,6 +423,7 @@ CMDRESULT cbFunctionDel(int argc, char* argv[])
return STATUS_ERROR;
}
dputs("function deleted!");
GuiUpdateAllViews();
return STATUS_CONTINUE;
}

View File

@ -495,6 +495,7 @@ void CPUDisassembly::setLabel()
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
msg.exec();
}
GuiUpdateAllViews();
}
void CPUDisassembly::setComment()
@ -518,6 +519,7 @@ void CPUDisassembly::setComment()
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
msg.exec();
}
GuiUpdateAllViews();
}
void CPUDisassembly::setBookmark()
@ -538,6 +540,7 @@ void CPUDisassembly::setBookmark()
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
msg.exec();
}
GuiUpdateAllViews();
}
void CPUDisassembly::toggleFunction()
@ -633,8 +636,7 @@ void CPUDisassembly::assembleAt()
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
msg.exec();
}
GuiUpdateAllViews();
}
void CPUDisassembly::gotoExpression()

View File

@ -234,6 +234,7 @@ void CPUDump::setLabelSlot()
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
msg.exec();
}
GuiUpdateAllViews();
}
void CPUDump::gotoExpressionSlot()