diff --git a/src/bridge/bridgemain.cpp b/src/bridge/bridgemain.cpp index 7b04596f..6390b5b5 100644 --- a/src/bridge/bridgemain.cpp +++ b/src/bridge/bridgemain.cpp @@ -701,6 +701,49 @@ BRIDGE_IMPEXP bool DbgFunctionDel(duint addr) return true; } +BRIDGE_IMPEXP bool DbgArgumentGet(duint addr, duint* start, duint* end) +{ + FUNCTION_LOOP_INFO info; + info.addr = addr; + if(!_dbg_sendmessage(DBG_ARGUMENT_GET, &info, 0)) + return false; + if(start) + *start = info.start; + if(end) + *end = info.end; + return true; +} + +BRIDGE_IMPEXP bool DbgArgumentOverlaps(duint start, duint end) +{ + FUNCTION_LOOP_INFO info; + info.start = start; + info.end = end; + if(!_dbg_sendmessage(DBG_ARGUMENT_OVERLAPS, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgArgumentAdd(duint start, duint end) +{ + FUNCTION_LOOP_INFO info; + info.start = start; + info.end = end; + info.manual = false; + if(!_dbg_sendmessage(DBG_ARGUMENT_ADD, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgArgumentDel(duint addr) +{ + FUNCTION_LOOP_INFO info; + info.addr = addr; + if(!_dbg_sendmessage(DBG_ARGUMENT_DEL, &info, 0)) + return false; + return true; +} + // FIXME depth BRIDGE_IMPEXP bool DbgLoopGet(int depth, duint addr, duint* start, duint* end) { @@ -886,7 +929,20 @@ BRIDGE_IMPEXP duint DbgGetTimeWastedCounter() BRIDGE_IMPEXP ARGTYPE DbgGetArgTypeAt(duint addr) { - return ARG_NONE; + ADDRINFO info; + memset(&info, 0, sizeof(info)); + info.flags = flagargs; + if(!_dbg_addrinfoget(addr, SEG_DEFAULT, &info)) + return ARG_NONE; + duint start = info.args.start; + duint end = info.args.end; + if(start == end || info.args.instrcount == 1) + return ARG_SINGLE; + else if(addr == start) + return ARG_BEGIN; + else if(addr == end) + return ARG_END; + return ARG_MIDDLE; } BRIDGE_IMPEXP void* DbgGetEncodeTypeBuffer(duint addr) @@ -934,7 +990,6 @@ BRIDGE_IMPEXP void GuiSetDebugState(DBGSTATE state) _gui_sendmessage(GUI_SET_DEBUG_STATE, (void*)state, 0); } - BRIDGE_IMPEXP void GuiAddLogMessage(const char* msg) { _gui_sendmessage(GUI_ADD_MSG_TO_LOG, (void*)msg, 0); @@ -966,7 +1021,6 @@ BRIDGE_IMPEXP bool GuiIsUpdateDisabled() return bDisableGUIUpdate; } - BRIDGE_IMPEXP void GuiUpdateAllViews() { CHEKC_GUI_UPDATE_DISABLED @@ -995,134 +1049,112 @@ BRIDGE_IMPEXP void GuiUpdateDisassemblyView() _gui_sendmessage(GUI_UPDATE_DISASSEMBLY_VIEW, 0, 0); } - BRIDGE_IMPEXP void GuiUpdateBreakpointsView() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_UPDATE_BREAKPOINTS_VIEW, 0, 0); } - BRIDGE_IMPEXP void GuiUpdateWindowTitle(const char* filename) { _gui_sendmessage(GUI_UPDATE_WINDOW_TITLE, (void*)filename, 0); } - BRIDGE_IMPEXP HWND GuiGetWindowHandle() { return (HWND)_gui_sendmessage(GUI_GET_WINDOW_HANDLE, 0, 0); } - BRIDGE_IMPEXP void GuiDumpAt(duint va) { _gui_sendmessage(GUI_DUMP_AT, (void*)va, 0); } - BRIDGE_IMPEXP void GuiScriptAdd(int count, const char** lines) { _gui_sendmessage(GUI_SCRIPT_ADD, (void*)(duint)count, (void*)lines); } - BRIDGE_IMPEXP void GuiScriptClear() { _gui_sendmessage(GUI_SCRIPT_CLEAR, 0, 0); } - BRIDGE_IMPEXP void GuiScriptSetIp(int line) { _gui_sendmessage(GUI_SCRIPT_SETIP, (void*)(duint)line, 0); } - BRIDGE_IMPEXP void GuiScriptError(int line, const char* message) { _gui_sendmessage(GUI_SCRIPT_ERROR, (void*)(duint)line, (void*)message); } - BRIDGE_IMPEXP void GuiScriptSetTitle(const char* title) { _gui_sendmessage(GUI_SCRIPT_SETTITLE, (void*)title, 0); } - BRIDGE_IMPEXP void GuiScriptSetInfoLine(int line, const char* info) { _gui_sendmessage(GUI_SCRIPT_SETINFOLINE, (void*)(duint)line, (void*)info); } - BRIDGE_IMPEXP void GuiScriptMessage(const char* message) { _gui_sendmessage(GUI_SCRIPT_MESSAGE, (void*)message, 0); } - BRIDGE_IMPEXP int GuiScriptMsgyn(const char* message) { return (int)(duint)_gui_sendmessage(GUI_SCRIPT_MSGYN, (void*)message, 0); } - BRIDGE_IMPEXP void GuiScriptEnableHighlighting(bool enable) { _gui_sendmessage(GUI_SCRIPT_ENABLEHIGHLIGHTING, (void*)(duint)enable, 0); } - BRIDGE_IMPEXP void GuiSymbolLogAdd(const char* message) { _gui_sendmessage(GUI_SYMBOL_LOG_ADD, (void*)message, 0); } - BRIDGE_IMPEXP void GuiSymbolLogClear() { _gui_sendmessage(GUI_SYMBOL_LOG_CLEAR, 0, 0); } - BRIDGE_IMPEXP void GuiSymbolSetProgress(int percent) { _gui_sendmessage(GUI_SYMBOL_SET_PROGRESS, (void*)(duint)percent, 0); } - BRIDGE_IMPEXP void GuiSymbolUpdateModuleList(int count, SYMBOLMODULEINFO* modules) { _gui_sendmessage(GUI_SYMBOL_UPDATE_MODULE_LIST, (void*)(duint)count, (void*)modules); } - BRIDGE_IMPEXP void GuiReferenceAddColumn(int width, const char* title) { _gui_sendmessage(GUI_REF_ADDCOLUMN, (void*)(duint)width, (void*)title); } - BRIDGE_IMPEXP void GuiSymbolRefreshCurrent() { _gui_sendmessage(GUI_SYMBOL_REFRESH_CURRENT, 0, 0); } - BRIDGE_IMPEXP void GuiReferenceSetRowCount(int count) { _gui_sendmessage(GUI_REF_SETROWCOUNT, (void*)(duint)count, 0); } - BRIDGE_IMPEXP int GuiReferenceGetRowCount() { return (int)(duint)_gui_sendmessage(GUI_REF_GETROWCOUNT, 0, 0); } - BRIDGE_IMPEXP void GuiReferenceDeleteAllColumns() { _gui_sendmessage(GUI_REF_DELETEALLCOLUMNS, 0, 0); @@ -1142,25 +1174,21 @@ BRIDGE_IMPEXP void GuiReferenceSetCellContent(int row, int col, const char* str) _gui_sendmessage(GUI_REF_SETCELLCONTENT, &info, 0); } - BRIDGE_IMPEXP const char* GuiReferenceGetCellContent(int row, int col) { return (const char*)_gui_sendmessage(GUI_REF_GETCELLCONTENT, (void*)(duint)row, (void*)(duint)col); } - BRIDGE_IMPEXP void GuiReferenceReloadData() { _gui_sendmessage(GUI_REF_RELOADDATA, 0, 0); } - BRIDGE_IMPEXP void GuiReferenceSetSingleSelection(int index, bool scroll) { _gui_sendmessage(GUI_REF_SETSINGLESELECTION, (void*)(duint)index, (void*)(duint)scroll); } - BRIDGE_IMPEXP void GuiReferenceSetProgress(int progress) { _gui_sendmessage(GUI_REF_SETPROGRESS, (void*)(duint)progress, 0); @@ -1176,139 +1204,117 @@ BRIDGE_IMPEXP void GuiReferenceSetSearchStartCol(int col) _gui_sendmessage(GUI_REF_SETSEARCHSTARTCOL, (void*)(duint)col, 0); } - BRIDGE_IMPEXP void GuiStackDumpAt(duint addr, duint csp) { _gui_sendmessage(GUI_STACK_DUMP_AT, (void*)addr, (void*)csp); } - BRIDGE_IMPEXP void GuiUpdateDumpView() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_UPDATE_DUMP_VIEW, 0, 0); } - BRIDGE_IMPEXP void GuiUpdateMemoryView() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_UPDATE_MEMORY_VIEW, 0, 0); } - BRIDGE_IMPEXP void GuiUpdateThreadView() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_UPDATE_THREAD_VIEW, 0, 0); } - BRIDGE_IMPEXP void GuiAddRecentFile(const char* file) { _gui_sendmessage(GUI_ADD_RECENT_FILE, (void*)file, 0); } - BRIDGE_IMPEXP void GuiSetLastException(unsigned int exception) { _gui_sendmessage(GUI_SET_LAST_EXCEPTION, (void*)(duint)exception, 0); } - BRIDGE_IMPEXP bool GuiGetDisassembly(duint addr, char* text) { return !!_gui_sendmessage(GUI_GET_DISASSEMBLY, (void*)addr, text); } - BRIDGE_IMPEXP int GuiMenuAdd(int hMenu, const char* title) { return (int)(duint)_gui_sendmessage(GUI_MENU_ADD, (void*)(duint)hMenu, (void*)title); } - BRIDGE_IMPEXP int GuiMenuAddEntry(int hMenu, const char* title) { return (int)(duint)_gui_sendmessage(GUI_MENU_ADD_ENTRY, (void*)(duint)hMenu, (void*)title); } - BRIDGE_IMPEXP void GuiMenuAddSeparator(int hMenu) { _gui_sendmessage(GUI_MENU_ADD_SEPARATOR, (void*)(duint)hMenu, 0); } - BRIDGE_IMPEXP void GuiMenuClear(int hMenu) { _gui_sendmessage(GUI_MENU_CLEAR, (void*)(duint)hMenu, 0); } - BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection) { return !!_gui_sendmessage(GUI_SELECTION_GET, (void*)(duint)hWindow, selection); } - BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection) { return !!_gui_sendmessage(GUI_SELECTION_SET, (void*)(duint)hWindow, (void*)selection); } - BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text) { return !!_gui_sendmessage(GUI_GETLINE_WINDOW, (void*)title, text); } - BRIDGE_IMPEXP void GuiAutoCompleteAddCmd(const char* cmd) { _gui_sendmessage(GUI_AUTOCOMPLETE_ADDCMD, (void*)cmd, 0); } - BRIDGE_IMPEXP void GuiAutoCompleteDelCmd(const char* cmd) { _gui_sendmessage(GUI_AUTOCOMPLETE_DELCMD, (void*)cmd, 0); } - BRIDGE_IMPEXP void GuiAutoCompleteClearAll() { _gui_sendmessage(GUI_AUTOCOMPLETE_CLEARALL, 0, 0); } - BRIDGE_IMPEXP void GuiAddStatusBarMessage(const char* msg) { _gui_sendmessage(GUI_ADD_MSG_TO_STATUSBAR, (void*)msg, 0); } - BRIDGE_IMPEXP void GuiUpdateSideBar() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_UPDATE_SIDEBAR, 0, 0); } - BRIDGE_IMPEXP void GuiRepaintTableView() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_REPAINT_TABLE_VIEW, 0, 0); } - BRIDGE_IMPEXP void GuiUpdatePatches() { CHEKC_GUI_UPDATE_DISABLED _gui_sendmessage(GUI_UPDATE_PATCHES, 0, 0); } - BRIDGE_IMPEXP void GuiUpdateCallStack() { CHEKC_GUI_UPDATE_DISABLED diff --git a/src/bridge/bridgemain.h b/src/bridge/bridgemain.h index 582dfe01..2ff8471f 100644 --- a/src/bridge/bridgemain.h +++ b/src/bridge/bridgemain.h @@ -100,7 +100,8 @@ typedef enum flagcomment = 4, flagbookmark = 8, flagfunction = 16, - flagloop = 32 + flagloop = 32, + flagargs = 64 } ADDRINFOFLAGS; typedef enum @@ -143,7 +144,8 @@ typedef enum ARG_NONE, ARG_BEGIN, ARG_MIDDLE, - ARG_END + ARG_END, + ARG_SINGLE } ARGTYPE; typedef enum @@ -208,6 +210,10 @@ typedef enum DBG_ENCODE_SIZE_GET, // param1=duint addr, param2=duint codesize DBG_DELETE_ENCODE_TYPE_SEG, // param1=duint addr, param2=unused DBG_RELEASE_ENCODE_TYPE_BUFFER, // param1=void* buffer, param2=unused + DBG_ARGUMENT_GET, // param1=FUNCTION* info, param2=unused + DBG_ARGUMENT_OVERLAPS, // param1=FUNCTION* info, param2=unused + DBG_ARGUMENT_ADD, // param1=FUNCTION* info, param2=unused + DBG_ARGUMENT_DEL, // param1=FUNCTION* info, param2=unused } DBGMSG; typedef enum @@ -407,6 +413,7 @@ typedef struct bool isbookmark; FUNCTION function; LOOP loop; + FUNCTION args; } ADDRINFO; #endif @@ -762,6 +769,10 @@ BRIDGE_IMPEXP bool DbgFunctionGet(duint addr, duint* start, duint* end); BRIDGE_IMPEXP bool DbgFunctionOverlaps(duint start, duint end); BRIDGE_IMPEXP bool DbgFunctionAdd(duint start, duint end); BRIDGE_IMPEXP bool DbgFunctionDel(duint addr); +BRIDGE_IMPEXP bool DbgArgumentGet(duint addr, duint* start, duint* end); +BRIDGE_IMPEXP bool DbgArgumentOverlaps(duint start, duint end); +BRIDGE_IMPEXP bool DbgArgumentAdd(duint start, duint end); +BRIDGE_IMPEXP bool DbgArgumentDel(duint addr); BRIDGE_IMPEXP bool DbgLoopGet(int depth, duint addr, duint* start, duint* end); BRIDGE_IMPEXP bool DbgLoopOverlaps(int depth, duint start, duint end); BRIDGE_IMPEXP bool DbgLoopAdd(duint start, duint end); @@ -1010,7 +1021,6 @@ BRIDGE_IMPEXP bool GuiIsUpdateDisabled(); BRIDGE_IMPEXP void GuiUpdateEnable(bool updateNow); BRIDGE_IMPEXP void GuiUpdateDisable(); - #ifdef __cplusplus } #endif diff --git a/src/dbg/_exports.cpp b/src/dbg/_exports.cpp index edd703b7..b40fbb77 100644 --- a/src/dbg/_exports.cpp +++ b/src/dbg/_exports.cpp @@ -31,6 +31,7 @@ #include "stringformat.h" #include "xrefs.h" #include "encodemap.h" +#include "argument.h" static bool bOnlyCipAutoComments = false; @@ -204,6 +205,11 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR if(LoopGet(addrinfo->loop.depth, addr, &addrinfo->loop.start, &addrinfo->loop.end)) retval = true; } + if(addrinfo->flags & flagargs) + { + if(ArgumentGet(addr, &addrinfo->args.start, &addrinfo->args.end, &addrinfo->function.instrcount)) + retval = true; + } if(addrinfo->flags & flagcomment) { *addrinfo->comment = 0; @@ -921,6 +927,34 @@ extern "C" DLL_EXPORT duint _dbg_sendmessage(DBGMSG type, void* param1, void* pa } break; + case DBG_ARGUMENT_GET: + { + FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; + return (duint)ArgumentGet(info->addr, &info->start, &info->end); + } + break; + + case DBG_ARGUMENT_OVERLAPS: + { + FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; + return (duint)ArgumentOverlaps(info->start, info->end); + } + break; + + case DBG_ARGUMENT_ADD: + { + FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; + return (duint)ArgumentAdd(info->start, info->end, info->manual); + } + break; + + case DBG_ARGUMENT_DEL: + { + FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; + return (duint)ArgumentDelete(info->addr); + } + break; + case DBG_LOOP_GET: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; diff --git a/src/dbg/argument.cpp b/src/dbg/argument.cpp index 85a78527..8889e6e0 100644 --- a/src/dbg/argument.cpp +++ b/src/dbg/argument.cpp @@ -157,3 +157,8 @@ bool ArgumentGetInfo(duint Address, ARGUMENTSINFO & info) { return arguments.Get(Arguments::VaKey(Address, Address), info); } + +bool ArgumentEnum(ARGUMENTSINFO* List, size_t* Size) +{ + return arguments.Enum(List, Size); +} \ No newline at end of file diff --git a/src/dbg/argument.h b/src/dbg/argument.h index 44035334..a6796447 100644 --- a/src/dbg/argument.h +++ b/src/dbg/argument.h @@ -22,5 +22,6 @@ void ArgumentCacheLoad(JSON Root); void ArgumentClear(); void ArgumentGetList(std::vector & list); bool ArgumentGetInfo(duint Address, ARGUMENTSINFO & info); +bool ArgumentEnum(ARGUMENTSINFO* List, size_t* Size); #endif // _ARGUMENT_H \ No newline at end of file diff --git a/src/dbg/database.cpp b/src/dbg/database.cpp index c6bfc43f..bd42ff9b 100644 --- a/src/dbg/database.cpp +++ b/src/dbg/database.cpp @@ -21,6 +21,7 @@ #include "TraceRecord.h" #include "encodemap.h" #include "plugin_loader.h" +#include "argument.h" /** \brief Directory where program databases are stored (usually in \db). UTF-8 encoding. @@ -52,6 +53,7 @@ void DbSave(DbLoadSaveType saveType) LabelCacheSave(root); BookmarkCacheSave(root); FunctionCacheSave(root); + ArgumentCacheSave(root); LoopCacheSave(root); XrefCacheSave(root); EncodeMapCacheSave(root); @@ -188,6 +190,7 @@ void DbLoad(DbLoadSaveType loadType) LabelCacheLoad(root); BookmarkCacheLoad(root); FunctionCacheLoad(root); + ArgumentCacheLoad(root); LoopCacheLoad(root); XrefCacheLoad(root); EncodeMapCacheLoad(root); diff --git a/src/dbg/instruction.cpp b/src/dbg/instruction.cpp index 7b4d66f0..c8559f11 100644 --- a/src/dbg/instruction.cpp +++ b/src/dbg/instruction.cpp @@ -40,6 +40,7 @@ #include "advancedanalysis.h" #include "exhandlerinfo.h" #include "symbolinfo.h" +#include "argument.h" static bool bRefinit = false; static int maxFindResults = 5000; @@ -521,6 +522,55 @@ CMDRESULT cbInstrFunctionClear(int argc, char* argv[]) return STATUS_CONTINUE; } +CMDRESULT cbInstrArgumentAdd(int argc, char* argv[]) +{ + if(argc < 3) + { + dputs("not enough arguments!"); + return STATUS_ERROR; + } + duint start = 0; + duint end = 0; + if(!valfromstring(argv[1], &start, false) || !valfromstring(argv[2], &end, false)) + return STATUS_ERROR; + if(!ArgumentAdd(start, end, true)) + { + dputs("failed to add argument"); + return STATUS_ERROR; + } + dputs("argument added!"); + GuiUpdateAllViews(); + return STATUS_CONTINUE; +} + +CMDRESULT cbInstrArgumentDel(int argc, char* argv[]) +{ + if(argc < 2) + { + dputs("not enough arguments!"); + return STATUS_ERROR; + } + duint addr = 0; + if(!valfromstring(argv[1], &addr, false)) + return STATUS_ERROR; + if(!ArgumentDelete(addr)) + { + dputs("failed to delete argument"); + return STATUS_ERROR; + } + dputs("argument deleted!"); + GuiUpdateAllViews(); + return STATUS_CONTINUE; +} + +CMDRESULT cbInstrArgumentClear(int argc, char* argv[]) +{ + ArgumentClear(); + GuiUpdateAllViews(); + dputs("all arguments deleted!"); + return STATUS_CONTINUE; +} + CMDRESULT cbInstrCmp(int argc, char* argv[]) { if(argc < 3) @@ -1597,6 +1647,52 @@ CMDRESULT cbInstrFunctionList(int argc, char* argv[]) return STATUS_CONTINUE; } +CMDRESULT cbInstrArgumentList(int argc, char* argv[]) +{ + //setup reference view + GuiReferenceInitialize("Arguments"); + GuiReferenceAddColumn(2 * sizeof(duint), "Start"); + GuiReferenceAddColumn(2 * sizeof(duint), "End"); + GuiReferenceAddColumn(64, "Disassembly (Start)"); + GuiReferenceAddColumn(0, "Label/Comment"); + GuiReferenceReloadData(); + size_t cbsize; + ArgumentEnum(0, &cbsize); + if(!cbsize) + { + dputs("No arguments"); + return STATUS_CONTINUE; + } + Memory arguments(cbsize, "cbInstrArgumentList:arguments"); + ArgumentEnum(arguments(), 0); + int count = (int)(cbsize / sizeof(ARGUMENTSINFO)); + for(int i = 0; i < count; i++) + { + GuiReferenceSetRowCount(i + 1); + char addrText[20] = ""; + sprintf(addrText, "%p", arguments()[i].start); + GuiReferenceSetCellContent(i, 0, addrText); + sprintf(addrText, "%p", arguments()[i].end); + GuiReferenceSetCellContent(i, 1, addrText); + char disassembly[GUI_MAX_DISASSEMBLY_SIZE] = ""; + if(GuiGetDisassembly(arguments()[i].start, disassembly)) + GuiReferenceSetCellContent(i, 2, disassembly); + char label[MAX_LABEL_SIZE] = ""; + if(LabelGet(arguments()[i].start, label)) + GuiReferenceSetCellContent(i, 3, label); + else + { + char comment[MAX_COMMENT_SIZE] = ""; + if(CommentGet(arguments()[i].start, comment)) + GuiReferenceSetCellContent(i, 3, comment); + } + } + varset("$result", count, false); + dprintf("%d argument(s) listed\n", count); + GuiReferenceReloadData(); + return STATUS_CONTINUE; +} + CMDRESULT cbInstrLoopList(int argc, char* argv[]) { //setup reference view diff --git a/src/dbg/instruction.h b/src/dbg/instruction.h index 2be35704..42ec5c96 100644 --- a/src/dbg/instruction.h +++ b/src/dbg/instruction.h @@ -22,6 +22,9 @@ CMDRESULT cbInstrAssemble(int argc, char* argv[]); CMDRESULT cbInstrFunctionAdd(int argc, char* argv[]); CMDRESULT cbInstrFunctionDel(int argc, char* argv[]); CMDRESULT cbInstrFunctionClear(int argc, char* argv[]); +CMDRESULT cbInstrArgumentAdd(int argc, char* argv[]); +CMDRESULT cbInstrArgumentDel(int argc, char* argv[]); +CMDRESULT cbInstrArgumentClear(int argc, char* argv[]); CMDRESULT cbInstrCmp(int argc, char* argv[]); CMDRESULT cbInstrGpa(int argc, char* argv[]); @@ -62,6 +65,7 @@ CMDRESULT cbInstrCommentList(int argc, char* argv[]); CMDRESULT cbInstrLabelList(int argc, char* argv[]); CMDRESULT cbInstrBookmarkList(int argc, char* argv[]); CMDRESULT cbInstrFunctionList(int argc, char* argv[]); +CMDRESULT cbInstrArgumentList(int argc, char* argv[]); CMDRESULT cbInstrLoopList(int argc, char* argv[]); CMDRESULT cbInstrSleep(int argc, char* argv[]); CMDRESULT cbInstrFindAsm(int argc, char* argv[]); diff --git a/src/dbg/x64_dbg.cpp b/src/dbg/x64_dbg.cpp index 96e7cf9e..d0b8b78c 100644 --- a/src/dbg/x64_dbg.cpp +++ b/src/dbg/x64_dbg.cpp @@ -198,11 +198,15 @@ static void registercommands() dbgcmdnew("loaddb\1dbload", cbInstrLoaddb, true); //load program database dbgcmdnew("functionadd\1func", cbInstrFunctionAdd, true); //function dbgcmdnew("functiondel\1funcc", cbInstrFunctionDel, true); //function + dbgcmdnew("functionlist", cbInstrFunctionList, true); //list functions + dbgcmdnew("functionclear", cbInstrFunctionClear, false); //delete all functions dbgcmdnew("commentlist", cbInstrCommentList, true); //list comments dbgcmdnew("labellist", cbInstrLabelList, true); //list labels dbgcmdnew("bookmarklist", cbInstrBookmarkList, true); //list bookmarks - dbgcmdnew("functionlist", cbInstrFunctionList, true); //list functions - dbgcmdnew("functionclear", cbInstrFunctionClear, false); //delete all functions + dbgcmdnew("argumentadd\1func", cbInstrArgumentAdd, true); //argument + dbgcmdnew("argumentdel\1funcc", cbInstrArgumentDel, true); //argument + dbgcmdnew("argumentlist", cbInstrArgumentList, true); //list arguments + dbgcmdnew("argumentclear", cbInstrArgumentClear, false); //delete all arguments //memory operations dbgcmdnew("alloc", cbDebugAlloc, true); //allocate memory