rendered paste bodyimport os, syssys.path.append('..\\..')from PyStand import Structuint8 = Struct.uint8uint16 = Struct.uint16uint32 = Struct.uint32SECTOR = 2048class FSHeader(Struct): __endian__ = Struct.LE def __format__(self): self.magic = Struct.string(0x14) self.rootSector, self.rootSize = uint32[2] self.filetime = uint32[2] self.unused = Struct.string(0x7c8) self.magic2 = Struct.string(0x14)class DirEntry(Struct): __endian__ = Struct.LE def __format__(self): self.leftTree, self.rightTree = uint16[2] self.sector, self.size = uint32[2] self.attrib, self.namelen = uint8[2] self.name = Struct.string(self.namelen)def recurse(fp, sector, pos, dirname): dir = DirEntry() fp.seek(SECTOR * sector + pos) dir.unpack(fp.read(len(dir) + 256)) if dir.attrib & 0x10 == 0x10: subdirname = dirname + '/' + dir.name try: os.mkdir(subdirname) except: pass recurse(fp, dir.sector, 0, subdirname) else: fp.seek(SECTOR * dir.sector) name = dirname + '/' + dir.name print name fp2 = file(name, 'wb') while dir.size != 0: data = fp.read(min(4096, dir.size)) fp2.write(data) dir.size -= len(data) fp2.close() if dir.leftTree != 0: recurse(fp, sector, dir.leftTree * 4, dirname) if dir.rightTree != 0: recurse(fp, sector, dir.rightTree * 4, dirname)def main(name, dirname): fp = file(name, 'rb') fp.seek(SECTOR * 32) header = FSHeader() header.unpack(fp.read(len(header))) assert header.magic == 'MICROSOFT*XBOX*MEDIA' assert header.magic2 == 'MICROSOFT*XBOX*MEDIA' recurse(fp, header.rootSector, 0, dirname)if __name__=='__main__': main(*sys.argv[1:])