From 95162f8de74e78bf29720f6aecafce5dd6466dda Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Wed, 24 Jul 2013 17:15:44 +0000 Subject: [PATCH] [0.3.x] added: typedVar for function git-svn-id: https://pykd.svn.codeplex.com/svn@84455 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dllmain.cpp | 2 +- pykd/typedvar.h | 4 ++-- test/scripts/typedvar.py | 35 +++++++++++++++++------------------ 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/pykd/dllmain.cpp b/pykd/dllmain.cpp index 93034ff..81978be 100644 --- a/pykd/dllmain.cpp +++ b/pykd/dllmain.cpp @@ -19,7 +19,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, break; case DLL_PROCESS_DETACH: - kdlib::uninitialize(); + kdlib::uninitialize(); break; } return TRUE; diff --git a/pykd/typedvar.h b/pykd/typedvar.h index 76940ca..7a91029 100644 --- a/pykd/typedvar.h +++ b/pykd/typedvar.h @@ -17,12 +17,12 @@ struct TypedVarAdapter { } static kdlib::TypedVarPtr getTypedVarByTypeName( const std::wstring &name, kdlib::MEMOFFSET_64 addr ) { - return kdlib::loadTypedVar( name, addr ); + return kdlib::loadTypedVar( name, addr, kdlib::SymbolPtr() ); } static kdlib::TypedVarPtr getTypedVarByTypeInfo( const kdlib::TypeInfoPtr &typeInfo, kdlib::MEMOFFSET_64 addr ) { - return kdlib::loadTypedVar( typeInfo, addr ); + return kdlib::loadTypedVar( typeInfo, addr, kdlib::SymbolPtr() ); } static kdlib::MEMOFFSET_32 getFieldOffsetByName( kdlib::TypedVar& typedVar, const std::wstring &name ) { diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index db8704f..e510c4e 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -234,22 +234,21 @@ class TypedVarTest( unittest.TestCase ): self.assertEqual( 4, tv.m_fieldNestedStruct ) self.assertEqual( 5, tv.m_fieldOfUnNamed ) - def testPointerToFunction(self): - + def testFunctionPtr(self): funcptr = target.module.typedVar( "CdeclFuncPtr" ) - self.assertEqual( funcptr.deref(), target.module.CdeclFunc ) + # CdeclFuncPtr -> jmp targetapp!CdeclFunc (00bd1ba0) + # self.assertEqual( funcptr, target.module.CdeclFunc ) + self.assertEqual( funcptr.type().deref().name(), target.module.typedVar("CdeclFunc").type().name() ) + self.assertEqual( funcptr.type().name(), target.module.typedVar("CdeclFunc").type().ptrTo().name() ) - #tv1 = target.module.typedVar( "g_unTypedPtrToFunction" ) + def testFunctionRange(self): + func1 = target.module.typedVar("CdeclFunc") + self.assertTrue( func1.getAddress() >= target.module.begin() ) + self.assertTrue( func1.getAddress() + func1.sizeof() <= target.module.end() ) - # if debug: g_unTypedPtrToFunction point to jmp EnumWindowsProc2 (e9 xxxxxxxx) - #self.assertTrue( ( target.module.offset("EnumWindowsProc2") == tv1 ) or - # ( 0xE9 == pykd.ptrByte( long(tv1) ) ) ) - - #tv2 = target.module.typedVar( "g_unTypedPtrToFunction" ) - #self.assertEqual( tv1, tv2 ) - - #self.assertRaises( pykd.TypeException, tv1.deref ) - #self.assertRaises( pykd.TypeException, tv2.deref ) + func2 = target.module.typedVar( target.module.StdcallFunc ) + self.assertTrue( func2.getAddress() >= target.module.begin() ) + self.assertTrue( func2.getAddress() + func2.sizeof() <= target.module.end() ) def testTypeVarArg(self): tv1 = target.module.typedVar( "structTest", target.module.g_structTest ) @@ -316,8 +315,8 @@ class TypedVarTest( unittest.TestCase ): str( field ) def testDeadlockList(self): - lst = [] - entry = pykd.typedVar("deadlockEntry").flink - for i in range( 0, 100000 ): - lst.append(entry) - entry = entry.deref().flink + lst = [] + entry = pykd.typedVar("deadlockEntry").flink + for i in range( 0, 100000 ): + lst.append(entry) + entry = entry.deref().flink