python: rename skipdata_opt to skipdata_setup & handle callback properly

v2
Nguyen Anh Quynh 11 years ago
parent 9df79afc77
commit 301d740aa3
  1. 2
      bindings/python/capstone/__init__.py
  2. 14
      bindings/python/capstone/capstone.py
  3. 11
      bindings/python/test_skipdata.py

@ -1 +1 @@
from capstone import Cs, CsError, cs_disasm_quick, cs_disasm_lite, cs_version, cs_support, version_bind, debug, CS_API_MAJOR, CS_API_MINOR, CS_ARCH_ARM, CS_ARCH_ARM64, CS_ARCH_MIPS, CS_ARCH_X86, CS_ARCH_PPC, CS_ARCH_SPARC, CS_ARCH_SYSZ, CS_ARCH_ALL, CS_MODE_LITTLE_ENDIAN, CS_MODE_ARM, CS_MODE_THUMB, CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT, CS_OPT_SYNTAX_INTEL, CS_OPT_SYNTAX_ATT, CS_OPT_SYNTAX_NOREGNAME, CS_OPT_DETAIL, CS_OPT_ON, CS_OPT_OFF, CS_MODE_16, CS_MODE_32, CS_MODE_64, CS_MODE_BIG_ENDIAN, CS_MODE_MICRO, CS_MODE_N64, CS_MODE_V9, CS_SUPPORT_DIET, CS_SUPPORT_X86_REDUCE
from capstone import Cs, CsError, cs_disasm_quick, cs_disasm_lite, cs_version, cs_support, version_bind, debug, CS_API_MAJOR, CS_API_MINOR, CS_ARCH_ARM, CS_ARCH_ARM64, CS_ARCH_MIPS, CS_ARCH_X86, CS_ARCH_PPC, CS_ARCH_SPARC, CS_ARCH_SYSZ, CS_ARCH_ALL, CS_MODE_LITTLE_ENDIAN, CS_MODE_ARM, CS_MODE_THUMB, CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT, CS_OPT_SYNTAX_INTEL, CS_OPT_SYNTAX_ATT, CS_OPT_SYNTAX_NOREGNAME, CS_OPT_DETAIL, CS_OPT_ON, CS_OPT_OFF, CS_MODE_16, CS_MODE_32, CS_MODE_64, CS_MODE_BIG_ENDIAN, CS_MODE_MICRO, CS_MODE_N64, CS_MODE_V9, CS_SUPPORT_DIET, CS_SUPPORT_X86_REDUCE, CS_SKIPDATA_CALLBACK

@ -60,6 +60,8 @@ __all__ = [
'CS_SUPPORT_DIET',
'CS_SUPPORT_X86_REDUCE',
'CS_SKIPDATA_CALLBACK'
]
# Capstone C interface
@ -210,12 +212,12 @@ class _cs_insn(ctypes.Structure):
)
# callback for SKIPDATA option
SKIPDATA_CB = ctypes.CFUNCTYPE(ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p)
CS_SKIPDATA_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p)
class _cs_opt_skipdata(ctypes.Structure):
_fields_ = (
('mnemonic', ctypes.c_char_p),
('callback', SKIPDATA_CB),
('callback', CS_SKIPDATA_CALLBACK),
('user_data', ctypes.c_void_p),
)
@ -661,18 +663,16 @@ class Cs(object):
# setter: modify "data" instruction's mnemonic for SKIPDATA
@syntax.setter
def skipdata_opt(self, opt):
def skipdata_setup(self, opt):
_skipdata_opt = _cs_opt_skipdata()
_mnem, _cb, _ud = opt
_skipdata_opt.mnemonic = _mnem
_skipdata_opt.callback = ctypes.cast(_cb, SKIPDATA_CB)
#_skipdata_opt.callback = _cb
_skipdata_opt.user_data = _ud
_skipdata_opt.callback = ctypes.cast(_cb, CS_SKIPDATA_CALLBACK)
_skipdata_opt.user_data = ctypes.cast(_ud, ctypes.c_void_p)
status = _cs.cs_option(self.csh, CS_OPT_SKIPDATA_SETUP, ctypes.cast(ctypes.byref(_skipdata_opt), ctypes.c_void_p))
if status != CS_ERR_OK:
raise CsError(status)
# save the "data" instruction mnem
self._skipdata_opt = _skipdata_opt

@ -30,6 +30,12 @@ def test_cs_disasm_quick():
print
# Sample callback for SKIPDATA option
def testcb(offset, userdata):
# always skip 2 bytes of data
return 2
### Test class Cs
def test_class():
for (arch, mode, code, comment, syntax) in all_tests:
@ -47,7 +53,10 @@ def test_class():
md.skipdata = True
# To rename "data" instruction's mnemonic to "db", uncomment the line below
# This example ignores SKIPDATA's callback (first None) & user_data (second None)
# md.skipdata_opt = ("db", None, None)
# md.skipdata_setup = ("db", None, None)
# To customize the callback, uncomment the line below.
# md.skipdata_setup = (".db", CS_SKIPDATA_CALLBACK(testcb), None)
for insn in md.disasm(code, 0x1000):
#bytes = binascii.hexlify(insn.bytes)

Loading…
Cancel
Save