#!/usr/bin/python3 import ctypes from .__init__ import libc #--------------------------------------+ # Basic Struct #--------------------------------------+ class _PldHeader_(ctypes.Structure): _pack_ = 1 _fields_ = [ ("numOffset", ctypes.c_int), ("offsets", ctypes.POINTER(ctypes.c_int)) ] class Devil1PLD_FN(ctypes.Structure): _fields_ = [ ("getheader" , ctypes.CFUNCTYPE( ctypes.c_bool, ctypes.POINTER(_PldHeader_), ctypes.c_char_p)), ("sizeofsector", ctypes.CFUNCTYPE( ctypes.c_int, ctypes.POINTER(_PldHeader_), ctypes.c_int)), ("printheader" , ctypes.CFUNCTYPE(None, ctypes.POINTER(_PldHeader_))) ] devil1pld = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD") del libc #--------------------------------------+ # Pythonic Object #--------------------------------------+ class PldHeader: def __init__(self, filedata = None): # Store C Struct in order to call C functions self.cstruct = _PldHeader_() if filedata: devil1pld.getheader(ctypes.byref(self.cstruct), filedata) self.eof = len(filedata) def show(self): devil1pld.printheader(ctypes.byref(self.cstruct)) return def getnumoffsets(self): return self.cstruct.numOffsets # return pythonic list of offsets def getoffsets(self): return self.cstruct.offsets[:self.cstruct.numOffset] def sizeofsector(self, i): ptr = ctypes.byref(self.cstruct) return devil1pld.sizeofsector(ptr, i, self.eof)