diff --git a/pykd/dia/diaload.cpp b/pykd/dia/diaload.cpp index 9bb24d1..7584750 100644 --- a/pykd/dia/diaload.cpp +++ b/pykd/dia/diaload.cpp @@ -125,7 +125,7 @@ public: /* [out] */ DWORD *pcbData, /* [size_is][out] */ BYTE *pbData ) override { - return + return readMemoryImpl( m_loadBase + relativeVirtualAddress, pbData, @@ -134,6 +134,41 @@ public: } }; +////////////////////////////////////////////////////////////////////////////////// + +struct SymSrvLoadHelper : boost::noncopyable +{ + static std::wstring g_symSrvDir; + + HMODULE m_loadedSymSrv; + + SymSrvLoadHelper() : m_loadedSymSrv(NULL) + { + if (g_symSrvDir.empty()) + return; + + if (::GetModuleHandle(_T("symsrv.dll"))) + { + // already loaded + return; + } + + std::wstring symSrvFullPath = g_symSrvDir; + if (L'\\' != *symSrvFullPath.rbegin()) + symSrvFullPath += L"\\"; + symSrvFullPath += L"symsrv.dll"; + + m_loadedSymSrv = ::LoadLibraryW( symSrvFullPath.c_str() ); + } + + ~SymSrvLoadHelper() + { + if (m_loadedSymSrv) + ::FreeLibrary(m_loadedSymSrv); + } +}; +std::wstring SymSrvLoadHelper::g_symSrvDir; + // Load debug symbols using ReadExeAtRVACallback struct DataForExeByRva : IDataProvider { @@ -155,6 +190,7 @@ struct DataForExeByRva : IDataProvider { virtual HRESULT load(__inout IDiaDataSource &dataSource) override { CComPtr< IUnknown > readExeAtRVACallback(new ReadExeAtRVACallback(m_loadBase, m_openedSymbolFile) ); + SymSrvLoadHelper symSrvLoadHelper; return dataSource.loadDataForExe( m_executable.c_str(), @@ -200,4 +236,11 @@ SymbolSessionPtr loadSymbolFile( ////////////////////////////////////////////////////////////////////////////////// +void setSymSrvDir(const std::wstring &symSrvDir) +{ + diaLoad::SymSrvLoadHelper::g_symSrvDir = symSrvDir; +} + +////////////////////////////////////////////////////////////////////////////////// + } // namespace pykd diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 88cf7a7..2239b89 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -245,6 +245,9 @@ BOOST_PYTHON_MODULE( pykd ) python::def( "setImplicitThread", &setImplicitThread, "Set implicit thread for current process" ); + python::def( "setSymSrvDir", &setSymSrvDir, + "Set directory of SYMSRV.dll library.\nUsually this is a directory of WinDbg"); + // symbol path python::def( "getSymbolPath", &getSymbolPath, "Returns current symbol path"); python::def( "setSymbolPath", &setSymbolPath, "Set current symbol path"); diff --git a/pykd/symengine.h b/pykd/symengine.h index c05beba..78093dc 100644 --- a/pykd/symengine.h +++ b/pykd/symengine.h @@ -181,6 +181,8 @@ SymbolSessionPtr loadSymbolFile( __in_opt std::string symbolSearchPath = std::string() ); +void setSymSrvDir(const std::wstring &symSrvDirectory); + //////////////////////////////////////////////////////////////////////////////// }; // end pykd endpoint \ No newline at end of file