[0.1.x] + pointer to unknown/unsupported type (f.e. pointer to function)

git-svn-id: https://pykd.svn.codeplex.com/svn@73298 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\EreTIk_cp 2012-01-19 13:29:01 +00:00 committed by Mikhail I. Izmestev
parent 7532741252
commit eceba31ad4
4 changed files with 39 additions and 3 deletions

View File

@ -10,7 +10,8 @@ TypeInfoPtr TypeInfo::getTypeInfo( pyDia::SymbolPtr &typeSym )
{ {
ULONG tag = typeSym->getSymTag(); ULONG tag = typeSym->getSymTag();
switch( typeSym->getSymTag() ) const ULONG symTag = typeSym->getSymTag();
switch( symTag )
{ {
case SymTagBaseType: case SymTagBaseType:
return getBaseTypeInfo( typeSym ); return getBaseTypeInfo( typeSym );
@ -218,16 +219,30 @@ BitFieldTypeInfo::BitFieldTypeInfo( pyDia::SymbolPtr &symbol )
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol ) PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol )
{
try
{ {
m_derefType = TypeInfo::getTypeInfo( symbol->getType() ); m_derefType = TypeInfo::getTypeInfo( symbol->getType() );
}
catch (const SymbolException &)
{
m_derefType.swap( TypeInfoPtr() );
}
m_size = (ULONG)symbol->getSize(); m_size = (ULONG)symbol->getSize();
} }
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symScope, const std::string &symName ) PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symScope, const std::string &symName )
{
try
{ {
m_derefType = TypeInfo::getTypeInfo( symScope, symName ); m_derefType = TypeInfo::getTypeInfo( symScope, symName );
}
catch (const SymbolException &)
{
m_derefType.swap( TypeInfoPtr() );
}
m_size = (symScope->getMachineType() == IMAGE_FILE_MACHINE_AMD64) ? 8 : 4; m_size = (symScope->getMachineType() == IMAGE_FILE_MACHINE_AMD64) ? 8 : 4;
} }

View File

@ -285,10 +285,14 @@ public:
} }
virtual TypeInfoPtr deref() { virtual TypeInfoPtr deref() {
if (!m_derefType)
throw TypeException("<ptr>", "this pointer can not be dereferenced");
return m_derefType; return m_derefType;
} }
TypeInfoPtr getDerefType() { TypeInfoPtr getDerefType() {
if (!m_derefType)
throw TypeException("<ptr>", "this pointer can not be dereferenced");
return m_derefType; return m_derefType;
} }

View File

@ -168,3 +168,13 @@ class TypedVarTest( unittest.TestCase ):
tv = target.module.typedVar( "g_unNamedStruct" ) tv = target.module.typedVar( "g_unNamedStruct" )
self.assertEqual( 4, tv.m_fieldNestedStruct ) self.assertEqual( 4, tv.m_fieldNestedStruct )
self.assertEqual( 5, tv.m_fieldOfUnNamed ) self.assertEqual( 5, tv.m_fieldOfUnNamed )
def testPointerToFunction( self ):
tv1 = target.module.typedVar( "g_unTypedPtrToFunction" )
self.assertEqual( target.module.offset("EnumWindowsProc2"), tv1 )
tv2 = target.module.typedVar( "g_unTypedPtrToFunction" )
self.assertEqual( tv1, tv2 )
self.assertRaises( pykd.TypeException, tv1.deref )
self.assertRaises( pykd.TypeException, tv2.deref )

View File

@ -214,6 +214,8 @@ struct StructWithNested {
StructWithNested g_structWithNested; StructWithNested g_structWithNested;
StructWithNested::Nested g_structNested; StructWithNested::Nested g_structNested;
WNDENUMPROC g_ptrToFunction;
void *g_unTypedPtrToFunction;
#pragma pack( pop ) #pragma pack( pop )
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -276,6 +278,7 @@ void FuncWithName0()
std::cout << g_classChild.m_enumField; std::cout << g_classChild.m_enumField;
std::cout << g_unNamedStruct.m_fieldNestedStruct; std::cout << g_unNamedStruct.m_fieldNestedStruct;
std::cout << g_structNested.m_nestedFiled; std::cout << g_structNested.m_nestedFiled;
std::cout << g_unTypedPtrToFunction;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -295,6 +298,7 @@ void FuncWithName1(int a)
std::cout << g_string; std::cout << g_string;
std::cout << g_unNamedStruct.m_fieldOfUnNamed; std::cout << g_unNamedStruct.m_fieldOfUnNamed;
std::cout << g_structWithNested.m_field; std::cout << g_structWithNested.m_field;
std::cout << g_ptrToFunction;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -392,6 +396,9 @@ int _tmain(int argc, _TCHAR* argv[])
g_structWithNested.m_field = 34; g_structWithNested.m_field = 34;
g_structNested.m_nestedFiled = 46; g_structNested.m_nestedFiled = 46;
g_ptrToFunction = &EnumWindowsProc2;
g_unTypedPtrToFunction = &EnumWindowsProc2;
// Let test scripts to execute // Let test scripts to execute
__debugbreak(); __debugbreak();