mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 19:53:22 +08:00
[0.2.x] - synthetic symbols src
git-svn-id: https://pykd.svn.codeplex.com/svn@80200 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
38b25e0ccc
commit
b4564ca827
@ -1,248 +0,0 @@
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
#include "dbgmem.h"
|
||||
#include "dbgexcept.h"
|
||||
#include "dbgclient.h"
|
||||
#include "synsymhelpers.h"
|
||||
|
||||
namespace pykd {
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SyntheticSymbols::SyntheticSymbols(
|
||||
IDebugSymbols3 &symbols,
|
||||
DebugClient &dbgClient
|
||||
) : m_symbols(symbols)
|
||||
, m_dbgClient(dbgClient)
|
||||
{
|
||||
m_allSymbolsLock.reset(new boost::recursive_mutex);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void SyntheticSymbols::add(
|
||||
ULONG64 addr,
|
||||
ULONG size,
|
||||
const std::string &symName
|
||||
)
|
||||
{
|
||||
addr = m_dbgClient.addr64(addr);
|
||||
|
||||
// add new synthetic symbol to debug engine
|
||||
DEBUG_MODULE_AND_ID dbgModuleAndId = { 0 };
|
||||
HRESULT hres =
|
||||
m_symbols.AddSyntheticSymbol(
|
||||
addr,
|
||||
size,
|
||||
symName.c_str(),
|
||||
DEBUG_ADDSYNTHSYM_DEFAULT,
|
||||
&dbgModuleAndId);
|
||||
if ( FAILED( hres ) )
|
||||
throw AddSyntheticSymbolException( hres );
|
||||
|
||||
// add/update symbol for target module (in internal map)
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
|
||||
ModSymbols &modSymbols =
|
||||
m_allSymbols[SynSymHelper(m_symbols).modByBase(dbgModuleAndId.ModuleBase)];
|
||||
SymbolData &symData = modSymbols[addr - dbgModuleAndId.ModuleBase];
|
||||
|
||||
symData.m_name = symName;
|
||||
symData.m_size = size;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG SyntheticSymbols::remove(ULONG64 addr)
|
||||
{
|
||||
addr = m_dbgClient.addr64(addr);
|
||||
|
||||
SynSymHelper synSymHelper(m_symbols);
|
||||
|
||||
// find target module
|
||||
ULONG64 moduleBase;
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
AllSymbols::iterator itModSymbols =
|
||||
m_allSymbols.find(synSymHelper.modByOffset(addr, moduleBase));
|
||||
if (itModSymbols == m_allSymbols.end())
|
||||
return 0;
|
||||
|
||||
// remove symbol from internal map
|
||||
itModSymbols->second.erase(addr - moduleBase);
|
||||
|
||||
// remove symbol from debug engine
|
||||
return synSymHelper.removeSyntheticSymbols(addr);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG SyntheticSymbols::removeByMask(
|
||||
const std::string &moduleName,
|
||||
const std::string &symName
|
||||
)
|
||||
{
|
||||
SynSymHelper synSymHelper(m_symbols);
|
||||
|
||||
std::vector<DEBUG_MODULE_AND_ID> dbgSymbols;
|
||||
HRESULT hres =
|
||||
synSymHelper.getSymbolsByMaks(
|
||||
moduleName + "!" + symName,
|
||||
dbgSymbols);
|
||||
if (FAILED(hres))
|
||||
throw DbgException("IDebugSymbols3::GetSymbolEntriesByName", hres);
|
||||
|
||||
if (dbgSymbols.empty())
|
||||
return 0;
|
||||
|
||||
ULONG removed = 0;
|
||||
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
for (ULONG i =0; i < dbgSymbols.size(); ++i)
|
||||
{
|
||||
DEBUG_SYMBOL_ENTRY dbgSymbolInfo;
|
||||
HRESULT hres =
|
||||
m_symbols.GetSymbolEntryInformation(
|
||||
&dbgSymbols[i],
|
||||
&dbgSymbolInfo);
|
||||
if (FAILED(hres))
|
||||
continue;
|
||||
|
||||
// try find modules in internal map
|
||||
AllSymbols::iterator itModSymbols =
|
||||
m_allSymbols.find(synSymHelper.modByBase(dbgSymbolInfo.ModuleBase));
|
||||
if (itModSymbols == m_allSymbols.end())
|
||||
continue;
|
||||
|
||||
// try find symbol
|
||||
ModSymbols::iterator itSymbol =
|
||||
itModSymbols->second.find(dbgSymbolInfo.Offset - dbgSymbolInfo.ModuleBase);
|
||||
if (itSymbol == itModSymbols->second.end())
|
||||
continue;
|
||||
|
||||
// remove from debug engine
|
||||
if (synSymHelper.removeSyntheticSymbols(dbgSymbols[i]))
|
||||
++removed;
|
||||
|
||||
// remove from internal map
|
||||
itModSymbols->second.erase(itSymbol);
|
||||
|
||||
if (itModSymbols->second.empty())
|
||||
m_allSymbols.erase(itModSymbols);
|
||||
}
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void SyntheticSymbols::clear()
|
||||
{
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
|
||||
// clean symbols from debug engine
|
||||
forEachLoadedModule( SynSymRemoveAll(m_symbols) );
|
||||
|
||||
// clean internal map
|
||||
m_allSymbols.clear();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void SyntheticSymbols::restoreForModule(ULONG64 moduleBase)
|
||||
{
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
|
||||
SynSymRestore restorer(m_symbols);
|
||||
AllSymbols::iterator itFoundModule =
|
||||
m_allSymbols.find( restorer.modByBase(moduleBase) );
|
||||
if (itFoundModule == m_allSymbols.end())
|
||||
return;
|
||||
|
||||
forEachFromModule(moduleBase, itFoundModule->second, restorer);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void SyntheticSymbols::restoreAll()
|
||||
{
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
|
||||
// clean symbols from debug engine
|
||||
forEachLoadedModule( SynSymRestore(m_symbols) );
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG64 SyntheticSymbols::getRvaByName(
|
||||
ULONG timeDataStamp,
|
||||
ULONG checkSumm,
|
||||
const std::string &symName
|
||||
)
|
||||
{
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
AllSymbols::iterator itFoundModule =
|
||||
m_allSymbols.find( ModuleId(timeDataStamp, checkSumm) );
|
||||
if (itFoundModule == m_allSymbols.end())
|
||||
throw DbgException("Synthetic symbol is not found");
|
||||
|
||||
|
||||
ModSymbols::iterator itSynSymbol = itFoundModule->second.begin();
|
||||
while (itSynSymbol != itFoundModule->second.end())
|
||||
{
|
||||
if (boost::iequals(symName, itSynSymbol->second.m_name))
|
||||
return itSynSymbol->first;
|
||||
|
||||
++itSynSymbol;
|
||||
}
|
||||
throw DbgException("Synthetic symbol is not found");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void SyntheticSymbols::forEachFromModule(
|
||||
ULONG64 moduleBase,
|
||||
const ModSymbols &modSymbols,
|
||||
ISynSymForEach &forEach
|
||||
)
|
||||
{
|
||||
ModSymbols::const_iterator itSynSymbol = modSymbols.begin();
|
||||
while (itSynSymbol != modSymbols.end())
|
||||
{
|
||||
forEach.symbol(moduleBase, itSynSymbol->first, itSynSymbol->second);
|
||||
++itSynSymbol;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void SyntheticSymbols::forEachLoadedModule(ISynSymForEach &forEach)
|
||||
{
|
||||
// for loaded and unloaded modules...
|
||||
std::vector<DEBUG_MODULE_PARAMETERS> dbgModules;
|
||||
if (!SUCCEEDED(forEach.getAllModules(dbgModules)) || dbgModules.empty())
|
||||
{
|
||||
SymbolsScopedLock lock(*m_allSymbolsLock);
|
||||
m_allSymbols.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<DEBUG_MODULE_PARAMETERS>::iterator itModule = dbgModules.begin();
|
||||
while (itModule != dbgModules.end())
|
||||
{
|
||||
// ...do it!
|
||||
AllSymbols::const_iterator itFoundModule =
|
||||
m_allSymbols.find( ModuleId(*itModule) );
|
||||
if (itFoundModule != m_allSymbols.end())
|
||||
forEachFromModule(itModule->Base, itFoundModule->second, forEach);
|
||||
|
||||
++itModule;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
}; // namespace pykd
|
141
pykd/synsymbol.h
141
pykd/synsymbol.h
@ -1,141 +0,0 @@
|
||||
//
|
||||
// Synthetic symbol
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "dbgexcept.h"
|
||||
#include <map>
|
||||
|
||||
namespace pykd {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
interface ISynSymForEach;
|
||||
class DebugClient;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class SyntheticSymbols {
|
||||
public:
|
||||
SyntheticSymbols(
|
||||
IDebugSymbols3 &symbols,
|
||||
DebugClient &dbgClient
|
||||
);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Python API:
|
||||
|
||||
// add new synthetic symbol
|
||||
void add(
|
||||
ULONG64 addr,
|
||||
ULONG size,
|
||||
const std::string &symName
|
||||
);
|
||||
|
||||
// remove synthetic symbols by address
|
||||
ULONG remove(ULONG64 addr);
|
||||
|
||||
// remove synthetic symbols by module and symbol names
|
||||
ULONG removeByMask(
|
||||
const std::string &moduleName,
|
||||
const std::string &symName
|
||||
);
|
||||
|
||||
// remove all synthetic symbols from all modules
|
||||
void clear();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Debug event callback manager API:
|
||||
|
||||
void restoreForModule(ULONG64 moduleBase);
|
||||
void restoreAll();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Module API:
|
||||
|
||||
ULONG64 getRvaByName(
|
||||
ULONG timeDataStamp,
|
||||
ULONG checkSumm,
|
||||
const std::string &symName
|
||||
);
|
||||
|
||||
public:
|
||||
|
||||
// unique module ID
|
||||
struct ModuleId {
|
||||
ULONG m_timeDataStamp;
|
||||
ULONG m_checkSumm;
|
||||
|
||||
ModuleId(ULONG timeDataStamp, ULONG checkSumm)
|
||||
: m_timeDataStamp(timeDataStamp)
|
||||
, m_checkSumm(checkSumm)
|
||||
{
|
||||
}
|
||||
|
||||
ModuleId(const DEBUG_MODULE_PARAMETERS &dbgModuleParameters)
|
||||
: m_timeDataStamp(dbgModuleParameters.TimeDateStamp)
|
||||
, m_checkSumm(dbgModuleParameters.Checksum)
|
||||
{
|
||||
}
|
||||
|
||||
bool operator < (const ModuleId &rhs) const
|
||||
{
|
||||
return makeQword() < rhs.makeQword();
|
||||
}
|
||||
|
||||
private:
|
||||
LONG64 makeQword() const {
|
||||
return
|
||||
static_cast<LONG64>(m_timeDataStamp) |
|
||||
(static_cast<LONG64>(m_checkSumm) << 32);
|
||||
}
|
||||
};
|
||||
|
||||
// symbol data
|
||||
struct SymbolData {
|
||||
std::string m_name;
|
||||
ULONG m_size;
|
||||
};
|
||||
|
||||
// synthetic symbols of one module: offset -> name+size
|
||||
typedef ULONG64 SYM_OFFSET;
|
||||
typedef std::map<SYM_OFFSET, SymbolData> ModSymbols;
|
||||
|
||||
// synthetic symbols of all modules
|
||||
typedef std::map<ModuleId, ModSymbols> AllSymbols;
|
||||
|
||||
private:
|
||||
|
||||
// lock of static map
|
||||
typedef boost::shared_ptr<boost::recursive_mutex> SymbolsLock;
|
||||
typedef boost::recursive_mutex::scoped_lock SymbolsScopedLock;
|
||||
|
||||
private:
|
||||
|
||||
// execute for all symbols from modules
|
||||
void forEachFromModule(
|
||||
ULONG64 moduleBase,
|
||||
const ModSymbols &modSymbols,
|
||||
ISynSymForEach &forEach
|
||||
);
|
||||
|
||||
// execute for all symbols all loaded modules
|
||||
void forEachLoadedModule(ISynSymForEach &forEach);
|
||||
|
||||
private:
|
||||
|
||||
SymbolsLock m_allSymbolsLock;
|
||||
AllSymbols m_allSymbols;
|
||||
|
||||
DebugClient &m_dbgClient;
|
||||
IDebugSymbols3 &m_symbols;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef boost::shared_ptr<SyntheticSymbols> SynSymbolsPtr;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
}; // namespace pykd
|
@ -1,152 +0,0 @@
|
||||
|
||||
#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( "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( "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
|
@ -1,107 +0,0 @@
|
||||
//
|
||||
// Synthetic symbol helpers
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "synsymbol.h"
|
||||
|
||||
namespace pykd {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class SynSymHelper {
|
||||
public:
|
||||
SynSymHelper(IDebugSymbols3 &symbols) : m_symbols(symbols) {}
|
||||
|
||||
// remove array of synthetic symbols from debug engine
|
||||
bool removeSyntheticSymbols(
|
||||
const DEBUG_MODULE_AND_ID &dbgSymbols
|
||||
);
|
||||
ULONG removeSyntheticSymbols(
|
||||
const std::vector<DEBUG_MODULE_AND_ID> &arrSymbols
|
||||
);
|
||||
ULONG removeSyntheticSymbols(ULONG64 addr);
|
||||
|
||||
// buid ModuleId by base of image
|
||||
SyntheticSymbols::ModuleId modByBase(ULONG64 moduleBase);
|
||||
|
||||
// buid ModuleId by offset in image
|
||||
SyntheticSymbols::ModuleId modByOffset(
|
||||
ULONG64 moduleOffset,
|
||||
ULONG64 &moduleBase
|
||||
);
|
||||
|
||||
// get array of all modules
|
||||
HRESULT getAllModules(std::vector<DEBUG_MODULE_PARAMETERS> &dbgModules);
|
||||
|
||||
// get symbols by mask
|
||||
HRESULT getSymbolsByMaks(
|
||||
const std::string &symMask,
|
||||
std::vector<DEBUG_MODULE_AND_ID> &dbgSymbols
|
||||
);
|
||||
|
||||
protected:
|
||||
IDebugSymbols3 &m_symbols;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Enumerator all synthetic symbols for loaded modules
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
interface ISynSymForEach : public SynSymHelper {
|
||||
ISynSymForEach(IDebugSymbols3 &symbols) : SynSymHelper(symbols) {}
|
||||
|
||||
virtual void symbol(
|
||||
const ULONG64 moduleBase,
|
||||
SyntheticSymbols::SYM_OFFSET offset,
|
||||
const SyntheticSymbols::SymbolData &symData
|
||||
) = 0;
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Remove symbols from loaded modules
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
class SynSymRemoveAll : public ISynSymForEach
|
||||
{
|
||||
public:
|
||||
SynSymRemoveAll(IDebugSymbols3 &symbols) : ISynSymForEach(symbols) {}
|
||||
|
||||
virtual void symbol(
|
||||
const ULONG64 moduleBase,
|
||||
SyntheticSymbols::SYM_OFFSET offset,
|
||||
const SyntheticSymbols::SymbolData &/*symData*/
|
||||
) override
|
||||
{
|
||||
removeSyntheticSymbols(moduleBase + offset);
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Restore symbols for loaded modules
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
class SynSymRestore : public ISynSymForEach
|
||||
{
|
||||
public:
|
||||
SynSymRestore(IDebugSymbols3 &symbols) : ISynSymForEach(symbols) {}
|
||||
|
||||
virtual void symbol(
|
||||
const ULONG64 moduleBase,
|
||||
SyntheticSymbols::SYM_OFFSET offset,
|
||||
const SyntheticSymbols::SymbolData &symData
|
||||
) override
|
||||
{
|
||||
m_symbols.AddSyntheticSymbol(
|
||||
moduleBase + offset,
|
||||
symData.m_size,
|
||||
symData.m_name.c_str(),
|
||||
DEBUG_ADDSYNTHSYM_DEFAULT,
|
||||
NULL);
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
}; // namespace pykd
|
Loading…
Reference in New Issue
Block a user