mirror of
https://github.com/x64dbg/x64dbg.git
synced 2025-02-23 14:31:06 +00:00
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:
parent
ad9c2d3ea2
commit
d2d0960bfd
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -234,6 +234,7 @@ void CPUDump::setLabelSlot()
|
||||
msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint));
|
||||
msg.exec();
|
||||
}
|
||||
GuiUpdateAllViews();
|
||||
}
|
||||
|
||||
void CPUDump::gotoExpressionSlot()
|
||||
|
Loading…
x
Reference in New Issue
Block a user