1
0
Fork 0

DBG: small cleanup in scriptapi and added 'scriptdll' command

This commit is contained in:
mrexodia 2016-02-24 00:15:09 +01:00
parent 45899f70d2
commit f9e5d54346
13 changed files with 66 additions and 53 deletions

View File

@ -5,7 +5,7 @@ typedef struct
{
int count; //Number of element in the list.
size_t size; //Size of list in bytes (used for type checking).
void* data; //Pointer to the list contents. Must be deleted by the caller using BridgeFree (or List::Free).
void* data; //Pointer to the list contents. Must be deleted by the caller using BridgeFree (or BridgeList::Free).
} ListInfo;
#define ListOf(Type) ListInfo*
@ -16,25 +16,25 @@ typedef struct
/**
\brief A list object. This object is NOT thread safe.
\tparam Type List contents type.
\tparam Type BridgeList contents type.
*/
template<typename Type>
class List
class BridgeList
{
public:
/**
\brief List constructor.
\brief BridgeList constructor.
\param _freeData (Optional) the free function.
*/
explicit List()
explicit BridgeList()
{
memset(&_listInfo, 0, sizeof(_listInfo));
}
/**
\brief List destructor.
\brief BridgeList destructor.
*/
~List()
~BridgeList()
{
Cleanup();
}

View File

@ -51,7 +51,7 @@ SCRIPT_EXPORT void Script::Bookmark::Clear()
BookmarkClear();
}
SCRIPT_EXPORT bool Script::Bookmark::GetList(ListOf(CommentInfo) listInfo)
SCRIPT_EXPORT bool Script::Bookmark::GetList(ListOf(BookmarkInfo) list)
{
std::vector<BOOKMARKSINFO> bookmarkList;
BookmarkGetList(bookmarkList);
@ -65,5 +65,5 @@ SCRIPT_EXPORT bool Script::Bookmark::GetList(ListOf(CommentInfo) listInfo)
scriptComment.manual = bookmark.manual;
bookmarkScriptList.push_back(scriptComment);
}
return List<BookmarkInfo>::CopyData(listInfo, bookmarkScriptList);
return BridgeList<BookmarkInfo>::CopyData(list, bookmarkScriptList);
}

View File

@ -21,7 +21,7 @@ namespace Script
SCRIPT_EXPORT bool Delete(duint addr);
SCRIPT_EXPORT void DeleteRange(duint start, duint end);
SCRIPT_EXPORT void Clear();
SCRIPT_EXPORT bool GetList(ListOf(BookmarkInfo) listInfo); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetList(ListOf(BookmarkInfo) list); //caller has the responsibility to free the list
}; //Bookmark
}; //Script

View File

@ -52,7 +52,7 @@ SCRIPT_EXPORT void Script::Comment::Clear()
CommentClear();
}
SCRIPT_EXPORT bool Script::Comment::GetList(ListOf(CommentInfo) listInfo)
SCRIPT_EXPORT bool Script::Comment::GetList(ListOf(CommentInfo) list)
{
std::vector<COMMENTSINFO> commentList;
CommentGetList(commentList);
@ -67,5 +67,5 @@ SCRIPT_EXPORT bool Script::Comment::GetList(ListOf(CommentInfo) listInfo)
scriptComment.manual = comment.manual;
commentScriptList.push_back(scriptComment);
}
return List<CommentInfo>::CopyData(listInfo, commentScriptList);
return BridgeList<CommentInfo>::CopyData(list, commentScriptList);
}

View File

@ -22,7 +22,7 @@ namespace Script
SCRIPT_EXPORT bool Delete(duint addr);
SCRIPT_EXPORT void DeleteRange(duint start, duint end);
SCRIPT_EXPORT void Clear();
SCRIPT_EXPORT bool GetList(ListOf(CommentInfo) listInfo); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetList(ListOf(CommentInfo) list); //caller has the responsibility to free the list
}; //Comment
}; //Script

View File

@ -58,7 +58,7 @@ SCRIPT_EXPORT void Script::Function::Clear()
FunctionClear();
}
SCRIPT_EXPORT bool Script::Function::GetList(ListOf(FunctionInfo) listInfo)
SCRIPT_EXPORT bool Script::Function::GetList(ListOf(FunctionInfo) list)
{
std::vector<FUNCTIONSINFO> functionList;
FunctionGetList(functionList);
@ -74,5 +74,5 @@ SCRIPT_EXPORT bool Script::Function::GetList(ListOf(FunctionInfo) listInfo)
scriptFunction.instructioncount = function.instructioncount;
functionScriptList.push_back(scriptFunction);
}
return List<FunctionInfo>::CopyData(listInfo, functionScriptList);
return BridgeList<FunctionInfo>::CopyData(list, functionScriptList);
}

