Skip to content

Commit 72d76bb

Browse files
ZehMattmrexodia
authored andcommitted
Add GetExports and GetImports to the module scripting API.
1 parent 4273fce commit 72d76bb

File tree

2 files changed

+81
-2
lines changed

2 files changed

+81
-2
lines changed

src/dbg/_scriptapi_module.cpp

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,61 @@ SCRIPT_EXPORT bool Script::Module::GetList(ListOf(ModuleInfo) list)
179179
modScriptList.push_back(scriptMod);
180180
});
181181
return BridgeList<ModuleInfo>::CopyData(list, modScriptList);
182-
}
182+
}
183+
184+
SCRIPT_EXPORT bool Script::Module::GetExports(const ModuleInfo* mod, ListOf(ModuleExport) list)
185+
{
186+
SHARED_ACQUIRE(LockModules);
187+
188+
if(mod == nullptr)
189+
return false;
190+
191+
MODINFO* modInfo = ModInfoFromAddr(mod->base);
192+
if(modInfo == nullptr)
193+
return false;
194+
195+
std::vector<ModuleExport> modExportList;
196+
modExportList.reserve(modInfo->exports.size());
197+
198+
for(auto & modExport : modInfo->exports)
199+
{
200+
ModuleExport entry;
201+
entry.ordinal = modExport.ordinal;
202+
entry.rva = modExport.rva;
203+
entry.va = modExport.rva + modInfo->base;
204+
entry.forwarded = modExport.forwarded;
205+
strncpy_s(entry.forwardName, modExport.forwardName.c_str(), _TRUNCATE);
206+
strncpy_s(entry.name, modExport.name.c_str(), _TRUNCATE);
207+
strncpy_s(entry.undecoratedName, modExport.undecoratedName.c_str(), _TRUNCATE);
208+
modExportList.push_back(entry);
209+
}
210+
return BridgeList<ModuleExport>::CopyData(list, modExportList);
211+
}
212+
213+
214+
SCRIPT_EXPORT bool Script::Module::GetImports(const ModuleInfo* mod, ListOf(ModuleImport) list)
215+
{
216+
SHARED_ACQUIRE(LockModules);
217+
218+
if(mod == nullptr)
219+
return false;
220+
221+
MODINFO* modInfo = ModInfoFromAddr(mod->base);
222+
if(modInfo == nullptr)
223+
return false;
224+
225+
std::vector<ModuleImport> modImportList;
226+
modImportList.reserve(modInfo->imports.size());
227+
228+
for(auto & modImport : modInfo->imports)
229+
{
230+
ModuleImport entry;
231+
entry.ordinal = modImport.ordinal;
232+
entry.iatRva = modImport.iatRva;
233+
entry.iatVa = modImport.iatRva + modInfo->base;
234+
strncpy_s(entry.name, modImport.name.c_str(), _TRUNCATE);
235+
strncpy_s(entry.undecoratedName, modImport.undecoratedName.c_str(), _TRUNCATE);
236+
modImportList.push_back(entry);
237+
}
238+
return BridgeList<ModuleImport>::CopyData(list, modImportList);
239+
}

src/dbg/_scriptapi_module.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,26 @@ namespace Script
2424
char name[MAX_SECTION_SIZE * 5];
2525
};
2626

27+
struct ModuleExport
28+
{
29+
duint ordinal;
30+
duint rva;
31+
duint va;
32+
bool forwarded;
33+
char forwardName[MAX_STRING_SIZE];
34+
char name[MAX_STRING_SIZE];
35+
char undecoratedName[MAX_STRING_SIZE];
36+
};
37+
38+
struct ModuleImport
39+
{
40+
duint iatRva;
41+
duint iatVa;
42+
duint ordinal; //equal to -1 if imported by name
43+
char name[MAX_STRING_SIZE];
44+
char undecoratedName[MAX_STRING_SIZE];
45+
};
46+
2747
SCRIPT_EXPORT bool InfoFromAddr(duint addr, ModuleInfo* info);
2848
SCRIPT_EXPORT bool InfoFromName(const char* name, ModuleInfo* info);
2949
SCRIPT_EXPORT duint BaseFromAddr(duint addr);
@@ -50,7 +70,9 @@ namespace Script
5070
SCRIPT_EXPORT bool GetMainModulePath(char* path); //path[MAX_PATH]
5171
SCRIPT_EXPORT bool GetMainModuleSectionList(ListOf(ModuleSectionInfo) list); //caller has the responsibility to free the list
5272
SCRIPT_EXPORT bool GetList(ListOf(ModuleInfo) list); //caller has the responsibility to free the list
73+
SCRIPT_EXPORT bool GetExports(const ModuleInfo* mod, ListOf(ModuleExport) list); //caller has the responsibility to free the list
74+
SCRIPT_EXPORT bool GetImports(const ModuleInfo* mod, ListOf(ModuleImport) list); //caller has the responsibility to free the list
5375
}; //Module
5476
}; //Script
5577

56-
#endif //_SCRIPTAPI_MODULE_H
78+
#endif //_SCRIPTAPI_MODULE_H

0 commit comments

Comments
 (0)