Merge pull request #341 from learn-more/next

reg_name, insn_name, group_name in Cs
This commit is contained in:
Nguyen Anh Quynh 2015-04-29 07:01:42 +08:00
commit 7e88b7ac8b
2 changed files with 47 additions and 24 deletions

View File

@ -435,6 +435,8 @@ def copy_ctypes(src):
ctypes.pointer(dst)[0] = src
return dst
def _ascii_name_or_default(name, default):
return default if name is None else name.decode('ascii')
# Python-style class to disasm code
class CsInsn(object):
@ -573,43 +575,31 @@ class CsInsn(object):
return _cs.cs_errno(self._cs.csh)
# get the register name, given the register ID
def reg_name(self, reg_id):
if self._raw.id == 0:
raise CsError(CS_ERR_SKIPDATA)
def reg_name(self, reg_id, default=None):
if self._cs._diet:
# Diet engine cannot provide register name
raise CsError(CS_ERR_DIET)
if reg_id == 0:
return "(invalid)"
return _cs.cs_reg_name(self._cs.csh, reg_id).decode('ascii')
return _ascii_name_or_default(_cs.cs_reg_name(self._cs.csh, reg_id), default)
# get the instruction name
def insn_name(self):
def insn_name(self, default=None):
if self._cs._diet:
# Diet engine cannot provide instruction name
raise CsError(CS_ERR_DIET)
if self._raw.id == 0:
return "(invalid)"
return default
return _cs.cs_insn_name(self._cs.csh, self.id).decode('ascii')
return _ascii_name_or_default(_cs.cs_insn_name(self._cs.csh, self.id).decode('ascii'), default)
# get the group name
def group_name(self, group_id):
if self._raw.id == 0:
raise CsError(CS_ERR_SKIPDATA)
def group_name(self, group_id, default=None):
if self._cs._diet:
# Diet engine cannot provide group name
raise CsError(CS_ERR_DIET)
if group_id == 0:
return "(invalid)"
return _cs.cs_group_name(self._cs.csh, group_id).decode('ascii')
return _ascii_name_or_default(_cs.cs_group_name(self._cs.csh, group_id), default)
# verify if this insn belong to group with id as @group_id
@ -862,6 +852,33 @@ class Cs(object):
# save mode
self._mode = opt
# get the last error code
def errno(self):
return _cs.cs_errno(self.csh)
# get the register name, given the register ID
def reg_name(self, reg_id, default=None):
if self._diet:
# Diet engine cannot provide register name
raise CsError(CS_ERR_DIET)
return _ascii_name_or_default(_cs.cs_reg_name(self.csh, reg_id), default)
# get the instruction name, given the instruction ID
def insn_name(self, insn_id, default=None):
if self._diet:
# Diet engine cannot provide instruction name
raise CsError(CS_ERR_DIET)
return _ascii_name_or_default(_cs.cs_insn_name(self.csh, insn_id), default)
# get the group name
def group_name(self, group_id, default=None):
if self._diet:
# Diet engine cannot provide group name
raise CsError(CS_ERR_DIET)
return _ascii_name_or_default(_cs.cs_group_name(self.csh, group_id), default)
# Disassemble binary & return disassembled instructions in CsInsn objects
def disasm(self, code, offset, count=0):

View File

@ -11,10 +11,6 @@ from capstone.x86 import *
from capstone.xcore import *
import sys
# yes this is bad, importing ctypes like this,
# but the Cs object did not have the group_name function
from capstone import _cs
class GroupTest:
def __init__(self, name, arch, mode, data):
self.name = name
@ -27,13 +23,14 @@ class GroupTest:
cap = Cs(self.arch, self.mode)
for group_id in xrange(0,255):
name = self.data.get(group_id)
res = _cs.cs_group_name(cap.csh, group_id)
res = cap.group_name(group_id)
if res != name:
print("ERROR: id = %u expected '%s', but got '%s'" %(group_id, name, res))
print("")
arm_dict = {
ARM_GRP_JUMP: "jump",
ARM_GRP_PRIVILEGE: "privilege",
ARM_GRP_CRYPTO: "crypto",
ARM_GRP_DATABARRIER: "databarrier",
@ -66,10 +63,14 @@ arm_dict = {
ARM_GRP_CRC: "crc",
ARM_GRP_DPVFP: "dpvfp",
ARM_GRP_V6M: "v6m",
ARM_GRP_VIRTUALIZATION: "virtualization",
}
arm64_dict = {
ARM64_GRP_JUMP: "jump",
ARM64_GRP_CALL: "call",
ARM64_GRP_RET: "return",
ARM64_GRP_PRIVILEGE: "privilege",
ARM64_GRP_CRYPTO: "crypto",
ARM64_GRP_FPARMV8: "fparmv8",
@ -132,6 +133,10 @@ ppc_dict = {
PPC_GRP_E500: "e500",
PPC_GRP_PPC4XX: "ppc4xx",
PPC_GRP_PPC6XX: "ppc6xx",
PPC_GRP_ICBT: "icbt",
PPC_GRP_P8ALTIVEC: "p8altivec",
PPC_GRP_P8VECTOR: "p8vector",
PPC_GRP_QPX: "qpx",
}
sparc_dict = {
@ -162,6 +167,7 @@ x86_dict = {
X86_GRP_RET: "ret",
X86_GRP_INT: "int",
X86_GRP_IRET: "iret",
X86_GRP_PRIVILEGE: "privilege",
X86_GRP_VM: "vm",
X86_GRP_3DNOW: "3dnow",