BRIDGE+DBG: fully support arguments (#536)
This commit is contained in:
parent
089a593405
commit
ad7a680126
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -22,5 +22,6 @@ void ArgumentCacheLoad(JSON Root);
|
|||
void ArgumentClear();
|
||||
void ArgumentGetList(std::vector<ARGUMENTSINFO> & list);
|
||||
bool ArgumentGetInfo(duint Address, ARGUMENTSINFO & info);
|
||||
bool ArgumentEnum(ARGUMENTSINFO* List, size_t* Size);
|
||||
|
||||
#endif // _ARGUMENT_H
|
|
@ -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);
|
||||
|
|
|
@ -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<ARGUMENTSINFO*> 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
|
||||
|
|
|
@ -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[]);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue