pykd/pykd/synsymhelpers.cpp
SND\EreTIk_cp bc3259e916 [0.1.x] add: synthetic symbols implementation
git-svn-id: https://pykd.svn.codeplex.com/svn@71929 9b283d60-5439-405e-af05-b73fd8c4d996
2017-11-08 17:27:51 +04:00

153 lines
3.8 KiB
C++

#include <stdafx.h>
#include "dbgexcept.h"
#include "synsymhelpers.h"
namespace pykd {
////////////////////////////////////////////////////////////////////////////////
bool SynSymHelper::removeSyntheticSymbols(
const DEBUG_MODULE_AND_ID &dbgSymbols
)
{
return SUCCEEDED(
m_symbols.RemoveSyntheticSymbol(
const_cast<DEBUG_MODULE_AND_ID *>(&dbgSymbols)
)
);
}
////////////////////////////////////////////////////////////////////////////////
ULONG SynSymHelper::removeSyntheticSymbols(
const std::vector<DEBUG_MODULE_AND_ID> &arrSymbols
)
{
ULONG countOfRemoved = 0;
for (ULONG i = 0; i < arrSymbols.size(); ++i)
{
if (removeSyntheticSymbols(arrSymbols[i]))
++countOfRemoved;
}
return countOfRemoved;
}
////////////////////////////////////////////////////////////////////////////////
ULONG SynSymHelper::removeSyntheticSymbols(ULONG64 addr)
{
ULONG entries = 0;
m_symbols.GetSymbolEntriesByOffset(addr, 0, NULL, NULL, 0, &entries);
if (!entries)
return 0;
std::vector<DEBUG_MODULE_AND_ID> arrSymbols(entries);
HRESULT hres = m_symbols.GetSymbolEntriesByOffset(
addr,
0,
&arrSymbols[0],
NULL,
(ULONG)arrSymbols.size(),
NULL);
if (SUCCEEDED(hres))
return removeSyntheticSymbols(arrSymbols);
return 0;
}
////////////////////////////////////////////////////////////////////////////////
SyntheticSymbols::ModuleId SynSymHelper::modByBase(ULONG64 moduleBase)
{
DEBUG_MODULE_PARAMETERS dbgModuleParameters;
HRESULT hres =
m_symbols.GetModuleParameters(
1,
&moduleBase,
0,
&dbgModuleParameters);
if ( FAILED( hres ) )
throw DbgException(buildExceptDesc("IDebugSymbols3::GetModuleParameters", hres));
return SyntheticSymbols::ModuleId(dbgModuleParameters);
}
////////////////////////////////////////////////////////////////////////////////
SyntheticSymbols::ModuleId SynSymHelper::modByOffset(
ULONG64 moduleOffset,
ULONG64 &moduleBase
)
{
HRESULT hres =
m_symbols.GetModuleByOffset(moduleOffset, 0, NULL, &moduleBase);
if ( FAILED( hres ) )
throw DbgException(buildExceptDesc("IDebugSymbols3::GetModuleByOffset", hres));
return modByBase(moduleBase);
}
////////////////////////////////////////////////////////////////////////////////
HRESULT SynSymHelper::getAllModules(
std::vector<DEBUG_MODULE_PARAMETERS> &dbgModules
)
{
ULONG nLoaded;
ULONG nUnloaded;
HRESULT hres = m_symbols.GetNumberModules(&nLoaded, &nUnloaded);
if (FAILED(hres))
return hres;
if (!nLoaded && !nUnloaded)
{
dbgModules.clear();
return S_OK;
}
dbgModules.resize(nLoaded + nUnloaded);
return
m_symbols.GetModuleParameters(
nLoaded + nUnloaded,
NULL,
0,
&dbgModules[0]);
}
////////////////////////////////////////////////////////////////////////////////
HRESULT SynSymHelper::getSymbolsByMaks(
const std::string &symMask,
std::vector<DEBUG_MODULE_AND_ID> &dbgSymbols
)
{
ULONG entries = 0;
m_symbols.GetSymbolEntriesByName(
symMask.c_str(),
0,
NULL,
0,
&entries);
if (!entries)
{
dbgSymbols.clear();
return S_OK;
}
dbgSymbols.resize(entries);
return
m_symbols.GetSymbolEntriesByName(
symMask.c_str(),
0,
&dbgSymbols[0],
entries,
NULL);
}
////////////////////////////////////////////////////////////////////////////////
}; // namespace pykd