2018-05-16 01:12:16 +05:30
|
|
|
#!/usr/bin/python3
|
2018-05-16 03:34:53 +05:30
|
|
|
import ctypes
|
2018-05-16 06:05:24 +05:30
|
|
|
from .__init__ import libc
|
2018-05-16 01:12:16 +05:30
|
|
|
|
|
|
|
#--------------------------------------+
|
|
|
|
# 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")
|
2018-05-16 03:34:53 +05:30
|
|
|
del libc
|
2018-05-16 01:12:16 +05:30
|
|
|
|
|
|
|
#--------------------------------------+
|
|
|
|
# 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)
|
|
|
|
|