mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-21 21:03:23 +08:00
added typeInfo::scopeName method
added typeInfoProviderIterator class added typeInfoProvider::getIterator method added typeInfoProvider::__iter__ method added typeInfoProvider::__getattr__ method
This commit is contained in:
parent
7fa4ec351a
commit
223c225d71
2
kdlibcpp
2
kdlibcpp
@ -1 +1 @@
|
|||||||
Subproject commit 8d28d97eaa231f1c7c8147e9a54d71344deeea21
|
Subproject commit b4c87cee2d2b6e373c4cc35bde49c60a777d0ecb
|
@ -2,7 +2,7 @@
|
|||||||
#define PYKD_VERSION_MAJOR 0
|
#define PYKD_VERSION_MAJOR 0
|
||||||
#define PYKD_VERSION_MINOR 3
|
#define PYKD_VERSION_MINOR 3
|
||||||
#define PYKD_VERSION_SUBVERSION 3
|
#define PYKD_VERSION_SUBVERSION 3
|
||||||
#define PYKD_VERSION_BUILDNO 3
|
#define PYKD_VERSION_BUILDNO 4
|
||||||
|
|
||||||
#define __VER_STR2__(x) #x
|
#define __VER_STR2__(x) #x
|
||||||
#define __VER_STR1__(x) __VER_STR2__(x)
|
#define __VER_STR1__(x) __VER_STR2__(x)
|
||||||
|
@ -878,6 +878,8 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
.def("__init__", python::make_constructor( pykd::getTypeInfoByName ) )
|
.def("__init__", python::make_constructor( pykd::getTypeInfoByName ) )
|
||||||
.def( "name", TypeInfoAdapter::getName,
|
.def( "name", TypeInfoAdapter::getName,
|
||||||
"Return type name" )
|
"Return type name" )
|
||||||
|
.def("scopeName", TypeInfoAdapter::getScopeName,
|
||||||
|
"Return name of type scope ( module name )" )
|
||||||
.def( "size", TypeInfoAdapter::getSize,
|
.def( "size", TypeInfoAdapter::getSize,
|
||||||
"Return type size" )
|
"Return type size" )
|
||||||
.def( "staticOffset", TypeInfoAdapter::getStaticOffset,
|
.def( "staticOffset", TypeInfoAdapter::getStaticOffset,
|
||||||
@ -1229,10 +1231,25 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Change the current instruction" )
|
"Change the current instruction" )
|
||||||
.def( "__str__", DisasmAdapter::instruction );
|
.def( "__str__", DisasmAdapter::instruction );
|
||||||
|
|
||||||
|
|
||||||
|
python::class_<TypeInfoProviderIterator>("typeInfoProviderIterator", "iterator for type provider", python::no_init)
|
||||||
|
.def("__iter__", &TypeInfoProviderIterator::self)
|
||||||
|
#if PY_VERSION_HEX < 0x03000000
|
||||||
|
.def("next", &TypeInfoProviderIterator::next)
|
||||||
|
#else
|
||||||
|
.def("__next__", &TypeInfoProviderIterator::next)
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
python::class_<kdlib::TypeInfoProvider, kdlib::TypeInfoProviderPtr, boost::noncopyable>("typeInfoProvider",
|
python::class_<kdlib::TypeInfoProvider, kdlib::TypeInfoProviderPtr, boost::noncopyable>("typeInfoProvider",
|
||||||
"Get abstaract access to different type info sources", python::no_init)
|
"Get abstaract access to different type info sources", python::no_init)
|
||||||
.def( "getTypeByName", TypeInfoProviderAdapter::getTypeByName,
|
.def( "getTypeByName", TypeInfoProviderAdapter::getTypeByName,
|
||||||
"Get type info by it's name" )
|
"Get type info by it's name" )
|
||||||
|
.def( "typeIterator", TypeInfoProviderAdapter::getTypeIterWithMask, python::return_value_policy<python::manage_new_object>(),
|
||||||
|
"Return type iterator with specified mask")
|
||||||
|
.def("__iter__", TypeInfoProviderAdapter::getTypeIter, python::return_value_policy<python::manage_new_object>())
|
||||||
|
.def( "__getattr__", TypeInfoProviderAdapter::getTypeAsAttr )
|
||||||
;
|
;
|
||||||
|
|
||||||
python::enum_<kdlib::DebugCallbackResult>("eventResult", "Return value of event handler")
|
python::enum_<kdlib::DebugCallbackResult>("eventResult", "Return value of event handler")
|
||||||
|
@ -356,5 +356,21 @@ python::object callFunctionRaw( python::tuple& args, python::dict& kwargs)
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
kdlib::TypeInfoPtr TypeInfoProviderAdapter::getTypeAsAttr(kdlib::TypeInfoProvider &typeInfoProvider, const std::wstring& name)
|
||||||
|
{
|
||||||
|
|
||||||
|
try {
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
return typeInfoProvider.getTypeByName(name);
|
||||||
|
}
|
||||||
|
catch (kdlib::TypeException&)
|
||||||
|
{}
|
||||||
|
|
||||||
|
std::wstringstream sstr;
|
||||||
|
sstr << L'\'' << name << L'\'' << L" not found";
|
||||||
|
throw AttributeException(std::string(_bstr_t(sstr.str().c_str())).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
} // pykd namespace
|
} // pykd namespace
|
||||||
|
@ -83,6 +83,12 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
|
|||||||
return typeInfo.getName();
|
return typeInfo.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::wstring getScopeName( kdlib::TypeInfo &typeInfo )
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
return typeInfo.getScopeName();
|
||||||
|
}
|
||||||
|
|
||||||
static size_t getSize( kdlib::TypeInfo &typeInfo )
|
static size_t getSize( kdlib::TypeInfo &typeInfo )
|
||||||
{
|
{
|
||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
@ -309,6 +315,38 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TypeInfoProviderIterator {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
TypeInfoProviderIterator(kdlib::TypeInfoEnumeratorPtr typeInfoEnum) :
|
||||||
|
m_typeInfoEnum(typeInfoEnum)
|
||||||
|
{}
|
||||||
|
|
||||||
|
static python::object self(const python::object& obj)
|
||||||
|
{
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
kdlib::TypeInfoPtr next()
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
|
kdlib::TypeInfoPtr typeInfo = m_typeInfoEnum->Next();
|
||||||
|
|
||||||
|
if (!typeInfo)
|
||||||
|
throw StopIteration("No more data.");
|
||||||
|
|
||||||
|
return typeInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
kdlib::TypeInfoEnumeratorPtr m_typeInfoEnum;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
struct TypeInfoProviderAdapter : public kdlib::TypeInfoProvider
|
struct TypeInfoProviderAdapter : public kdlib::TypeInfoProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -317,6 +355,19 @@ struct TypeInfoProviderAdapter : public kdlib::TypeInfoProvider
|
|||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
return typeInfoProvider.getTypeByName(name);
|
return typeInfoProvider.getTypeByName(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static TypeInfoProviderIterator* getTypeIter( kdlib::TypeInfoProvider &typeInfoProvider )
|
||||||
|
{
|
||||||
|
return new TypeInfoProviderIterator( typeInfoProvider.getTypeEnumerator() );
|
||||||
|
};
|
||||||
|
|
||||||
|
static TypeInfoProviderIterator* getTypeIterWithMask( kdlib::TypeInfoProvider &typeInfoProvider, const std::wstring& mask)
|
||||||
|
{
|
||||||
|
return new TypeInfoProviderIterator( typeInfoProvider.getTypeEnumerator(mask) );
|
||||||
|
}
|
||||||
|
|
||||||
|
static kdlib::TypeInfoPtr getTypeAsAttr(kdlib::TypeInfoProvider &typeInfoProvider, const std::wstring& name);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BaseTypesEnum {
|
struct BaseTypesEnum {
|
||||||
@ -338,4 +389,9 @@ struct BaseTypesEnum {
|
|||||||
static kdlib::TypeInfoPtr getDouble() { return pykd::getTypeInfoByName(L"Double"); }
|
static kdlib::TypeInfoPtr getDouble() { return pykd::getTypeInfoByName(L"Double"); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace pykd
|
} // end namespace pykd
|
||||||
|
@ -8,7 +8,7 @@ import sys
|
|||||||
|
|
||||||
_name = "pykd"
|
_name = "pykd"
|
||||||
_desc = "python windbg extension"
|
_desc = "python windbg extension"
|
||||||
_version = '0.3.3.2'
|
_version = '0.3.3.4'
|
||||||
|
|
||||||
def getReleaseSrc():
|
def getReleaseSrc():
|
||||||
return 'Release_%d.%d' % sys.version_info[0:2]
|
return 'Release_%d.%d' % sys.version_info[0:2]
|
||||||
|
@ -150,11 +150,13 @@ def printProcess(process,processFilter,threadFilter,moduleFilter,funcFilter,prin
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
setCPUMode(CPUType.I386)
|
dbgCommand(".thread /w %x" % thread)
|
||||||
|
#setCPUMode(CPUType.I386)
|
||||||
|
|
||||||
if not wow64reloaded:
|
#if not wow64reloaded:
|
||||||
dbgCommand( ".reload /user" )
|
dbgCommand( ".reload /user" )
|
||||||
wow64reloaded = True
|
# wow64reloaded = True
|
||||||
|
|
||||||
stkWow64 = getStack()
|
stkWow64 = getStack()
|
||||||
|
|
||||||
except DbgException:
|
except DbgException:
|
||||||
|
@ -342,3 +342,16 @@ class TypeInfoTest( unittest.TestCase ):
|
|||||||
classChild = target.module.type("classChild")
|
classChild = target.module.type("classChild")
|
||||||
self.assertEqual( ["classBase1", "classBase2"], [ classChild.baseClass(i).name() for i in range(classChild.getNumberBaseClasses()) ] )
|
self.assertEqual( ["classBase1", "classBase2"], [ classChild.baseClass(i).name() for i in range(classChild.getNumberBaseClasses()) ] )
|
||||||
|
|
||||||
|
def testPdbTypeProvider(self):
|
||||||
|
pdb = target.module.symfile()
|
||||||
|
typeProvider = pykd.getTypeInfoProviderFromPdb(pdb)
|
||||||
|
self.assertEqual("structTest", typeProvider.getTypeByName("structTest").name())
|
||||||
|
self.assertEqual("structTest", typeProvider.structTest.name())
|
||||||
|
self.assertEqual(22, len(list(typeProvider.typeIterator("*struct*"))))
|
||||||
|
|
||||||
|
def testScopeName(self):
|
||||||
|
self.assertEqual( target.module.name(), pykd.typeInfo( "structTest" ).scopeName() )
|
||||||
|
self.assertEqual( target.module.name(), pykd.typeInfo( "structWithNested::Nested" ).scopeName() )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user