From: <rom...@us...> - 2008-02-27 14:12:53
|
Revision: 1264 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1264&view=rev Author: roman_yakovenko Date: 2008-02-27 06:12:56 -0800 (Wed, 27 Feb 2008) Log Message: ----------- adding bsc support Modified Paths: -------------- pygccxml_dev/pygccxml/pdb_reader/bsc.py pygccxml_dev/pygccxml/pdb_reader/msvc_details.py Modified: pygccxml_dev/pygccxml/pdb_reader/bsc.py =================================================================== --- pygccxml_dev/pygccxml/pdb_reader/bsc.py 2008-02-26 20:38:16 UTC (rev 1263) +++ pygccxml_dev/pygccxml/pdb_reader/bsc.py 2008-02-27 14:12:56 UTC (rev 1264) @@ -1,10 +1,303 @@ import os import sys import ctypes +import logging import msvc_details +from ctypes import * +from ctypes.wintypes import ULONG +from ctypes.wintypes import DWORD +from ctypes.wintypes import BOOL +from ctypes.wintypes import BYTE +from ctypes.wintypes import WORD +from ctypes.wintypes import UINT -bsc = ctypes.cdll.LoadLibrary( msvc_details.msbsc_path ) +sys.path.append( r'../..' ) -class bsc_t( object ): - def __init__( self, bsc_file_path ): - self.__bsc_file = bsc_file_path \ No newline at end of file +from pygccxml import utils +from pygccxml import declarations + + +STRING = c_char_p +_libraries = {} +_libraries['msvcr70.dll'] = CDLL(msvc_details.msvcr_path, mode=RTLD_GLOBAL) +_libraries['msbsc70.dll'] = CDLL(msvc_details.msbsc_path, mode=RTLD_GLOBAL) + + +qyMac = 9 +refreshAllOp = 4 +qyDervOf = 7 +delOp = 1 +qyImpMembers = 8 +changeOp = 2 +qyRefs = 4 +qyCalls = 2 +changeIinstOp = 3 +qyContains = 1 +qyCalledBy = 3 +noOp = 5 +qyBaseOf = 6 +qyNil = 0 +addOp = 0 +qyDefs = 5 +PULONG = POINTER(ULONG) +USHORT = c_ushort +PUSHORT = POINTER(USHORT) +UCHAR = c_ubyte +PUCHAR = POINTER(UCHAR) +PSZ = STRING +FLOAT = c_float +PFLOAT = POINTER(FLOAT) +PBOOL = POINTER(BOOL) +LPBOOL = POINTER(BOOL) +PBYTE = POINTER(BYTE) +LPBYTE = POINTER(BYTE) +PINT = POINTER(c_int) +LPINT = POINTER(c_int) +PWORD = POINTER(WORD) +LPWORD = POINTER(WORD) +LPLONG = POINTER(c_long) +PDWORD = POINTER(DWORD) +LPDWORD = POINTER(DWORD) +LPVOID = c_void_p +LPCVOID = c_void_p +INT = c_int +PUINT = POINTER(c_uint) +ULONG_PTR = POINTER(ULONG) +NI = ULONG +IINST = ULONG +IREF = ULONG +IDEF = ULONG +IMOD = USHORT +LINE = USHORT +TYP = BYTE +ATR = USHORT +ATR32 = ULONG +MBF = ULONG +SZ = STRING +SZ_CONST = STRING + +class Bsc(Structure): + pass + +# values for enumeration 'OPERATION' +OPERATION = c_int # enum +class IinstInfo(Structure): + pass +IinstInfo._fields_ = [ + ('m_iinst', IINST), + ('m_szName', SZ_CONST), + ('m_ni', NI), +] +class BSC_STAT(Structure): + pass +BSC_STAT._fields_ = [ + ('cDef', ULONG), + ('cRef', ULONG), + ('cInst', ULONG), + ('cMod', ULONG), + ('cUseLink', ULONG), + ('cBaseLink', ULONG), +] +class NiQ(Structure): + pass +NiQ._fields_ = [ + ('m_iinstOld', IINST), + ('m_iInfoNew', IinstInfo), + ('m_op', OPERATION), + ('m_typ', TYP), +] +pfnNotifyChange = CFUNCTYPE(BOOL, POINTER(NiQ), ULONG, ULONG_PTR) + +# values for enumeration '_qy_' +_qy_ = c_int # enum +QY = _qy_ +Bsc._fields_ = [ +] +BSCOpen = _libraries['msbsc70.dll'].BSCOpen +BSCOpen.restype = BOOL +BSCOpen.argtypes = [SZ_CONST, POINTER(POINTER(Bsc))] +BSCClose = _libraries['msbsc70.dll'].BSCClose +BSCClose.restype = BOOL +BSCClose.argtypes = [POINTER(Bsc)] +BSCIinstInfo = _libraries['msbsc70.dll'].BSCIinstInfo +BSCIinstInfo.restype = BOOL +BSCIinstInfo.argtypes = [POINTER(Bsc), IINST, POINTER(SZ), POINTER(TYP), POINTER(ATR)] +BSCIrefInfo = _libraries['msbsc70.dll'].BSCIrefInfo +BSCIrefInfo.restype = BOOL +BSCIrefInfo.argtypes = [POINTER(Bsc), IREF, POINTER(SZ), POINTER(LINE)] +BSCIdefInfo = _libraries['msbsc70.dll'].BSCIdefInfo +BSCIdefInfo.restype = BOOL +BSCIdefInfo.argtypes = [POINTER(Bsc), IDEF, POINTER(SZ), POINTER(LINE)] +BSCImodInfo = _libraries['msbsc70.dll'].BSCImodInfo +BSCImodInfo.restype = BOOL +BSCImodInfo.argtypes = [POINTER(Bsc), IMOD, POINTER(SZ)] +BSCSzFrTyp = _libraries['msbsc70.dll'].BSCSzFrTyp +BSCSzFrTyp.restype = SZ +BSCSzFrTyp.argtypes = [POINTER(Bsc), TYP] +BSCSzFrAtr = _libraries['msbsc70.dll'].BSCSzFrAtr +BSCSzFrAtr.restype = SZ +BSCSzFrAtr.argtypes = [POINTER(Bsc), ATR] +BSCGetIinstByvalue = _libraries['msbsc70.dll'].BSCGetIinstByvalue +BSCGetIinstByvalue.restype = BOOL +BSCGetIinstByvalue.argtypes = [POINTER(Bsc), SZ, TYP, ATR, POINTER(IINST)] +BSCGetOverloadArray = _libraries['msbsc70.dll'].BSCGetOverloadArray +BSCGetOverloadArray.restype = BOOL +BSCGetOverloadArray.argtypes = [POINTER(Bsc), SZ, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetUsedByArray = _libraries['msbsc70.dll'].BSCGetUsedByArray +BSCGetUsedByArray.restype = BOOL +BSCGetUsedByArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetUsesArray = _libraries['msbsc70.dll'].BSCGetUsesArray +BSCGetUsesArray.restype = BOOL +BSCGetUsesArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetBaseArray = _libraries['msbsc70.dll'].BSCGetBaseArray +BSCGetBaseArray.restype = BOOL +BSCGetBaseArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetDervArray = _libraries['msbsc70.dll'].BSCGetDervArray +BSCGetDervArray.restype = BOOL +BSCGetDervArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetMembersArray = _libraries['msbsc70.dll'].BSCGetMembersArray +BSCGetMembersArray.restype = BOOL +BSCGetMembersArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetDefArray = _libraries['msbsc70.dll'].BSCGetDefArray +BSCGetDefArray.restype = BOOL +BSCGetDefArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IREF)), POINTER(ULONG)] +BSCGetRefArray = _libraries['msbsc70.dll'].BSCGetRefArray +BSCGetRefArray.restype = BOOL +BSCGetRefArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IREF)), POINTER(ULONG)] +BSCGetModuleContents = _libraries['msbsc70.dll'].BSCGetModuleContents +BSCGetModuleContents.restype = BOOL +BSCGetModuleContents.argtypes = [POINTER(Bsc), IMOD, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetModuleByName = _libraries['msbsc70.dll'].BSCGetModuleByName +BSCGetModuleByName.restype = BOOL +BSCGetModuleByName.argtypes = [POINTER(Bsc), SZ, POINTER(IMOD)] +BSCGetAllModulesArray = _libraries['msbsc70.dll'].BSCGetAllModulesArray +BSCGetAllModulesArray.restype = BOOL +BSCGetAllModulesArray.argtypes = [POINTER(Bsc), POINTER(POINTER(IMOD)), POINTER(ULONG)] +BSCDisposeArray = _libraries['msbsc70.dll'].BSCDisposeArray +BSCDisposeArray.restype = None +BSCDisposeArray.argtypes = [POINTER(Bsc), c_void_p] +BSCFormatDname = _libraries['msbsc70.dll'].BSCFormatDname +BSCFormatDname.restype = SZ +BSCFormatDname.argtypes = [POINTER(Bsc), SZ] +BSCFInstFilter = _libraries['msbsc70.dll'].BSCFInstFilter +BSCFInstFilter.restype = BOOL +BSCFInstFilter.argtypes = [POINTER(Bsc), IINST, MBF] +BSCIinstFrIref = _libraries['msbsc70.dll'].BSCIinstFrIref +BSCIinstFrIref.restype = IINST +BSCIinstFrIref.argtypes = [POINTER(Bsc), IREF] +BSCIinstFrIdef = _libraries['msbsc70.dll'].BSCIinstFrIdef +BSCIinstFrIdef.restype = IINST +BSCIinstFrIdef.argtypes = [POINTER(Bsc), IDEF] +BSCIinstContextIref = _libraries['msbsc70.dll'].BSCIinstContextIref +BSCIinstContextIref.restype = IINST +BSCIinstContextIref.argtypes = [POINTER(Bsc), IREF] +BSCGetStatistics = _libraries['msbsc70.dll'].BSCGetStatistics +BSCGetStatistics.restype = BOOL +BSCGetStatistics.argtypes = [POINTER(Bsc), POINTER(BSC_STAT)] +BSCGetModuleStatistics = _libraries['msbsc70.dll'].BSCGetModuleStatistics +BSCGetModuleStatistics.restype = BOOL +BSCGetModuleStatistics.argtypes = [POINTER(Bsc), IMOD, POINTER(BSC_STAT)] +BSCFCaseSensitive = _libraries['msbsc70.dll'].BSCFCaseSensitive +BSCFCaseSensitive.restype = BOOL +BSCFCaseSensitive.argtypes = [POINTER(Bsc)] +BSCSetCaseSensitivity = _libraries['msbsc70.dll'].BSCSetCaseSensitivity +BSCSetCaseSensitivity.restype = BOOL +BSCSetCaseSensitivity.argtypes = [POINTER(Bsc), BOOL] +BSCGetAllGlobalsArray = _libraries['msbsc70.dll'].BSCGetAllGlobalsArray +BSCGetAllGlobalsArray.restype = BOOL +BSCGetAllGlobalsArray.argtypes = [POINTER(Bsc), MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCSzFrAtr2 = _libraries['msbsc70.dll'].BSCSzFrAtr2 +BSCSzFrAtr2.restype = SZ +BSCSzFrAtr2.argtypes = [POINTER(Bsc), ATR32] +BSCIinstInfo2 = _libraries['msbsc70.dll'].BSCIinstInfo2 +BSCIinstInfo2.restype = BOOL +BSCIinstInfo2.argtypes = [POINTER(Bsc), IINST, POINTER(SZ), POINTER(TYP), POINTER(ATR32)] +BSCGetIinstByvalue2 = _libraries['msbsc70.dll'].BSCGetIinstByvalue2 +BSCGetIinstByvalue2.restype = BOOL +BSCGetIinstByvalue2.argtypes = [POINTER(Bsc), SZ, TYP, ATR32, POINTER(IINST)] +OpenBSCQuery = _libraries['msbsc70.dll'].OpenBSCQuery +OpenBSCQuery.restype = BOOL +OpenBSCQuery.argtypes = [POINTER(Bsc)] +CloseBSCQuery = _libraries['msbsc70.dll'].CloseBSCQuery +CloseBSCQuery.restype = BOOL +CloseBSCQuery.argtypes = [] +BOB = ULONG +InitBSCQuery = _libraries['msbsc70.dll'].InitBSCQuery +InitBSCQuery.restype = BOOL +InitBSCQuery.argtypes = [QY, BOB] +BobNext = _libraries['msbsc70.dll'].BobNext +BobNext.restype = BOB +BobNext.argtypes = [] +BobFrName = _libraries['msbsc70.dll'].BobFrName +BobFrName.restype = BOB +BobFrName.argtypes = [SZ] +LszNameFrBob = _libraries['msbsc70.dll'].LszNameFrBob +LszNameFrBob.restype = SZ +LszNameFrBob.argtypes = [BOB] +CLS = USHORT + +class MBF: + mbfNil = 0x000 + mbfVars = 0x001 + mbfFuncs = 0x002 + mbfMacros = 0x004 + mbfTypes = 0x008 + mbfClass = 0x010 + mbfIncl = 0x020 + mbfMsgMap = 0x040 + mbfDialogID = 0x080 + mbfLibrary = 0x100 + mbfImport = 0x200 + mbfTemplate = 0x400 + mbfNamespace = 0x800 + mbfAll = 0xFFF + +class bsc_reader_t( object ): + def __init__( self, bsc_file ): + self.logger = utils.loggers.pdb_reader + self.logger.setLevel(logging.DEBUG) + + self.__bsc_file = bsc_file + self.__bsc = pointer( Bsc() ) + self.logger.debug( 'openning bsc file "%s"', self.__bsc_file ) + if not BSCOpen( self.__bsc_file, byref( self.__bsc ) ): + self.logger.debug( 'unable to open bsc file "%s"', self.__bsc_file ) + raise RuntimeError( "Unable to open bsc file '%s'" % self.__bsc_file ) + self.logger.debug( 'openning bsc file "%s" - done', self.__bsc_file ) + + self.__instances = [] + + def query_all_instances( self ): + instances_len = ULONG(0) + instances = pointer( IINST() ) + + self.logger.debug( 'call BSCGetAllGlobalsArray function' ) + if not BSCGetAllGlobalsArray( self.__bsc, MBF.mbfAll, byref( instances ), byref( instances_len ) ): + self.logger.debug( 'call BSCGetAllGlobalsArray function - failure' ) + raise RuntimeError( "Unable to load all globals symbols" ) + self.logger.debug( 'call BSCGetAllGlobalsArray function - success' ) + self.logger.debug( 'instances_len: %d', instances_len.value ) + for i in range( instances_len.value ): + print i + self.__instances.append( i ) + + def print_stat( self ): + stat = BSC_STAT() + BSCGetStatistics( self.__bsc, byref( stat ) ) + for f, t in stat._fields_: + print '%s: %s' % ( f, str( getattr( stat, f) ) ) + + def __del__( self ): + BSCClose( self.__bsc ) + + + + +if __name__ == '__main__': + #for i in range( 1000 ): + control_bsc = r'xxx.bsc' + reader = bsc_reader_t( control_bsc ) + reader.print_stat() + reader.query_all_instances() + + Modified: pygccxml_dev/pygccxml/pdb_reader/msvc_details.py =================================================================== --- pygccxml_dev/pygccxml/pdb_reader/msvc_details.py 2008-02-26 20:38:16 UTC (rev 1263) +++ pygccxml_dev/pygccxml/pdb_reader/msvc_details.py 2008-02-27 14:12:56 UTC (rev 1264) @@ -12,6 +12,11 @@ relative_path = os.path.dirname( sys.modules[__name__].__file__) absolute_path = os.path.abspath (relative_path) return os.path.join( absolute_path, 'msbsc70.dll' ) + + def get_msvcr_path( self ): + relative_path = os.path.dirname( sys.modules[__name__].__file__) + absolute_path = os.path.abspath (relative_path) + return os.path.join( absolute_path, 'msvcr70.dll' ) def get_msdia_path( self ): vss_installed = self.__get_installed_vs_dirs() @@ -54,6 +59,9 @@ msbsc_path = bs.get_msbsc_path() print 'msbsc path: ', msbsc_path +msvcr_path = bs.get_msvcr_path() +print 'msvcr path: ', msvcr_path + comtypes_client_gen_dir = comtypes.client.gen_dir try: comtypes.client.gen_dir = None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |