def get_boot_segments(self): data, style = self.get_sectors(360) values = data[0:20].view(dtype=self.boot_record_type)[0] flag = int(values[0]) segments = [] if flag == 0: num = int(values[1]) addr = int(values[2]) s = self.get_sector_slice(1, num) r = self.rawdata[s] header = ObjSegment(r[0:20], 0, 0, addr, addr + 20, name="Boot Header") sectors = ObjSegment(r, 0, 0, addr, addr + len(r), name="Boot Sectors") code = ObjSegment(r[20:], 0, 0, addr + 20, addr + len(r), name="Boot Code") segments = [sectors, header, code] return segments
def parse_segments(self): r = self.rawdata self.segments = [] for offset, size, name, crc in self.zip_segment_info: end = offset + size self.segments.append( ObjSegment(r[offset:end], 0, offset, offset, end, name=name))
def parse_segments(self): r = self.rawdata i = self.header.header_offset if i > 0: self.segments.append( ObjSegment(r[0:i], 0, 0, 0, i, name="Cart Header")) self.segments.extend(self.get_main_segment()) self.segments.extend(self.get_banked_segments())
def get_main_segment(self): r = self.rawdata start = self.header.header_offset + self.header.main_offset * 1024 end = start + (self.header.main_size * 1024) s = ObjSegment(r[start:end], 0, 0, self.header.main_origin, name="Main Bank") return [s]
def parse_segments(self): r = self.rawdata b = r.get_data() pos = 0 first = True log.debug("Initial parsing: size=%d" % self.size) while pos < self.size: if pos + 1 < self.size: header, = b[pos:pos + 2].view(dtype='<u2') else: self.segments.append( ObjSegment(r[pos:pos + 1], pos, pos + 1, 0, 1, "Incomplete Data")) break if header == 0xffff: # Apparently 0xffff header can appear in any segment, not just # the first. Regardless, it is ignored everywhere. pos += 2 first = False continue elif first: raise InvalidBinaryFile log.debug("header parsing: header=0x%x" % header) if len(b[pos:pos + 4]) < 4: self.segments.append( ObjSegment(r[pos:pos + 4], 0, 0, 0, len(b[pos:pos + 4]), "Short Segment Header")) break start, end = b[pos:pos + 4].view(dtype='<u2') if end < start: raise InvalidBinaryFile count = end - start + 1 found = len(b[pos + 4:pos + 4 + count]) if found < count: self.segments.append( ObjSegment(r[pos + 4:pos + 4 + count], pos, pos + 4, start, end, "Incomplete Data")) break self.segments.append( ObjSegment(r[pos + 4:pos + 4 + count], pos, pos + 4, start, end)) pos += 4 + count
def get_banked_segments(self): segments = [] r = self.rawdata for i, offset in enumerate(self.header.banks): start = self.header.header_offset + offset * 1024 end = start + (self.header.bank_size * 1024) s = ObjSegment(r[start:end], 0, 0, self.header.bank_origin, name="Bank #%d" % (i + 1)) segments.append(s) return segments
def get_boot_segments(self): segments = [] num = min(self.num_boot, 1) s = self.get_sector_slice(1, num) r = self.rawdata[s] addr = self.boot_addr header = ObjSegment(r[0:43], 0, 0, addr, addr + 43, name="Boot Header") segments.append(header) if self.num_boot > 0: sectors = ObjSegment(r, 0, 0, addr, addr + len(r), name="Boot Sectors") code = ObjSegment(r[43:], 0, 0, addr + 43, addr + len(r), name="Boot Code") segments.extend([header, code]) return segments
def parse_segments(self): r = self.rawdata i = self.header.header_offset if self.header.image_size > 0: self.segments.append( ObjSegment(r[0:i], 0, 0, 0, i, name="%s Header" % self.header.file_format)) self.segments.append( RawSectorsSegment(r[i:], self.header.starting_sector_label, self.header.max_sectors, self.header.image_size, self.header.initial_sector_size, self.header.num_initial_sectors, self.header.sector_size, name="Raw disk sectors")) self.segments.extend(self.get_boot_segments()) self.segments.extend(self.get_vtoc_segments()) self.segments.extend(self.get_directory_segments()) self.segments.extend(self.get_file_segments())