diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index eb992d4..ef04f35 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -57,13 +57,15 @@ BOOST_PYTHON_FUNCTION_OVERLOADS( getSourceFile_, kdlib::getSourceFile, 0, 1 ); //BOOST_PYTHON_FUNCTION_OVERLOADS( setHardwareBp_, setHardwareBp, 3, 4 ); // -//BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( TypeBuilder_createStruct, TypeBuilder::createStruct, 1, 2 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( createStruct_, kdlib::defineStruct, 1, 2 ); // BOOST_PYTHON_FUNCTION_OVERLOADS( Module_enumSymbols, ModuleAdapter::enumSymbols, 1, 2 ); BOOST_PYTHON_FUNCTION_OVERLOADS( Module_findSymbol, ModuleAdapter::findSymbol, 2, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( findSymbol_, TypeInfoAdapter::findSymbol, 1, 2 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( TypeInfo_ptrTo, TypeInfoAdapter::ptrTo, 1, 2 ); + //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_findSymbol, Module::getSymbolNameByVa, 1, 2 ); @@ -257,8 +259,12 @@ BOOST_PYTHON_MODULE( pykd ) python::def("containingRecord", &TypedVarAdapter::containingRecordByType, "Return instance of the typedVar class. It's value are loaded from the target memory." "The start address is calculated by the same method as the standard macro CONTAINING_RECORD does" ); - python::def("customStruct", &kdlib::defineStruct, + python::def("createStruct", &kdlib::defineStruct, "return custom defined struct" ); + python::def( "createStruct", &kdlib::defineStruct, createStruct_( python::args( "name", "align" ), + "Create custom struct" ) ); + python::def( "createUnion", &kdlib::defineUnion, + "Create custom union" ); // CPU registers python::def( "reg", &getRegisterByName, @@ -409,10 +415,6 @@ BOOST_PYTHON_MODULE( pykd ) "Return a size of the type or variable" ) .def("type", &kdlib::Module::getTypeByName, "Return typeInfo class by type name" ) - //.def("getUdts", &Module::getUdts, - // "Return a list of all user-defined type names" ) - //.def("getEnums", &Module::getEnums, - // "Return a list of all enumeration names" ) .def("typedVar", &kdlib::Module::getTypedVarByAddr, "Return a typedVar class instance" ) .def("typedVar",&kdlib::Module::getTypedVarByName, @@ -467,10 +469,10 @@ BOOST_PYTHON_MODULE( pykd ) // "Return type as python dict ( for enum types )" ) .def( "deref", &kdlib::TypeInfo::deref, "Return type of pointer" ) - //.def( "append", &kdlib::TypeInfo::appendField, - // "Add a new field to custom defined struct" ) - .def( "ptrTo", &kdlib::TypeInfo::ptrTo, - "Return pointer to the type" ) + .def( "append", &kdlib::TypeInfo::appendField, + "Add a new field to custom defined struct" ) + .def( "ptrTo", &TypeInfoAdapter::ptrTo, TypeInfo_ptrTo( python::args( "ptrSize" ), + "Return pointer to the type" ) ) .def( "arrayOf", &kdlib::TypeInfo::arrayOf, "Return array of the type" ) .def( "isArray", &kdlib::TypeInfo::isArray, @@ -519,8 +521,6 @@ BOOST_PYTHON_MODULE( pykd ) "Return list of tuple ( filedName, fieldOffset, fieldValue )" ) .def( "fieldName", &kdlib::TypedVar::getElementName, "Return name of struct field by index" ) - //.def( "dataKind", &kdlib::TypedVar::getDataKind, - // "Retrieves the variable classification of a data: DataIsXxx") .def("deref", &kdlib::TypedVar::deref, "Return value by pointer" ) .def("type", &kdlib::TypedVar::getType, @@ -578,12 +578,6 @@ BOOST_PYTHON_MODULE( pykd ) .def("__getattr__", &CPUContextAdaptor::getRegisterByName ) .def("__getitem__", &CPUContextAdaptor::getRegisterByIndex ); - // python::class_<ScopeVars,ScopeVarsPtr,boost::noncopyable>( "locals", - // "Class for access to local vars", python::no_init ) - // .def("__len__", &ScopeVars::getVarCount ) - // .def("__getitem__", &ScopeVars::getVarByIndex ) - // .def("__getitem__", &ScopeVars::getVarByName ); - python::class_<kdlib::SystemInfo>( "systemVersion", "Operation system version", python::no_init) //.def_readonly( "platformId", &SystemVersion::platformId, diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index 1cf7fb7..81dd195 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -73,6 +73,10 @@ struct TypeInfoAdapter : public kdlib::TypeInfo { return typeInfo.getElement(index); } + static kdlib::TypeInfoPtr ptrTo( kdlib::TypeInfo &typeInfo, size_t ptrSize = 0 ) { + return typeInfo.ptrTo(ptrSize); + } + }; struct BaseTypesEnum { diff --git a/test/scripts/customtypestest.py b/test/scripts/customtypestest.py index bd702ed..d92e0c3 100644 --- a/test/scripts/customtypestest.py +++ b/test/scripts/customtypestest.py @@ -3,27 +3,25 @@ import unittest import target import pykd +from pykd import baseTypes class CustomTypesTest(unittest.TestCase): def testCommonStruct(self): + mySubStruct =pykd.createStruct("MySubCustomStruct") + mySubStruct.append( "m_uint1", baseTypes.UInt1B ) + mySubStruct.append( "m_uint2", baseTypes.UInt2B ) - tb = pykd.typeBuilder() - - mySubStruct =tb.createStruct("MySubCustomStruct") - mySubStruct.append( "m_uint1", tb.UInt1B ) - mySubStruct.append( "m_uint2", tb.UInt2B ) + mySubUnion = pykd.createUnion("MySubCustomUnion") + mySubUnion.append( "m_uint1", baseTypes.UInt1B ) + mySubUnion.append( "m_uint2", baseTypes.UInt2B ) - mySubUnion = tb.createUnion("MySubCustomUnion") - mySubUnion.append( "m_uint1", tb.UInt1B ) - mySubUnion.append( "m_uint2", tb.UInt2B ) - - myType = tb.createStruct("MyCustomStruct") - myType.append( "m_uint1", tb.UInt1B ) - myType.append( "m_uint4", tb.UInt4B ) - myType.append( "m_uint2", tb.UInt2B ) + myType =pykd.createStruct("MyCustomStruct") + myType.append( "m_uint1", baseTypes.UInt1B ) + myType.append( "m_uint4", baseTypes.UInt4B ) + myType.append( "m_uint2", baseTypes.UInt2B ) myType.append( "m_struct", mySubStruct ) myType.append( "m_union", mySubUnion ) - myType.append( "m_uint8", tb.UInt8B ) + myType.append( "m_uint8", baseTypes.UInt8B ) self.assertTrue( myType.size() != 0 ) self.assertTrue( myType.size() >= myType.fieldOffset("m_uint8") + myType.m_uint8.size() ) @@ -42,16 +40,12 @@ class CustomTypesTest(unittest.TestCase): self.assertTrue( myType.fieldOffset("m_struct") < myType.fieldOffset("m_union") ) self.assertTrue( myType.fieldOffset("m_struct") + myType.m_struct.size() <= myType.fieldOffset("m_union") ) - # print myType - def testCommonUnion(self): - tb = pykd.typeBuilder() - - myType = tb.createUnion("MyCustomStruct") - myType.append( "m_uint1", tb.UInt1B ) - myType.append( "m_uint4", tb.UInt4B ) - myType.append( "m_uint2", tb.UInt2B ) + myType = pykd.createUnion("MyCustomStruct") + myType.append( "m_uint1", baseTypes.UInt1B ) + myType.append( "m_uint4", baseTypes.UInt4B ) + myType.append( "m_uint2", baseTypes.UInt2B ) self.assertFalse( myType.size() == 0 ) self.assertTrue( myType.fieldOffset("m_uint1") == 0 ) @@ -59,74 +53,46 @@ class CustomTypesTest(unittest.TestCase): self.assertTrue( myType.fieldOffset("m_uint2") == 0 ) def testEmptyType(self): - tb = pykd.typeBuilder() - - myEmptyStruct1 = tb.createStruct("EmptyStruct1") + + myEmptyStruct1 = pykd.createStruct("EmptyStruct1") self.assertEqual( 0, myEmptyStruct1.size() ) - myEmptyStruct1.append("m_emptyStruct2", tb.createStruct("EmptyStruct2")) + myEmptyStruct1.append("m_emptyStruct2", pykd.createStruct("EmptyStruct2")) self.assertEqual( 0, myEmptyStruct1.size() ) - myEmptyUnion1 = tb.createUnion("EmptyUnion1") + myEmptyUnion1 = pykd.createUnion("EmptyUnion1") self.assertEqual( 0, myEmptyUnion1.size() ) myEmptyStruct1.append("m_emptyUnion2", myEmptyUnion1) self.assertEqual( 0, myEmptyStruct1.size() ) - myEmptyUnion1.append("m_emptyStruct3", tb.createStruct("EmptyStruct3")) + myEmptyUnion1.append("m_emptyStruct3", pykd.createStruct("EmptyStruct3")) self.assertEqual( 0, myEmptyUnion1.size() ) def testDupFieldName(self): - tb = pykd.typeBuilder() - - myType = tb.createStruct("MyCustomStruct") + myType = pykd.createStruct("MyCustomStruct") exceptionRised = False - myType.append( "m_uint1", tb.UInt1B ) + myType.append( "m_uint1", baseTypes.UInt1B ) try: - myType.append( "m_uint1", tb.UInt1B ) + myType.append( "m_uint1", baseTypes.UInt1B ) except pykd.TypeException: exceptionRised = True self.assertTrue(exceptionRised) - myType = tb.createUnion("MyCustomStruct") + myType = pykd.createUnion("MyCustomStruct") exceptionRised = False - myType.append( "m_uint1", tb.UInt1B ) + myType.append( "m_uint1", baseTypes.UInt1B ) try: - myType.append( "m_uint1", tb.UInt1B ) + myType.append( "m_uint1", baseTypes.UInt1B ) except pykd.TypeException: exceptionRised = True self.assertTrue(exceptionRised) - - def testBasicType(self): - tb = pykd.typeBuilder() - self.assertEqual( 1, tb.UInt1B.size() ) - self.assertEqual( 2, tb.UInt2B.size() ) - self.assertEqual( 4, tb.UInt4B.size() ) - self.assertEqual( 8, tb.UInt8B.size() ) - self.assertEqual( 1, tb.Int1B.size() ) - self.assertEqual( 2, tb.Int2B.size() ) - self.assertEqual( 4, tb.Int4B.size() ) - self.assertEqual( 8, tb.Int8B.size() ) - self.assertEqual( 1, tb.Bool.size() ) - self.assertEqual( 1, tb.Char.size() ) - self.assertEqual( 2, tb.WChar.size() ) - self.assertEqual( 4, tb.Long.size() ) - self.assertEqual( 4, tb.ULong.size() ) - def testVoidPtr(self): - self.assertEqual( 4, pykd.typeBuilder(4).VoidPtr.size() ) - self.assertEqual( 8, pykd.typeBuilder(8).VoidPtr.size() ) - self.assertEqual( pykd.ptrSize(), pykd.typeBuilder().VoidPtr.size() ) - self.assertEqual( 4, pykd.typeBuilder(4).UInt1B.ptrTo().size() ) - self.assertEqual( 8, pykd.typeBuilder(8).UInt1B.ptrTo().size() ) - self.assertEqual( pykd.ptrSize(), pykd.typeBuilder().UInt1B.ptrTo().size() ) - def testPtrToCustomType(self): - tb = pykd.typeBuilder() - mySubStruct =tb.createStruct("MySubCustomStruct") - mySubStruct.append( "m_uint1", tb.UInt1B ) - mySubStruct.append( "m_uint2", tb.UInt2B ) + mySubStruct =pykd.createStruct("MySubCustomStruct") + mySubStruct.append( "m_uint1", baseTypes.UInt1B ) + mySubStruct.append( "m_uint2", baseTypes.UInt2B ) mySubStructPtr = mySubStruct.ptrTo() self.assertEqual( pykd.ptrSize(), mySubStructPtr.size() ) diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index a29ec89..40a4a67 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -20,10 +20,11 @@ import typeinfo import typedvar import breakpoint import regtest +import stacktest +import customtypestest + #import mspdbtest -#import localstest -#import customtypestest #import ehexcepttest #import ehstatustest #import ehsymbolstest @@ -54,16 +55,16 @@ def getTestSuite( singleName = "" ): unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ), unittest.TestLoader().loadTestsFromTestCase( typedvar.TypedVarTest ), unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest ), - #unittest.TestLoader().loadTestsFromTestCase( customtypestest.CustomTypesTest ), + unittest.TestLoader().loadTestsFromTestCase( customtypestest.CustomTypesTest ), # ^^^ unittest.TestLoader().loadTestsFromTestCase( TerminateProcessTest ), unittest.TestLoader().loadTestsFromTestCase( breakpoint.BreakpointTest ), + unittest.TestLoader().loadTestsFromTestCase( stacktest.StackTest ), - + #unittest.TestLoader().loadTestsFromTestCase( localstest.LocalVarsTest ) #unittest.TestLoader().loadTestsFromTestCase( mspdbtest.MsPdbTest ), - #unittest.TestLoader().loadTestsFromTestCase( localstest.LocalVarsTest ), #unittest.TestLoader().loadTestsFromTestCase( ehexcepttest.EhExceptionTest ), #unittest.TestLoader().loadTestsFromTestCase( ehstatustest.EhStatusTest ), #unittest.TestLoader().loadTestsFromTestCase( ehsymbolstest.EhSymbolsTest ), @@ -84,3 +85,4 @@ if __name__ == "__main__": target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0] unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite() ) +