Skip to content
Permalink
Browse files

Add GetExports and GetImports to the module scripting API.

  • Loading branch information...
ZehMatt authored and mrexodia committed May 2, 2019
1 parent 4273fce commit 72d76bb9bc6b07a5b452ea7d2a8319fe2bc3d5be
Showing with 81 additions and 2 deletions.
  1. +58 −1 src/dbg/_scriptapi_module.cpp
  2. +23 −1 src/dbg/_scriptapi_module.h
@@ -179,4 +179,61 @@ SCRIPT_EXPORT bool Script::Module::GetList(ListOf(ModuleInfo) list)
modScriptList.push_back(scriptMod);
});
return BridgeList<ModuleInfo>::CopyData(list, modScriptList);
}
}

SCRIPT_EXPORT bool Script::Module::GetExports(const ModuleInfo* mod, ListOf(ModuleExport) list)
{
SHARED_ACQUIRE(LockModules);

if(mod == nullptr)
return false;

MODINFO* modInfo = ModInfoFromAddr(mod->base);
if(modInfo == nullptr)
return false;

std::vector<ModuleExport> modExportList;
modExportList.reserve(modInfo->exports.size());

for(auto & modExport : modInfo->exports)
{
ModuleExport entry;
entry.ordinal = modExport.ordinal;
entry.rva = modExport.rva;
entry.va = modExport.rva + modInfo->base;
entry.forwarded = modExport.forwarded;
strncpy_s(entry.forwardName, modExport.forwardName.c_str(), _TRUNCATE);
strncpy_s(entry.name, modExport.name.c_str(), _TRUNCATE);
strncpy_s(entry.undecoratedName, modExport.undecoratedName.c_str(), _TRUNCATE);
modExportList.push_back(entry);
}
return BridgeList<ModuleExport>::CopyData(list, modExportList);
}


SCRIPT_EXPORT bool Script::Module::GetImports(const ModuleInfo* mod, ListOf(ModuleImport) list)
{
SHARED_ACQUIRE(LockModules);

if(mod == nullptr)
return false;

MODINFO* modInfo = ModInfoFromAddr(mod->base);
if(modInfo == nullptr)
return false;

std::vector<ModuleImport> modImportList;
modImportList.reserve(modInfo->imports.size());

for(auto & modImport : modInfo->imports)
{
ModuleImport entry;
entry.ordinal = modImport.ordinal;
entry.iatRva = modImport.iatRva;
entry.iatVa = modImport.iatRva + modInfo->base;
strncpy_s(entry.name, modImport.name.c_str(), _TRUNCATE);
strncpy_s(entry.undecoratedName, modImport.undecoratedName.c_str(), _TRUNCATE);
modImportList.push_back(entry);
}
return BridgeList<ModuleImport>::CopyData(list, modImportList);
}
@@ -24,6 +24,26 @@ namespace Script
char name[MAX_SECTION_SIZE * 5];
};

struct ModuleExport
{
duint ordinal;
duint rva;
duint va;
bool forwarded;
char forwardName[MAX_STRING_SIZE];
char name[MAX_STRING_SIZE];
char undecoratedName[MAX_STRING_SIZE];
};

struct ModuleImport
{
duint iatRva;
duint iatVa;
duint ordinal; //equal to -1 if imported by name
char name[MAX_STRING_SIZE];
char undecoratedName[MAX_STRING_SIZE];
};

SCRIPT_EXPORT bool InfoFromAddr(duint addr, ModuleInfo* info);
SCRIPT_EXPORT bool InfoFromName(const char* name, ModuleInfo* info);
SCRIPT_EXPORT duint BaseFromAddr(duint addr);
@@ -50,7 +70,9 @@ namespace Script
SCRIPT_EXPORT bool GetMainModulePath(char* path); //path[MAX_PATH]
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
SCRIPT_EXPORT bool GetExports(const ModuleInfo* mod, ListOf(ModuleExport) list); //caller has the responsibility to free the list
SCRIPT_EXPORT bool GetImports(const ModuleInfo* mod, ListOf(ModuleImport) list); //caller has the responsibility to free the list
}; //Module
}; //Script

#endif //_SCRIPTAPI_MODULE_H
#endif //_SCRIPTAPI_MODULE_H

0 comments on commit 72d76bb

Please sign in to comment.
You can’t perform that action at this time.