diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index c969b656..9d7ca5a1 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -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 ; 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(maxlencomment+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; diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index e96fb908..3f524053 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -8,7 +8,12 @@ #include "symbolinfo.h" sqlite3* userdb; -static std::vector 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().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; ihProcess, 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 endhProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)) //the function boundaries are not in the same mem page + if(!DbgIsDebugging() or endhProcess, 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 endhProcess, 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->startend>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) diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index 5f72515a..4d1e5375 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -2,13 +2,11 @@ #define _ADDRINFO_H #include "_global.h" +#include //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 ModulesInfo; +typedef std::map CommentsInfo; +typedef std::map LabelsInfo; +typedef std::map BookmarksInfo; +typedef std::vector FunctionsInfo; +typedef std::vector 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); diff --git a/x64_dbg_dbg/assemble.cpp b/x64_dbg_dbg/assemble.cpp index 03421a0e..117ffbb4 100644 --- a/x64_dbg_dbg/assemble.cpp +++ b/x64_dbg_dbg/assemble.cpp @@ -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; } diff --git a/x64_dbg_dbg/breakpoint.cpp b/x64_dbg_dbg/breakpoint.cpp index f209fd95..c1c14122 100644 --- a/x64_dbg_dbg/breakpoint.cpp +++ b/x64_dbg_dbg/breakpoint.cpp @@ -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; } diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 829505d1..5cadf44e 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -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