All pastes #792440 Raw Edit

Someone

public python v1 · immutable
·published 2007-11-21 12:22 UTC
rendered paste body
import 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:])