def __init__(self, pytsk_image, offset=0): self.img = pytsk_image self.offset = offset try: data = self.read(0, 0x1000) self.header = HFSPlusVolumeHeader.parse(data[0x400:0x800]) assert self.header.signature == 0x4858 or self.header.signature == 0x482B except: raise Exception("Not an HFS+ image") #self.is_hfsx = self.header.signature == 0x4858 self.blockSize = self.header.blockSize self.allocationFile = HFSFile(self, self.header.allocationFile, kHFSAllocationFileID) self.allocationBitmap = self.allocationFile.readAllBuffer() self.extentsFile = HFSFile(self, self.header.extentsFile, kHFSExtentsFileID) self.extentsTree = ExtentsOverflowTree(self.extentsFile) self.catalogFile = HFSFile(self, self.header.catalogFile, kHFSCatalogFileID) self.xattrFile = HFSFile(self, self.header.attributesFile, kHFSAttributesFileID) self.catalogTree = CatalogTree(self.catalogFile) self.xattrTree = AttributesTree(self.xattrFile) self.hasJournal = self.header.attributes & ( 1 << kHFSVolumeJournaledBit)
def __init__(self, bdev): self.bdev = bdev self.bdev.seek(0x400) self.header = HFSPlusVolumeHeader.parse_stream(self.bdev) assert self.header.signature == 0x4858 or self.header.signature == 0x482B self.blockSize = self.header.blockSize #if os.path.getsize(filename) < self.header.totalBlocks * self.blockSize: # print "WARNING: HFS image appears to be truncated" self.allocationFile = HFSFile(self, self.header.allocationFile, kHFSAllocationFileID) self.allocationBitmap = self.allocationFile.readAllBuffer() self.extentsFile = HFSFile(self, self.header.extentsFile, kHFSExtentsFileID) self.extentsTree = ExtentsOverflowTree(self.extentsFile) self.catalogFile = HFSFile(self, self.header.catalogFile, kHFSCatalogFileID) self.xattrFile = HFSFile(self, self.header.attributesFile, kHFSAttributesFileID) self.catalogTree = CatalogTree(self.catalogFile, self) self.xattrTree = AttributesTree(self.xattrFile) self.hasJournal = self.header.attributes & (1 << kHFSVolumeJournaledBit) k,v = self.catalogTree.search((kHFSRootFolderID, "")) self.volumename = getString(v.data)
def __init__(self, bdev): self.bdev = bdev try: data = self.bdev.readBlock(0) self.header = HFSPlusVolumeHeader.parse(data[0x400:0x800]) assert self.header.signature == 0x4858 or self.header.signature == 0x482B except: raise #raise Exception("Not an HFS+ image") self.blockSize = self.header.blockSize self.bdev.setBlockSize(self.blockSize) #if os.path.getsize(filename) < self.header.totalBlocks * self.blockSize: # print "WARNING: HFS image appears to be truncated" self.allocationFile = HFSFile(self, self.header.allocationFile, kHFSAllocationFileID) self.allocationBitmap = self.allocationFile.readAllBuffer() self.extentsFile = HFSFile(self, self.header.extentsFile, kHFSExtentsFileID) self.extentsTree = ExtentsOverflowTree(self.extentsFile) self.catalogFile = HFSFile(self, self.header.catalogFile, kHFSCatalogFileID) self.xattrFile = HFSFile(self, self.header.attributesFile, kHFSAttributesFileID) self.catalogTree = CatalogTree(self.catalogFile, self) self.xattrTree = AttributesTree(self.xattrFile) self.hasJournal = self.header.attributes & ( 1 << kHFSVolumeJournaledBit)
def __init__(self, filename, write=False, offset=0): flag = os.O_RDONLY if not write else os.O_RDWR if sys.platform == 'win32': flag = flag | os.O_BINARY self.fd = os.open(filename, flag) self.offset = offset self.writeFlag = write try: data = self.read(0, 0x1000) self.header = HFSPlusVolumeHeader.parse(data[0x400:0x800]) assert self.header.signature == 0x4858 or self.header.signature == 0x482B except: raise Exception("Not an HFS+ image") self.blockSize = self.header.blockSize if os.path.getsize( filename) < self.header.totalBlocks * self.blockSize: print "WARNING: image appears to be truncated" self.allocationFile = HFSFile(self, self.header.allocationFile, kHFSAllocationFileID) self.allocationBitmap = self.allocationFile.readAllBuffer() self.extentsFile = HFSFile(self, self.header.extentsFile, kHFSExtentsFileID) self.extentsTree = ExtentsOverflowTree(self.extentsFile) self.catalogFile = HFSFile(self, self.header.catalogFile, kHFSCatalogFileID) self.xattrFile = HFSFile(self, self.header.attributesFile, kHFSAttributesFileID) self.catalogTree = CatalogTree(self.catalogFile) self.xattrTree = AttributesTree(self.xattrFile) self.hasJournal = self.header.attributes & ( 1 << kHFSVolumeJournaledBit)