def _read_array_single_object(ctx): node, object_id = _read_create_object(ctx, 'ArraySingleObject') length = util.read_fmt(ctx.handle, '<l') record_type = _read_record_type(ctx) elements_node = Node('Elements') for i in range(length): elements_node.add_leaf('Element', _read_record(ctx, record_type)) node.add(elements_node) return node
def _read_serialized_stream_header(ctx): node = Node('SerializedStreamHeader') node.add_leaf('RootId', read_primitive(ctx.handle, PrimitiveType.Int32)) node.add_leaf('HeaderId', read_primitive(ctx.handle, PrimitiveType.Int32)) node.add_leaf('MajorVersion', read_primitive(ctx.handle, PrimitiveType.Int32)) node.add_leaf('MinorVersion', read_primitive(ctx.handle, PrimitiveType.Int32)) return node
def deserialize(handle): ctx = Context(handle) root = Node('Root') while True: try: record_type = _read_record_type(ctx) except EOFError: break child = _read_record(ctx, record_type) root.add(child) return root
def _read_class_members(ctx, object_id): if not object_id in ctx.objects: raise CorruptDataError( 'Bad reference to ObjectID {0}'.format(object_id)) members_meta = ctx.objects[object_id].get('MembersMeta') member_nodes = Node('Members') for i, member_meta in enumerate(members_meta.children): member_node = Node('Member') member_node.add(member_meta.get('Name')) member_node.add( _read_from_binary_type(ctx, member_meta.get_leaf('BinaryType'), member_meta.get_leaf('PrimitiveType', None))) member_nodes.add(member_node) return member_nodes
def _read_binary_library(ctx): library_node = Node('BinaryLibrary') library_node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32)) library_node.add_leaf('LibraryName', read_primitive(ctx.handle, PrimitiveType.String)) record_type = _read_record_type(ctx) if _is_class(record_type): library_node.add(_read_record(ctx, record_type)) return library_node elif _is_array(record_type): library_node.add(_read_record(ctx, record_type)) return library_node else: raise CorruptDataError( 'Binary library followed with neither class or array')
def _read_binary_array(ctx): node, object_id = _read_create_object(ctx, 'BinaryArray') array_type = BinaryArrayType(util.read_fmt(ctx.handle, 'B')) node.add_leaf('BinaryArrayType', array_type) rank = util.read_fmt(ctx.handle, '<l') node.add_leaf('Rank', rank) dimensions_node = Node('Dimensions') element_count = 0 for i in range(rank): dimension = util.read_fmt(ctx.handle, '<l') dimensions_node.add_leaf('Dimension', dimension) if i == 0: element_count = dimension else: element_count *= dimension node.add(dimensions_node) if array_type in ( BinaryArrayType.SingleOffset, BinaryArrayType.JaggedOffset, BinaryArrayType.RectangularOffset): lower_bounds_node = Node('LowerBounds') for i in range(rank): lower_bounds_node.add_leaf( 'LowerBound', util.read_fmt(ctx.handle, '<l')) node.add(lower_bounds_node) binary_type = _read_binary_type(ctx) primitive_type = PrimitiveType.Invalid if binary_type in (BinaryType.Primitive, BinaryType.PrimitiveArray): primitive_type = _read_primitive_type(ctx) elif binary_type == BinaryType.SystemClass: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) elif binary_type == BinaryType.Class: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32)) elements_node = Node('Elements') for i in range(element_count): elements_node.add(_read_from_binary_type(ctx, binary_type, primitive_type)) node.add(elements_node) return node
def _read_class_members(ctx, object_id): if not object_id in ctx.objects: raise CorruptDataError( 'Bad reference to ObjectID {0}'.format(object_id)) members_meta = ctx.objects[object_id].get('MembersMeta') member_nodes = Node('Members') for i, member_meta in enumerate(members_meta.children): member_node = Node('Member') member_node.add(member_meta.get('Name')) member_node.add(_read_from_binary_type( ctx, member_meta.get_leaf('BinaryType'), member_meta.get_leaf('PrimitiveType', None))) member_nodes.add(member_node) return member_nodes
def _read_method_call(ctx): node = Node('BinaryMethodCall') flags = util.read_fmt(ctx.handle, '<L') node.add_leaf('Flags', flags) primitive_type = _read_primitive_type(ctx) node.add_leaf('MethodName', read_primitive(ctx.handle, primitive_type)) primitive_type = _read_primitive_type(ctx) node.add_leaf('TypeName', read_primitive(ctx.handle, primitive_type)) if (flags & MessageFlags.ContextInline.value) != 0: primitive_type = _read_primitive_type(ctx) node.add_leaf('CallContext', read_primitive(ctx.handle, primitive_type)) if (flags & MessageFlags.ArgsInline.value) != 0: args_node = _read_array_of_value_with_code(ctx) args_node.name = 'Args' node.add(args_node) elif (flags & MessageFlags.NoArgs.value) == 0: record_type = _read_record_type(ctx) args_node = _read_record(ctx, record_type) args_node.name = 'Args' node.add(args_node) return node
def _read_create_object(ctx, name): object_id = read_primitive(ctx.handle, PrimitiveType.Int32) node = Node(name) ctx.objects[object_id] = node node.add_leaf('ObjectId', object_id) return node, object_id
def _read_binary_array(ctx): node, object_id = _read_create_object(ctx, 'BinaryArray') array_type = BinaryArrayType(util.read_fmt(ctx.handle, 'B')) node.add_leaf('BinaryArrayType', array_type) rank = util.read_fmt(ctx.handle, '<l') node.add_leaf('Rank', rank) dimensions_node = Node('Dimensions') element_count = 0 for i in range(rank): dimension = util.read_fmt(ctx.handle, '<l') dimensions_node.add_leaf('Dimension', dimension) if i == 0: element_count = dimension else: element_count *= dimension node.add(dimensions_node) if array_type in (BinaryArrayType.SingleOffset, BinaryArrayType.JaggedOffset, BinaryArrayType.RectangularOffset): lower_bounds_node = Node('LowerBounds') for i in range(rank): lower_bounds_node.add_leaf('LowerBound', util.read_fmt(ctx.handle, '<l')) node.add(lower_bounds_node) binary_type = _read_binary_type(ctx) primitive_type = PrimitiveType.Invalid if binary_type in (BinaryType.Primitive, BinaryType.PrimitiveArray): primitive_type = _read_primitive_type(ctx) elif binary_type == BinaryType.SystemClass: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) elif binary_type == BinaryType.Class: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32)) elements_node = Node('Elements') for i in range(element_count): elements_node.add( _read_from_binary_type(ctx, binary_type, primitive_type)) node.add(elements_node) return node
def _read_class_members_meta(ctx, object_id): count = read_primitive(ctx.handle, PrimitiveType.Int32) names = [None] * count binary_types = [None] * count for i in range(count): names[i] = read_primitive(ctx.handle, PrimitiveType.String) for i in range(count): binary_types[i] = _read_binary_type(ctx) node = Node('MembersMeta') for i in range(count): member_node = Node('MemberMeta') member_node.add_leaf('Name', names[i]) member_node.add_leaf('BinaryType', binary_types[i]) if binary_types[i] in (BinaryType.Primitive, BinaryType.PrimitiveArray): member_node.add_leaf('PrimitiveType', _read_primitive_type(ctx)) elif binary_types[i] == BinaryType.SystemClass: member_node.add_leaf( 'ClassName', read_primitive(ctx.handle, PrimitiveType.String)) elif binary_types[i] == BinaryType.Class: member_node.add_leaf( 'ClassName', read_primitive(ctx.handle, PrimitiveType.String)) member_node.add_leaf( 'LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32)) node.add(member_node) return node