DBG: implement DbgFunctions()->ModSymbolStatus
This commit is contained in:
parent
80d84e7108
commit
cc30f105de
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()))
|
||||
|
|
Loading…
Reference in New Issue