diff --git a/pykd/dbgengine.h b/pykd/dbgengine.h index 37accb8..cb3b5a1 100644 --- a/pykd/dbgengine.h +++ b/pykd/dbgengine.h @@ -34,6 +34,7 @@ ULONG64 findModuleBase( ULONG64 offset ); ULONG64 findModuleBySymbol( const std::string &symbolName ); std::string getModuleName( ULONG64 baseOffset ); std::string getModuleImageName( ULONG64 baseOffset ); +ULONG getModuleSize( ULONG64 baseOffset ); std::string getModuleSymbolFileName( ULONG64 baseOffset ); ULONG getModuleTimeStamp( ULONG64 baseOffset ); ULONG getModuleCheckSum( ULONG64 baseOffset ); diff --git a/pykd/win/dbgeng.cpp b/pykd/win/dbgeng.cpp index b7a0ee8..8bd6d66 100644 --- a/pykd/win/dbgeng.cpp +++ b/pykd/win/dbgeng.cpp @@ -271,6 +271,22 @@ std::string getModuleImageName( ULONG64 baseOffset ) /////////////////////////////////////////////////////////////////////////////////// +ULONG getModuleSize( ULONG64 baseOffset ) +{ + PyThread_StateRestore pyThreadRestore( g_dbgEng->pystate ); + + HRESULT hres; + DEBUG_MODULE_PARAMETERS moduleParam = { 0 }; + + hres = g_dbgEng->symbols->GetModuleParameters( 1, &baseOffset, 0, &moduleParam ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol::GetModuleParameters failed" ); + + return moduleParam.Size; +} + +/////////////////////////////////////////////////////////////////////////////////// + std::string getModuleSymbolFileName( ULONG64 baseOffset ) { PyThread_StateRestore pyThreadRestore( g_dbgEng->pystate ); diff --git a/test/scripts/moduletest.py b/test/scripts/moduletest.py index 90b974b..a1be47e 100644 --- a/test/scripts/moduletest.py +++ b/test/scripts/moduletest.py @@ -17,6 +17,7 @@ class ModuleTest( unittest.TestCase ): def testSize( self ): self.assertNotEqual( 0, target.module.size() ) + self.assertTrue( pykd.isValid( target.module.begin() + target.module.size() - 1) ) def testBegin( self ): self.assertNotEqual( 0, target.module.begin() ) @@ -25,6 +26,7 @@ class ModuleTest( unittest.TestCase ): def testEnd( self ): self.assertEqual( target.module.size(), target.module.end() - target.module.begin() ) + self.assertTrue( pykd.isValid( target.module.end() - 1) ) def testPdb( self ): self.assertNotEqual( "", target.module.symfile() ) @@ -33,7 +35,7 @@ class ModuleTest( unittest.TestCase ): self.assertEqual( target.module.name() + ".exe", target.module.image() ) def testFindModule( self ): - self.assertRaises( pykd.BaseException, pykd.module, target.module.begin() - 0x10 ) + self.assertRaises( pykd.BaseException, pykd.module, target.module.begin() - 0x10 ) self.assertNotEqual( None, pykd.module( target.module.begin() ) ) self.assertNotEqual( None, pykd.module( target.module.begin() + 0x10) )