pykd/pykd/vardata.cpp
SND\kernelnet_cp 3a47a6574d [0.2.x] added : cpuReg class
git-svn-id: https://pykd.svn.codeplex.com/svn@78577 9b283d60-5439-405e-af05-b73fd8c4d996
2017-11-08 17:42:50 +04:00

163 lines
3.9 KiB
C++

//
// Access to variable data
//
#include "stdafx.h"
#include "vardata.h"
#include "dbgengine.h"
#include "dbgexcept.h"
////////////////////////////////////////////////////////////////////////////////
namespace pykd {
////////////////////////////////////////////////////////////////////////////////
VarDataMemory::VarDataMemory(ULONG64 addr) :
m_addr(addr)
{
}
////////////////////////////////////////////////////////////////////////////////
std::string VarDataMemory::asString() const
{
std::stringstream sstr;
sstr << "at 0x" << std::hex << m_addr;
return sstr.str();
}
////////////////////////////////////////////////////////////////////////////////
ULONG64 VarDataMemory::getAddr() const
{
return m_addr;
}
////////////////////////////////////////////////////////////////////////////////
VarDataPtr VarDataMemory::fork(ULONG offset) const
{
return VarDataPtr( new VarDataMemory(m_addr + offset) );
}
////////////////////////////////////////////////////////////////////////////////
void VarDataMemory::read(PVOID buffer, ULONG length, ULONG offset /*= 0*/) const
{
readMemory( m_addr + offset, buffer, length);
}
////////////////////////////////////////////////////////////////////////////////
ULONG64 VarDataMemory::readPtr() const
{
return ptrPtr( m_addr );
}
//////////////////////////////////////////////////////////////////////////////
VarDataConst::VarDataConst( SymbolPtr &symData) :
m_fieldOffset(0)
{
symData->getValue(m_value);
}
// VARIANT vtValue = {0};
// symData->getValue(vtValue);
//
// switch (vtValue.vt)
// {
// case VT_I1:
// case VT_UI1:
// fillDataBuff(vtValue.bVal);
// break;
//
// case VT_BOOL:
// fillDataBuff(!!vtValue.iVal);
// break;
//
// case VT_I2:
// case VT_UI2:
// fillDataBuff(vtValue.iVal);
// break;
//
// case VT_I4:
// case VT_UI4:
// case VT_INT:
// case VT_UINT:
// case VT_ERROR:
// case VT_HRESULT:
// fillDataBuff(vtValue.lVal);
// break;
//
// case VT_I8:
// case VT_UI8:
// fillDataBuff(vtValue.llVal);
// break;
//
// case VT_R4:
// fillDataBuff(vtValue.fltVal);
// break;
//
// case VT_R8:
// fillDataBuff(vtValue.dblVal);
// break;
//
// default:
// throw DbgException( "Unsupported const value" );
// }
//}
//////////////////////////////////////////////////////////////////////////////////
std::string VarDataConst::asString() const
{
return "<constant>";
}
//////////////////////////////////////////////////////////////////////////////////
ULONG64 VarDataConst::getAddr() const
{
throw DbgException("Constant does not have address");
}
//////////////////////////////////////////////////////////////////////////////////
VarDataPtr VarDataConst::fork(ULONG offset) const
{
return VarDataPtr(new VarDataConst(*this, offset));
}
//////////////////////////////////////////////////////////////////////////////////
void VarDataConst::read(PVOID buffer, ULONG length, ULONG offset /*= 0*/) const
{
ULONG64 val = boost::apply_visitor( VariantToULong64(), m_value );
if (offset + length > sizeof(val) )
throw DbgException("Internal error in " __FUNCTION__);
RtlCopyMemory(buffer, (char*)&val + offset, length);
}
//////////////////////////////////////////////////////////////////////////////////'
ULONG64 VarDataConst::readPtr() const
{
return boost::apply_visitor( VariantToULong64(), m_value );
}
//////////////////////////////////////////////////////////////////////////////////
VarDataConst::VarDataConst(const VarDataConst &from, ULONG fieldOffset) :
m_fieldOffset(from.m_fieldOffset + fieldOffset),
m_value(from.m_value)
{
}
//////////////////////////////////////////////////////////////////////////////////
} // end pykd namespace