@@ -747,6 +747,12 @@ def get_view_of_file_with_options(cls, filename, update_analysis=True, progress_
747747 bv .update_analysis_and_wait ()
748748 return bv
749749
750+ def parse (self , data ):
751+ view = core .BNParseBinaryViewOfType (self .handle , data .handle )
752+ if view is None :
753+ return None
754+ return BinaryView (file_metadata = data .file , handle = view )
755+
750756 def is_valid_for_data (self , data ):
751757 return core .BNIsBinaryViewTypeValidForData (self .handle , data .handle )
752758
@@ -1211,6 +1217,7 @@ def register(cls):
12111217 cls ._registered_cb = core .BNCustomBinaryViewType ()
12121218 cls ._registered_cb .context = 0
12131219 cls ._registered_cb .create = cls ._registered_cb .create .__class__ (cls ._create )
1220+ cls ._registered_cb .parse = cls ._registered_cb .parse .__class__ (cls ._parse )
12141221 cls ._registered_cb .isValidForData = cls ._registered_cb .isValidForData .__class__ (cls ._is_valid_for_data )
12151222 cls ._registered_cb .getLoadSettingsForData = cls ._registered_cb .getLoadSettingsForData .__class__ (cls ._get_load_settings_for_data )
12161223 cls .registered_view_type = BinaryViewType (core .BNRegisterBinaryViewType (cls .name , cls .long_name , cls ._registered_cb ))
@@ -1223,6 +1230,22 @@ def _create(cls, ctxt, data):
12231230 view = cls (BinaryView (file_metadata = file_metadata , handle = core .BNNewViewReference (data )))
12241231 if view is None :
12251232 return None
1233+ # FIXME: There is probably a better way to convey this information...
1234+ view .__dict__ .update ({'parse_only' : False })
1235+ return ctypes .cast (core .BNNewViewReference (view .handle ), ctypes .c_void_p ).value
1236+ except :
1237+ log .log_error (traceback .format_exc ())
1238+ return None
1239+
1240+ @classmethod
1241+ def _parse (cls , ctxt , data ):
1242+ try :
1243+ file_metadata = binaryninja .filemetadata .FileMetadata (handle = core .BNGetFileForView (data ))
1244+ view = cls (BinaryView (file_metadata = file_metadata , handle = core .BNNewViewReference (data )))
1245+ if view is None :
1246+ return None
1247+ # FIXME: There is probably a better way to convey this information...
1248+ view .__dict__ .update ({'parse_only' : True })
12261249 return ctypes .cast (core .BNNewViewReference (view .handle ), ctypes .c_void_p ).value
12271250 except :
12281251 log .log_error (traceback .format_exc ())
0 commit comments