View File

@ -24,7 +24,7 @@ namespace Script
SCRIPT_EXPORT bool Delete(duint address);
SCRIPT_EXPORT void DeleteRange(duint start, duint end);
SCRIPT_EXPORT void Clear();
SCRIPT_EXPORT bool GetList(ListOf(FunctionInfo) listInfo); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetList(ListOf(FunctionInfo) list); //caller has the responsibility to free the list
}; //Function
}; //Script

View File

@ -57,7 +57,7 @@ SCRIPT_EXPORT void Script::Label::Clear()
LabelClear();
}
SCRIPT_EXPORT bool Script::Label::GetList(ListOf(LabelInfo) listInfo)
SCRIPT_EXPORT bool Script::Label::GetList(ListOf(LabelInfo) list)
{
std::vector<LABELSINFO> labelList;
LabelGetList(labelList);
@ -72,5 +72,5 @@ SCRIPT_EXPORT bool Script::Label::GetList(ListOf(LabelInfo) listInfo)
scriptLabel.manual = label.manual;
labelScriptList.push_back(scriptLabel);
}
return List<LabelInfo>::CopyData(listInfo, labelScriptList);
return BridgeList<LabelInfo>::CopyData(list, labelScriptList);
}

View File

@ -23,7 +23,7 @@ namespace Script
SCRIPT_EXPORT bool Delete(duint addr);
SCRIPT_EXPORT void DeleteRange(duint start, duint end);
SCRIPT_EXPORT void Clear();
SCRIPT_EXPORT bool GetList(ListOf(LabelInfo) listInfo); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetList(ListOf(LabelInfo) list); //caller has the responsibility to free the list
}; //Label
}; //Script

View File

@ -3,10 +3,10 @@
#include "module.h"
#include "debugger.h"
SCRIPT_EXPORT bool Script::Module::InfoFromAddr(duint addr, Script::Module::ModuleInfo* info)
SCRIPT_EXPORT bool Script::Module::InfoFromAddr(duint addr, ModuleInfo* info)
{
SHARED_ACQUIRE(LockModules);
MODINFO* modInfo = ModInfoFromAddr(addr);
auto modInfo = ModInfoFromAddr(addr);
if(!info || !modInfo)
return false;
info->base = modInfo->base;
@ -19,9 +19,9 @@ SCRIPT_EXPORT bool Script::Module::InfoFromAddr(duint addr, Script::Module::Modu
return true;
}
SCRIPT_EXPORT bool Script::Module::InfoFromName(const char* name, Script::Module::ModuleInfo* info)
SCRIPT_EXPORT bool Script::Module::InfoFromName(const char* name, ModuleInfo* info)
{
return Module::InfoFromAddr(Module::BaseFromName(name), info);
return InfoFromAddr(BaseFromName(name), info);
}
SCRIPT_EXPORT duint Script::Module::BaseFromAddr(duint addr)
@ -41,7 +41,7 @@ SCRIPT_EXPORT duint Script::Module::SizeFromAddr(duint addr)
SCRIPT_EXPORT duint Script::Module::SizeFromName(const char* name)
{
return Module::SizeFromAddr(Module::BaseFromName(name));
return SizeFromAddr(BaseFromName(name));
}
SCRIPT_EXPORT bool Script::Module::NameFromAddr(duint addr, char* name)
@ -56,7 +56,7 @@ SCRIPT_EXPORT bool Script::Module::PathFromAddr(duint addr, char* path)
SCRIPT_EXPORT bool Script::Module::PathFromName(const char* name, char* path)
{
return Module::PathFromAddr(Module::BaseFromName(name), path);
return PathFromAddr(BaseFromName(name), path);
}
SCRIPT_EXPORT duint Script::Module::EntryFromAddr(duint addr)
@ -66,28 +66,28 @@ SCRIPT_EXPORT duint Script::Module::EntryFromAddr(duint addr)
SCRIPT_EXPORT duint Script::Module::EntryFromName(const char* name)
{
return Module::EntryFromAddr(Module::BaseFromName(name));
return EntryFromAddr(BaseFromName(name));
}
SCRIPT_EXPORT int Script::Module::SectionCountFromAddr(duint addr)
{
SHARED_ACQUIRE(LockModules);
MODINFO* modInfo = ModInfoFromAddr(addr);
auto modInfo = ModInfoFromAddr(addr);
return modInfo ? int(modInfo->sections.size()) : 0;
}
SCRIPT_EXPORT int Script::Module::SectionCountFromName(const char* name)
{
return Module::SectionCountFromAddr(Module::BaseFromName(name));
return SectionCountFromAddr(BaseFromName(name));
}
SCRIPT_EXPORT bool Script::Module::SectionFromAddr(duint addr, int number, ModuleSectionInfo* section)
{
SHARED_ACQUIRE(LockModules);
MODINFO* modInfo = ModInfoFromAddr(addr);
auto modInfo = ModInfoFromAddr(addr);
if(!section || !modInfo || number < 0 || number >= int(modInfo->sections.size()))
return false;
const MODSECTIONINFO & secInfo = modInfo->sections.at(number);
const auto & secInfo = modInfo->sections.at(number);
section->addr = secInfo.addr;
section->size = secInfo.size;
strcpy_s(section->name, secInfo.name);
@ -96,13 +96,13 @@ SCRIPT_EXPORT bool Script::Module::SectionFromAddr(duint addr, int number, Modul
SCRIPT_EXPORT bool Script::Module::SectionFromName(const char* name, int number, ModuleSectionInfo* section)
{
return Module::SectionFromAddr(Module::BaseFromName(name), number, section);
return SectionFromAddr(BaseFromName(name), number, section);
}
SCRIPT_EXPORT bool Script::Module::SectionListFromAddr(duint addr, ListOf(ModuleSectionInfo) listInfo)
SCRIPT_EXPORT bool Script::Module::SectionListFromAddr(duint addr, ListOf(ModuleSectionInfo) list)
{
SHARED_ACQUIRE(LockModules);
MODINFO* modInfo = ModInfoFromAddr(addr);
auto modInfo = ModInfoFromAddr(addr);
if(!modInfo)
return false;
std::vector<ModuleSectionInfo> scriptSectionList;
@ -115,17 +115,17 @@ SCRIPT_EXPORT bool Script::Module::SectionListFromAddr(duint addr, ListOf(Module
strcpy_s(scriptSection.name, section.name);
scriptSectionList.push_back(scriptSection);
}
return List<ModuleSectionInfo>::CopyData(listInfo, scriptSectionList);
return BridgeList<ModuleSectionInfo>::CopyData(list, scriptSectionList);
}
SCRIPT_EXPORT bool Script::Module::SectionListFromName(const char* name, ListOf(ModuleSectionInfo) listInfo)
SCRIPT_EXPORT bool Script::Module::SectionListFromName(const char* name, ListOf(ModuleSectionInfo) list)
{
return Module::SectionListFromAddr(Module::BaseFromName(name), listInfo);
return SectionListFromAddr(BaseFromName(name), list);
}
SCRIPT_EXPORT bool Script::Module::GetMainModuleInfo(ModuleInfo* info)
{
return Module::InfoFromAddr(Module::GetMainModuleBase(), info);
return InfoFromAddr(GetMainModuleBase(), info);
}
SCRIPT_EXPORT duint Script::Module::GetMainModuleBase()
@ -135,35 +135,35 @@ SCRIPT_EXPORT duint Script::Module::GetMainModuleBase()
SCRIPT_EXPORT duint Script::Module::GetMainModuleSize()
{
return Module::SizeFromAddr(Module::GetMainModuleBase());
return SizeFromAddr(GetMainModuleBase());
}
SCRIPT_EXPORT duint Script::Module::GetMainModuleEntry()
{
return Module::EntryFromAddr(Module::GetMainModuleBase());
return EntryFromAddr(GetMainModuleBase());
}
SCRIPT_EXPORT int Script::Module::GetMainModuleSectionCount()
{
return Module::SectionCountFromAddr(Module::GetMainModuleBase());
return SectionCountFromAddr(GetMainModuleBase());
}
SCRIPT_EXPORT bool Script::Module::GetMainModuleName(char* name)
{
return Module::NameFromAddr(Module::GetMainModuleBase(), name);
return NameFromAddr(GetMainModuleBase(), name);
}
SCRIPT_EXPORT bool Script::Module::GetMainModulePath(char* path)
{
return Module::PathFromAddr(Module::GetMainModuleBase(), path);
return PathFromAddr(GetMainModuleBase(), path);
}
SCRIPT_EXPORT bool Script::Module::GetMainModuleSectionList(ListOf(ModuleSectionInfo) listInfo)
SCRIPT_EXPORT bool Script::Module::GetMainModuleSectionList(ListOf(ModuleSectionInfo) list)
{
return Module::SectionListFromAddr(Module::GetMainModuleBase(), listInfo);
return SectionListFromAddr(GetMainModuleBase(), list);
}
SCRIPT_EXPORT bool Script::Module::GetList(ListOf(ModuleInfo) listInfo)
SCRIPT_EXPORT bool Script::Module::GetList(ListOf(ModuleInfo) list)
{
std::vector<MODINFO> modList;
ModGetList(modList);
@ -181,5 +181,5 @@ SCRIPT_EXPORT bool Script::Module::GetList(ListOf(ModuleInfo) listInfo)
strcpy_s(scriptMod.path, mod.path);
modScriptList.push_back(scriptMod);
}
return List<ModuleInfo>::CopyData(listInfo, modScriptList);
return BridgeList<ModuleInfo>::CopyData(list, modScriptList);
}

View File

@ -31,7 +31,7 @@ namespace Script
SCRIPT_EXPORT duint SizeFromAddr(duint addr);
SCRIPT_EXPORT duint SizeFromName(const char* name);
SCRIPT_EXPORT bool NameFromAddr(duint addr, char* name); //name[MAX_MODULE_SIZE]
SCRIPT_EXPORT bool PathFromAddr(duint addr, char* path); //path[MAX_MODULE_PATH_SIZE]
SCRIPT_EXPORT bool PathFromAddr(duint addr, char* path); //path[MAX_PATH]
SCRIPT_EXPORT bool PathFromName(const char* name, char* path); //path[MAX_PATH]
SCRIPT_EXPORT duint EntryFromAddr(duint addr);
SCRIPT_EXPORT duint EntryFromName(const char* name);
@ -39,8 +39,8 @@ namespace Script
SCRIPT_EXPORT int SectionCountFromName(const char* name);
SCRIPT_EXPORT bool SectionFromAddr(duint addr, int number, ModuleSectionInfo* section);
SCRIPT_EXPORT bool SectionFromName(const char* name, int number, ModuleSectionInfo* section);
SCRIPT_EXPORT bool SectionListFromAddr(duint addr, ListOf(ModuleSectionInfo) listInfo);
SCRIPT_EXPORT bool SectionListFromName(const char* name, ListOf(ModuleSectionInfo) listInfo);
SCRIPT_EXPORT bool SectionListFromAddr(duint addr, ListOf(ModuleSectionInfo) list);
SCRIPT_EXPORT bool SectionListFromName(const char* name, ListOf(ModuleSectionInfo) list);
SCRIPT_EXPORT bool GetMainModuleInfo(ModuleInfo* info);
SCRIPT_EXPORT duint GetMainModuleBase();
SCRIPT_EXPORT duint GetMainModuleSize();
@ -48,8 +48,8 @@ namespace Script
SCRIPT_EXPORT int GetMainModuleSectionCount();
SCRIPT_EXPORT bool GetMainModuleName(char* name); //name[MAX_MODULE_SIZE]
SCRIPT_EXPORT bool GetMainModulePath(char* path); //path[MAX_PATH]
SCRIPT_EXPORT bool GetMainModuleSectionList(ListOf(ModuleSectionInfo) listInfo); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetList(ListOf(ModuleInfo) listInfo); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetMainModuleSectionList(ListOf(ModuleSectionInfo) list); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetList(ListOf(ModuleInfo) list); //caller has the responsibility to free the list
}; //Module
}; //Script

View File

@ -3,7 +3,7 @@
bool Script::Symbol::GetList(ListOf(SymbolInfo) list)
{
List<Label::LabelInfo> labels;
BridgeList<Label::LabelInfo> labels;
if(!Label::GetList(&labels))
return false;
std::vector<SymbolInfo> symbols;
@ -20,5 +20,5 @@ bool Script::Symbol::GetList(ListOf(SymbolInfo) list)
symbols.push_back(symbol);
}
//TODO: enumerate actual symbols + virtual symbols (sub_XXXXXX) + imports + exports in addition to user-defined labels.
return List<SymbolInfo>::CopyData(list, symbols);
return BridgeList<SymbolInfo>::CopyData(list, symbols);
}

View File

@ -56,6 +56,18 @@ static CMDRESULT cbPrintf(int argc, char* argv[])
return STATUS_CONTINUE;
}
static bool DbgScriptDllExec(const char* dll);
static CMDRESULT cbScriptDll(int argc, char* argv[])
{
if(argc < 2)
{
dputs("not enough arguments!");
return STATUS_ERROR;
}
return DbgScriptDllExec(argv[1]) ? STATUS_CONTINUE : STATUS_ERROR;
}
static void registercommands()
{
cmdinit();
@ -215,6 +227,7 @@ static void registercommands()
dbgcmdnew("findallmem\1findmemall", cbInstrFindMemAll, true); //memory map pattern find
dbgcmdnew("setmaxfindresult\1findsetmaxresult", cbInstrSetMaxFindResult, false); //set the maximum number of occurences found
dbgcmdnew("savedata", cbInstrSavedata, true); //save data to disk
dbgcmdnew("scriptdll\1dllscript", cbScriptDll, false); //execute a script DLL
}
static bool cbCommandProvider(char* cmd, int maxlen)