1
0
Fork 0

DBG: implement SymAddrFromName (untested on large symbols, working on small)

This commit is contained in:
Duncan Ogilvie 2018-01-06 21:15:17 +01:00
parent 550a1ff45a
commit a6ccf69e5b
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
1 changed files with 21 additions and 13 deletions

View File

@ -266,19 +266,27 @@ bool SymAddrFromName(const char* Name, duint* Address)
if(!_strnicmp(Name, "Ordinal", 7))
return false;
// According to MSDN:
// Note that the total size of the data is the SizeOfStruct + (MaxNameLen - 1) * sizeof(TCHAR)
char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(char)];
PSYMBOL_INFO symbol = (PSYMBOL_INFO)&buffer;
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
symbol->MaxNameLen = MAX_LABEL_SIZE;
if(!SafeSymFromName(fdProcessInfo->hProcess, Name, symbol))
return false;
*Address = (duint)symbol->Address;
return true;
std::vector<duint> mods;
ModEnum([&mods](const MODINFO & info)
{
mods.push_back(info.base);
});
std::string name(Name);
for(duint base : mods)
{
SHARED_ACQUIRE(LockModules);
auto modInfo = ModInfoFromAddr(base);
if(modInfo && modInfo->symbols->isOpen())
{
SymbolInfo symInfo;
if(modInfo->symbols->findSymbolByName(name, symInfo, true))
{
*Address = base + symInfo.addr;
return true;
}
}
}
return false;
}
String SymGetSymbolicName(duint Address)