mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2025-03-01 15:30:02 +00:00
Fixed check for boot disk image: doesn't work to assume initialization address at 4-5 is valid or JMP address at 6-8 are valid
This commit is contained in:
parent
fdfb1b85c5
commit
320c5af153
@ -130,6 +130,7 @@ class DiskImageBase(object):
|
|||||||
def setup(self):
|
def setup(self):
|
||||||
self.size = np.alen(self.bytes)
|
self.size = np.alen(self.bytes)
|
||||||
self.read_atr_header()
|
self.read_atr_header()
|
||||||
|
self.header.check_size(self.size)
|
||||||
self.check_size()
|
self.check_size()
|
||||||
self.get_boot_sector_info()
|
self.get_boot_sector_info()
|
||||||
self.get_vtoc()
|
self.get_vtoc()
|
||||||
@ -148,7 +149,7 @@ class DiskImageBase(object):
|
|||||||
self.header = XfdHeader()
|
self.header = XfdHeader()
|
||||||
|
|
||||||
def check_size(self):
|
def check_size(self):
|
||||||
self.header.check_size(self.size)
|
pass
|
||||||
|
|
||||||
def get_boot_sector_info(self):
|
def get_boot_sector_info(self):
|
||||||
pass
|
pass
|
||||||
@ -239,8 +240,6 @@ class BootDiskImage(DiskImageBase):
|
|||||||
return "%s Boot Disk" % (self.header)
|
return "%s Boot Disk" % (self.header)
|
||||||
|
|
||||||
def check_size(self):
|
def check_size(self):
|
||||||
self.header.check_size(self.size)
|
|
||||||
|
|
||||||
start, size = self.header.get_pos(1)
|
start, size = self.header.get_pos(1)
|
||||||
b = self.bytes
|
b = self.bytes
|
||||||
i = self.header.atr_header_offset
|
i = self.header.atr_header_offset
|
||||||
@ -249,8 +248,12 @@ class BootDiskImage(DiskImageBase):
|
|||||||
raise InvalidDiskImage("Appears to be an executable")
|
raise InvalidDiskImage("Appears to be an executable")
|
||||||
nsec = b[i + 1]
|
nsec = b[i + 1]
|
||||||
bload = b[i + 2:i + 4].view(dtype='<u2')[0]
|
bload = b[i + 2:i + 4].view(dtype='<u2')[0]
|
||||||
binit = b[i + 4:i + 6].view(dtype='<u2')[0]
|
|
||||||
blen, _ = self.header.get_pos(nsec + 1)
|
# Sanity check: number of sectors to be loaded can't be more than the
|
||||||
print nsec, bload, binit, blen
|
# lower 48k of ram because there's no way to bank switch or anything
|
||||||
if not (bload < binit < bload + blen):
|
# before the boot sectors are finished loading
|
||||||
raise InvalidDiskImage("Incorrect boot load/init parameters")
|
max_ram = 0xc000
|
||||||
|
max_size = max_ram - bload
|
||||||
|
max_sectors = max_size / self.header.sector_size
|
||||||
|
if nsec > max_sectors:
|
||||||
|
raise InvalidDiskImage("Number of boot sectors out of range")
|
||||||
|
@ -39,9 +39,6 @@ class KBootImage(DiskImageBase):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s KBoot Format: %d byte executable" % (self.header, self.files[0].exe_size)
|
return "%s KBoot Format: %d byte executable" % (self.header, self.files[0].exe_size)
|
||||||
|
|
||||||
def check_size(self):
|
|
||||||
self.header.check_size(self.size)
|
|
||||||
|
|
||||||
def check_sane(self):
|
def check_sane(self):
|
||||||
if not self.all_sane:
|
if not self.all_sane:
|
||||||
raise InvalidDiskImage("Doesn't seem to be KBoot header")
|
raise InvalidDiskImage("Doesn't seem to be KBoot header")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user