Revision 3553234c34a0ae55dc855d44ec2635c805c2b3de authored by alex@thinkpad on 05 September 2016, 19:48:15 UTC, committed by alex@thinkpad on 05 September 2016, 19:48:15 UTC
1 parent 1b76e90
IOManager.py
import os
class IOManager:
def get_mount_point(self, drive_num):
raise NotImplementedError("IOManager is an interface")
def enum_removable_drives(self):
raise NotImplementedError("IOManager is an interface")
def get_raw_device(self, drive_num):
raise NotImplementedError("IOManager is an interface")
def get_label(self, drive_num):
raise NotImplementedError("IOManager is an interface")
def get_fs_type(self, drive_num):
raise NotImplementedError("IOManager is an interface")
def get_offset(self, fs, is_bootflag):
offsets = {'FAT16': [43, 64],
'FAT32': [71, 92],
'EXFAT': [130, 122]
}
if(is_bootflag):
return offsets[fs][1]
else:
return offsets[fs][0]
def write_to_disk(self, drive_num, what, sector=0, offset=0):
raw_device = self.get_raw_device(drive_num)
fd = open(raw_device, 'rb+')
fd.seek(sector * 512, os.SEEK_SET)
olddata = fd.read(512)
newdata = olddata[0:offset] + what + olddata[(offset + len(what)):]
fd.seek(sector * 512, os.SEEK_SET)
fd.write(newdata)
fd.close()
def write_bootflag(self, drive_num, sector):
fs = self.get_fs_type(drive_num)
offset = self.get_offset(fs, bootflag=True)
self.write_to_disk(drive_num, "BOOTDISK", sector, offset)
def write_eosdevelop(self, drive_num, sector):
fs = self.get_fs_type(drive_num)
offset = self.get_offset(fs, bootflag=False)
self.write_to_disk(drive_num, "EOS_DEVELOP", sector, offset)
def write_vbr_checksum(self, drive_num):
pass
def write_flags(self, drive_num):
fs = self.get_fs_type(drive_num)
self.write_bootflag(drive_num, 0)
self.write_eosdevelop(drive_num, 0)
if(fs == "EXFAT"):
self.write_bootflag(drive_num, 12)
self.write_eosdevelop(drive_num, 12)
self.write_vbr_checksum(drive_num)
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...