1
0
Fork 0

DBG: implement DbgFunctions()->ModSymbolStatus

This commit is contained in:
Duncan Ogilvie 2019-06-18 02:51:26 +02:00
parent 80d84e7108
commit cc30f105de
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
5 changed files with 40 additions and 27 deletions

View File

@ -408,6 +408,24 @@ static int SymAutoComplete(const char* Search, char** Buffer, int MaxSymbols)
return count;
}
MODULESYMBOLSTATUS _modsymbolstatus(duint base)
{
SHARED_ACQUIRE(LockModules);
auto modInfo = ModInfoFromAddr(base);
if(!modInfo)
return MODSYMUNLOADED;
bool isOpen = modInfo->symbols->isOpen();
bool isLoading = modInfo->symbols->isLoading();
if(isOpen && !isLoading)
return MODSYMLOADED;
else if(isOpen && isLoading)
return MODSYMLOADING;
else if(!isOpen && symbolDownloadingBase == base)
return MODSYMLOADING;
else
return MODSYMUNLOADED;
}
static void _refreshmodulelist()
{
SymUpdateModuleList();
@ -487,4 +505,5 @@ void dbgfunctionsinit()
_dbgfunctions.SymAutoComplete = SymAutoComplete;
_dbgfunctions.RefreshModuleList = _refreshmodulelist;
_dbgfunctions.GetAddrFromLineEx = _getaddrfromlineex;
_dbgfunctions.ModSymbolStatus = _modsymbolstatus;
}

View File

@ -129,6 +129,13 @@ typedef struct
duint value;
} CONSTANTINFO;
typedef enum
{
MODSYMUNLOADED = 0,
MODSYMLOADING,
MODSYMLOADED
} MODULESYMBOLSTATUS;
typedef bool (*ASSEMBLEATEX)(duint addr, const char* instruction, char* error, bool fillnop);
typedef bool (*SECTIONFROMADDR)(duint addr, char* section);
typedef bool (*MODNAMEFROMADDR)(duint addr, char* modname, bool extension);
@ -199,6 +206,7 @@ typedef duint(*DBGETHASH)();
typedef int(*SYMAUTOCOMPLETE)(const char* Search, char** Buffer, int MaxSymbols);
typedef void(*REFRESHMODULELIST)();
typedef duint(*GETADDRFROMLINEEX)(duint mod, const char* szSourceFile, int line);
typedef MODULESYMBOLSTATUS(*MODSYMBOLSTATUS)(duint mod);
//The list of all the DbgFunctions() return value.
//WARNING: This list is append only. Do not insert things in the middle or plugins would break.
@ -276,6 +284,7 @@ typedef struct DBGFUNCTIONS_
SYMAUTOCOMPLETE SymAutoComplete;
REFRESHMODULELIST RefreshModuleList;
GETADDRFROMLINEEX GetAddrFromLineEx;
MODSYMBOLSTATUS ModSymbolStatus;
} DBGFUNCTIONS;
#ifdef BUILD_DBG

View File

@ -14,6 +14,8 @@
#include "WinInet-Downloader/downslib.h"
#include <shlwapi.h>
duint symbolDownloadingBase = 0;
struct SYMBOLCBDATA
{
CBSYMBOLENUM cbSymbolEnum;
@ -22,31 +24,6 @@ struct SYMBOLCBDATA
std::vector<char> undecoratedSymbol;
};
/*static void SymEnumImports(duint Base, CBSYMBOLENUM EnumCallback, SYMBOLCBDATA & cbData)
{
SYMBOLINFO symbol;
memset(&symbol, 0, sizeof(SYMBOLINFO));
symbol.isImported = true;
apienumimports(Base, [&](duint base, duint addr, const char* name, const char* moduleName)
{
cbData.decoratedSymbol[0] = '\0';
cbData.undecoratedSymbol[0] = '\0';
symbol.addr = addr;
symbol.decoratedSymbol = cbData.decoratedSymbol.data();
symbol.undecoratedSymbol = cbData.undecoratedSymbol.data();
strncpy_s(symbol.decoratedSymbol, MAX_SYM_NAME, name, _TRUNCATE);
// Convert a mangled/decorated C++ name to a readable format
if(!SafeUnDecorateSymbolName(name, symbol.undecoratedSymbol, MAX_SYM_NAME, UNDNAME_COMPLETE))
symbol.undecoratedSymbol = nullptr;
else if(!strcmp(symbol.decoratedSymbol, symbol.undecoratedSymbol))
symbol.undecoratedSymbol = nullptr;
EnumCallback(&symbol, cbData.user);
});
}*/
void SymEnum(duint Base, CBSYMBOLENUM EnumCallback, void* UserData)
{
SYMBOLCBDATA cbData;
@ -139,6 +116,11 @@ void SymUpdateModuleList()
bool SymDownloadSymbol(duint Base, const char* SymbolStore)
{
struct DownloadBaseGuard
{
DownloadBaseGuard(duint downloadBase) { symbolDownloadingBase = downloadBase; GuiRepaintTableView(); }
~DownloadBaseGuard() { symbolDownloadingBase = 0; GuiRepaintTableView(); }
} g(Base);
#define symprintf(format, ...) GuiSymbolLogAdd(StringUtils::sprintf(GuiTranslateText(format), __VA_ARGS__).c_str())
// Default to Microsoft's symbol server

View File

@ -3,8 +3,7 @@
#include "_global.h"
void InvalidateSymCache();
//bool SymFromAddrCached(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFO Symbol);
extern duint symbolDownloadingBase;
void SymEnum(duint Base, CBSYMBOLENUM EnumCallback, void* UserData);
void SymEnumFromCache(duint Base, CBSYMBOLENUM EnumCallback, void* UserData);

View File

@ -109,6 +109,8 @@ bool SymbolSourceDIA::loadSymbolsAsync()
{
ScopedDecrement ref(_loadCounter);
GuiRepaintTableView();
PDBDiaFile pdb;
if(!pdb.open(_path.c_str()))
@ -235,6 +237,8 @@ bool SymbolSourceDIA::loadSourceLinesAsync()
{
ScopedDecrement ref(_loadCounter);
GuiRepaintTableView();
PDBDiaFile pdb;
if(!pdb.open(_path.c_str()))