예제 #1
0
 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
예제 #2
0
 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))
예제 #3
0
 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())
예제 #4
0
 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]
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
 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
예제 #8
0
 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())