Skip to content

Commit cc30f10

Browse files
committed
DBG: implement DbgFunctions()->ModSymbolStatus
1 parent 80d84e7 commit cc30f10

File tree

5 files changed

+40
-27
lines changed

5 files changed

+40
-27
lines changed

src/dbg/_dbgfunctions.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,24 @@ static int SymAutoComplete(const char* Search, char** Buffer, int MaxSymbols)
408408
return count;
409409
}
410410

411+
MODULESYMBOLSTATUS _modsymbolstatus(duint base)
412+
{
413+
SHARED_ACQUIRE(LockModules);
414+
auto modInfo = ModInfoFromAddr(base);
415+
if(!modInfo)
416+
return MODSYMUNLOADED;
417+
bool isOpen = modInfo->symbols->isOpen();
418+
bool isLoading = modInfo->symbols->isLoading();
419+
if(isOpen && !isLoading)
420+
return MODSYMLOADED;
421+
else if(isOpen && isLoading)
422+
return MODSYMLOADING;
423+
else if(!isOpen && symbolDownloadingBase == base)
424+
return MODSYMLOADING;
425+
else
426+
return MODSYMUNLOADED;
427+
}
428+
411429
static void _refreshmodulelist()
412430
{
413431
SymUpdateModuleList();
@@ -487,4 +505,5 @@ void dbgfunctionsinit()
487505
_dbgfunctions.SymAutoComplete = SymAutoComplete;
488506
_dbgfunctions.RefreshModuleList = _refreshmodulelist;
489507
_dbgfunctions.GetAddrFromLineEx = _getaddrfromlineex;
508+
_dbgfunctions.ModSymbolStatus = _modsymbolstatus;
490509
}

src/dbg/_dbgfunctions.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,13 @@ typedef struct
129129
duint value;
130130
} CONSTANTINFO;
131131

132+
typedef enum
133+
{
134+
MODSYMUNLOADED = 0,
135+
MODSYMLOADING,
136+
MODSYMLOADED
137+
} MODULESYMBOLSTATUS;
138+
132139
typedef bool (*ASSEMBLEATEX)(duint addr, const char* instruction, char* error, bool fillnop);
133140
typedef bool (*SECTIONFROMADDR)(duint addr, char* section);
134141
typedef bool (*MODNAMEFROMADDR)(duint addr, char* modname, bool extension);
@@ -199,6 +206,7 @@ typedef duint(*DBGETHASH)();
199206
typedef int(*SYMAUTOCOMPLETE)(const char* Search, char** Buffer, int MaxSymbols);
200207
typedef void(*REFRESHMODULELIST)();
201208
typedef duint(*GETADDRFROMLINEEX)(duint mod, const char* szSourceFile, int line);
209+
typedef MODULESYMBOLSTATUS(*MODSYMBOLSTATUS)(duint mod);
202210

203211
//The list of all the DbgFunctions() return value.
204212
//WARNING: This list is append only. Do not insert things in the middle or plugins would break.
@@ -276,6 +284,7 @@ typedef struct DBGFUNCTIONS_
276284
SYMAUTOCOMPLETE SymAutoComplete;
277285
REFRESHMODULELIST RefreshModuleList;
278286
GETADDRFROMLINEEX GetAddrFromLineEx;
287+
MODSYMBOLSTATUS ModSymbolStatus;
279288
} DBGFUNCTIONS;
280289

281290
#ifdef BUILD_DBG

src/dbg/symbolinfo.cpp

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include "WinInet-Downloader/downslib.h"
1515
#include <shlwapi.h>
1616

17+
duint symbolDownloadingBase = 0;
18+
1719
struct SYMBOLCBDATA
1820
{
1921
CBSYMBOLENUM cbSymbolEnum;
@@ -22,31 +24,6 @@ struct SYMBOLCBDATA
2224
std::vector<char> undecoratedSymbol;
2325
};
2426

25-
/*static void SymEnumImports(duint Base, CBSYMBOLENUM EnumCallback, SYMBOLCBDATA & cbData)
26-
{
27-
SYMBOLINFO symbol;
28-
memset(&symbol, 0, sizeof(SYMBOLINFO));
29-
symbol.isImported = true;
30-
apienumimports(Base, [&](duint base, duint addr, const char* name, const char* moduleName)
31-
{
32-
cbData.decoratedSymbol[0] = '\0';
33-
cbData.undecoratedSymbol[0] = '\0';
34-
35-
symbol.addr = addr;
36-
symbol.decoratedSymbol = cbData.decoratedSymbol.data();
37-
symbol.undecoratedSymbol = cbData.undecoratedSymbol.data();
38-
strncpy_s(symbol.decoratedSymbol, MAX_SYM_NAME, name, _TRUNCATE);
39-
40-
// Convert a mangled/decorated C++ name to a readable format
41-
if(!SafeUnDecorateSymbolName(name, symbol.undecoratedSymbol, MAX_SYM_NAME, UNDNAME_COMPLETE))
42-
symbol.undecoratedSymbol = nullptr;
43-
else if(!strcmp(symbol.decoratedSymbol, symbol.undecoratedSymbol))
44-
symbol.undecoratedSymbol = nullptr;
45-
46-
EnumCallback(&symbol, cbData.user);
47-
});
48-
}*/
49-
5027
void SymEnum(duint Base, CBSYMBOLENUM EnumCallback, void* UserData)
5128
{
5229
SYMBOLCBDATA cbData;
@@ -139,6 +116,11 @@ void SymUpdateModuleList()
139116

140117
bool SymDownloadSymbol(duint Base, const char* SymbolStore)
141118
{
119+
struct DownloadBaseGuard
120+
{
121+
DownloadBaseGuard(duint downloadBase) { symbolDownloadingBase = downloadBase; GuiRepaintTableView(); }
122+
~DownloadBaseGuard() { symbolDownloadingBase = 0; GuiRepaintTableView(); }
123+
} g(Base);
142124
#define symprintf(format, ...) GuiSymbolLogAdd(StringUtils::sprintf(GuiTranslateText(format), __VA_ARGS__).c_str())
143125

144126
// Default to Microsoft's symbol server

src/dbg/symbolinfo.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
#include "_global.h"
55

6-
void InvalidateSymCache();
7-
//bool SymFromAddrCached(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFO Symbol);
6+
extern duint symbolDownloadingBase;
87

98
void SymEnum(duint Base, CBSYMBOLENUM EnumCallback, void* UserData);
109
void SymEnumFromCache(duint Base, CBSYMBOLENUM EnumCallback, void* UserData);

src/dbg/symbolsourcedia.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ bool SymbolSourceDIA::loadSymbolsAsync()
109109
{
110110
ScopedDecrement ref(_loadCounter);
111111

112+
GuiRepaintTableView();
113+
112114
PDBDiaFile pdb;
113115

114116
if(!pdb.open(_path.c_str()))
@@ -235,6 +237,8 @@ bool SymbolSourceDIA::loadSourceLinesAsync()
235237
{
236238
ScopedDecrement ref(_loadCounter);
237239

240+
GuiRepaintTableView();
241+
238242
PDBDiaFile pdb;
239243

240244
if(!pdb.open(_path.c_str()))

0 commit comments

Comments
 (0)