diff --git a/.gitignore b/.gitignore index dcc1f1e0..1f4970e4 100644 --- a/.gitignore +++ b/.gitignore @@ -22,11 +22,9 @@ x64_dbg_*/x64/* !bin/*/test.dll !bin/*/test.exe !bin/*/dbghelp.dll -!bin/*/symsrv.dll !bin/*/sqlite.dll !bin/*/BeaEngine.dll !bin/*/Scylla.dll -!bin/*/nasm.exe #files to ignore todo_bridge.txt diff --git a/bin/x32/nasm.exe b/bin/x32/nasm.exe deleted file mode 100644 index 8e9cc348..00000000 Binary files a/bin/x32/nasm.exe and /dev/null differ diff --git a/bin/x32/symsrv.dll b/bin/x32/symsrv.dll deleted file mode 100644 index 87e54676..00000000 Binary files a/bin/x32/symsrv.dll and /dev/null differ diff --git a/bin/x64/nasm.exe b/bin/x64/nasm.exe deleted file mode 100644 index 8e9cc348..00000000 Binary files a/bin/x64/nasm.exe and /dev/null differ diff --git a/bin/x64/symsrv.dll b/bin/x64/symsrv.dll deleted file mode 100644 index 6b9d16b4..00000000 Binary files a/bin/x64/symsrv.dll and /dev/null differ diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 953e0576..2716446b 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -523,6 +523,15 @@ BRIDGE_IMPEXP void DbgScriptSetIp(int line) _dbg_sendmessage(DBG_SCRIPT_SETIP, (void*)(duint)line, 0); } +BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user) +{ + SYMBOLCBINFO cbInfo; + cbInfo.base=base; + cbInfo.cbSymbolEnum=cbSymbolEnum; + cbInfo.user=user; + _dbg_sendmessage(DBG_SYMBOL_ENUM, &cbInfo, 0); +} + //GUI BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 5337c3d0..1d40fd1d 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -286,6 +286,8 @@ BRIDGE_IMPEXP void DbgScriptAbort(); BRIDGE_IMPEXP SCRIPTLINETYPE DbgScriptGetLineType(int line); BRIDGE_IMPEXP void DbgScriptSetIp(int line); +BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user); + //Gui enums enum GUIMSG { diff --git a/x64_dbg_dbg/symbolinfo.cpp b/x64_dbg_dbg/symbolinfo.cpp index 9aafb887..63f27dd5 100644 --- a/x64_dbg_dbg/symbolinfo.cpp +++ b/x64_dbg_dbg/symbolinfo.cpp @@ -1,8 +1,44 @@ #include "symbolinfo.h" #include "debugger.h" +#include "addrinfo.h" + +static struct SYMBOLCBDATA +{ + CBSYMBOLENUM cbSymbolEnum; + void* user; +}; + +static BOOL CALLBACK EnumSymbols(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext) +{ + int len=strlen(pSymInfo->Name); + SYMBOLINFO curSymbol; + memset(&curSymbol, 0, sizeof(SYMBOLINFO)); + curSymbol.addr=pSymInfo->Address; + curSymbol.decoratedSymbol=(char*)BridgeAlloc(len+1); + strcpy(curSymbol.decoratedSymbol, pSymInfo->Name); + curSymbol.undecoratedSymbol=(char*)BridgeAlloc(MAX_SYM_NAME); + if(!UnDecorateSymbolName(pSymInfo->Name, curSymbol.undecoratedSymbol, MAX_SYM_NAME, UNDNAME_COMPLETE)) + { + BridgeFree(curSymbol.undecoratedSymbol); + curSymbol.undecoratedSymbol=0; + } + else if(!strcmp(curSymbol.decoratedSymbol, curSymbol.undecoratedSymbol)) + { + BridgeFree(curSymbol.undecoratedSymbol); + curSymbol.undecoratedSymbol=0; + } + SYMBOLCBDATA* cbData=(SYMBOLCBDATA*)UserContext; + cbData->cbSymbolEnum(&curSymbol, cbData->user); + return TRUE; +} void symbolenum(uint base, CBSYMBOLENUM cbSymbolEnum, void* user) { + SYMBOLCBDATA symbolCbData; + symbolCbData.cbSymbolEnum=cbSymbolEnum; + symbolCbData.user=user; + char mask[]="*"; + SymEnumSymbols(fdProcessInfo->hProcess, base, mask, EnumSymbols, &symbolCbData); } #ifdef _WIN64 @@ -14,7 +50,7 @@ static BOOL CALLBACK EnumModules(PCTSTR ModuleName, ULONG BaseOfDll, PVOID UserC SYMBOLMODULEINFO curModule; memset(&curModule, 0, sizeof(SYMBOLMODULEINFO)); curModule.base=BaseOfDll; - strcpy(curModule.name, ModuleName); + modnamefromaddr(BaseOfDll, curModule.name, true); ((std::vector*)UserContext)->push_back(curModule); return TRUE; } @@ -23,7 +59,7 @@ void symbolupdatemodulelist() { std::vector modList; modList.clear(); - //SymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList); + SymEnumerateModules(fdProcessInfo->hProcess, EnumModules, &modList); int modcount=modList.size(); SYMBOLMODULEINFO* modListBridge=(SYMBOLMODULEINFO*)BridgeAlloc(sizeof(SYMBOLMODULEINFO)*modcount); for(int i=0; i #include "resource.h" #include "..\x64_dbg_bridge\bridgemain.h" -#include "..\x64_dbg_crash\x64_dbg_crash.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { diff --git a/x64_dbg_gui/Project/Src/BasicView/SymbolView.cpp b/x64_dbg_gui/Project/Src/BasicView/SymbolView.cpp index 33fcc6d0..3b476123 100644 --- a/x64_dbg_gui/Project/Src/BasicView/SymbolView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/SymbolView.cpp @@ -53,7 +53,6 @@ SymbolView::SymbolView(QWidget *parent) : connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int))); connect(Bridge::getBridge(), SIGNAL(updateSymbolList(int,SYMBOLMODULEINFO*)), this, SLOT(updateSymbolList(int,SYMBOLMODULEINFO*))); connect(Bridge::getBridge(), SIGNAL(setSymbolProgress(int)), ui->symbolProgress, SLOT(setValue(int))); - emit mModuleList->selectionChangedSignal(0); } SymbolView::~SymbolView() @@ -72,20 +71,44 @@ void SymbolView::clearSymbolLogSlot() ui->symbolLogEdit->clear(); } +void SymbolView::cbSymbolEnum(SYMBOLINFO* symbol, void* user) +{ + StdTable* symbolList=(StdTable*)user; + int_t index=symbolList->getRowCount(); + symbolList->setRowCount(index+1); + symbolList->setCellContent(index, 0, QString("%1").arg(symbol->addr, sizeof(int_t)*2, 16, QChar('0')).toUpper()); + if(symbol->decoratedSymbol) + { + symbolList->setCellContent(index, 1, symbol->decoratedSymbol); + BridgeFree(symbol->decoratedSymbol); + } + if(symbol->undecoratedSymbol) + { + symbolList->setCellContent(index, 2, symbol->undecoratedSymbol); + BridgeFree(symbol->undecoratedSymbol); + } +} + void SymbolView::moduleSelectionChanged(int index) { + mSymbolList->setRowCount(0); + DbgSymbolEnum(moduleBaseList.at(index), cbSymbolEnum, mSymbolList); + mSymbolList->reloadData(); } void SymbolView::updateSymbolList(int module_count, SYMBOLMODULEINFO* modules) { mModuleList->setRowCount(module_count); + QList empty; + empty.clear(); + empty.swap(moduleBaseList); for(int i=0; isetCellContent(i, 0, QString("%1").arg(modules[i].base, sizeof(int_t)*2, 16, QChar('0')).toUpper()); mModuleList->setCellContent(i, 1, modules[i].name); } mModuleList->reloadData(); if(modules) BridgeFree(modules); - this->moduleSelectionChanged(0); } diff --git a/x64_dbg_gui/Project/Src/BasicView/SymbolView.h b/x64_dbg_gui/Project/Src/BasicView/SymbolView.h index 60007573..21e165d7 100644 --- a/x64_dbg_gui/Project/Src/BasicView/SymbolView.h +++ b/x64_dbg_gui/Project/Src/BasicView/SymbolView.h @@ -32,22 +32,9 @@ private: StdTable* mModuleList; StdTable* mSymbolList; - struct SymbolInfo_t - { - uint_t addr; - QString decoratedSymbol; - QString undecoratedSymbol; - }; - - struct ModuleInfo_t - { - uint_t base; - QString name; - QList symbols; - }; - - QList moduleList; + QList moduleBaseList; + static void cbSymbolEnum(SYMBOLINFO* symbol, void* user); }; #endif // SYMBOLVIEW_H