This commit is contained in:
Nguyen Anh Quynh 2014-01-08 09:48:50 +08:00
commit f5d8496c52
1 changed files with 23 additions and 366 deletions

View File

@ -304,375 +304,32 @@ class CsInsn(object):
return detail.groups[:detail.groups_count]
return None
@property
def cc(self):
if not self._cs._detail:
return None
def __gen_detail(self):
arch = self._cs.arch
all_info = self._raw.detail.contents
if arch == CS_ARCH_ARM:
(self.cc, self.update_flags, self.writeback, self.operands) = \
arm.get_arch_info(all_info.arch.arm)
elif arch == CS_ARCH_ARM64:
(self.cc, self.update_flags, self.writeback, self.operands) = \
arm64.get_arch_info(all_info.arch.arm64)
elif arch == CS_ARCH_X86:
(self.prefix, self.segment, self.opcode, self.op_size, self.addr_size, \
self.disp_size, self.imm_size, self.modrm, self.sib, self.disp, \
self.sib_index, self.sib_scale, self.sib_base, self.operands) = x86.get_arch_info(all_info.arch.x86)
elif arch == CS_ARCH_MIPS:
self.operands = mips.get_arch_info(all_info.arch.mips)
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_ARM:
try:
return self._cc
except:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm.get_arch_info(detail.arch.arm)
return self._cc
elif self._cs.arch == CS_ARCH_ARM64:
try:
return self._cc
except:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm64.get_arch_info(detail.arch.arm64)
return self._cc
else:
def __getattr__(self, name):
attr = object.__getattribute__
if not attr(self, '_cs')._detail:
return None
@property
def update_flags(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_ARM:
try:
return self._update_flags
except:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm.get_arch_info(detail.arch.arm)
return self._update_flags
elif self._cs.arch == CS_ARCH_ARM64:
try:
return self._update_flags
except:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm64.get_arch_info(detail.arch.arm64)
return self._update_flags
else:
return None
@property
def writeback(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_ARM:
try:
return self._writeback
except:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm.get_arch_info(detail.arch.arm)
return self._writeback
elif self._cs.arch == CS_ARCH_ARM64:
try:
return self._writeback
except:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm64.get_arch_info(detail.arch.arm64)
return self._writeback
else:
return None
@property
def operands(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
try:
return self._operands
except:
if self._cs.arch == CS_ARCH_ARM:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm.get_arch_info(detail.arch.arm)
return self._operands
elif self._cs.arch == CS_ARCH_ARM64:
(self._cc, self._update_flags, self._writeback, self._operands) = \
arm64.get_arch_info(detail.arch.arm64)
return self._operands
elif self._cs.arch == CS_ARCH_X86:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._operands
elif self._cs.arch == CS_ARCH_MIPS:
self._operands = mips.get_arch_info(detail.arch.mips)
return self._operands
if self._cs.arch == CS_ARCH_PPC:
(self._bc, self._bh, self._update_cr0, self._operands) = \
ppc.get_arch_info(detail.arch.ppc)
return self._operands
else:
return None
@property
def bc(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_PPC:
try:
return self._bc
except:
(self._bc, self._bh, self._update_cr0, self._operands) = \
ppc.get_arch_info(detail.arch.ppc)
return self._bc
else:
return None
@property
def bh(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_PPC:
try:
return self._bh
except:
(self._bc, self._bh, self._update_cr0, self._operands) = \
ppc.get_arch_info(detail.arch.ppc)
return self._bh
else:
return None
@property
def update_cr0(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_PPC:
try:
return self._update_cr0
except:
(self._bc, self._bh, self._update_cr0, self._operands) = \
ppc.get_arch_info(detail.arch.ppc)
return self._update_cr0
else:
return None
@property
def prefix(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._prefix
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self.prefix
else:
return None
@property
def segment(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._segment
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._segment
else:
return None
@property
def opcode(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._opcode
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self.opcode
else:
return None
@property
def op_size(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._op_size
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._op_size
else:
return None
@property
def addr_size(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._addr_size
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._addr_size
else:
return None
@property
def disp_size(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._disp_size
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._disp_size
else:
return None
@property
def imm_size(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._imm_size
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._imm_size
else:
return None
@property
def modrm(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._modrm
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._modrm
else:
return None
@property
def sib(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._sib
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._sib
else:
return None
@property
def disp(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._disp
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._disp
else:
return None
@property
def sib_index(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._sib_index
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._sib_index
else:
return None
@property
def sib_scale(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._sib_scale
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._sib_scale
else:
return None
@property
def sib_base(self):
if not self._cs._detail:
return None
detail = self._raw.detail.contents
if self._cs.arch == CS_ARCH_X86:
try:
return self._sib_base
except:
(self._prefix, self._segment, self._opcode, self._op_size, self._addr_size, \
self._disp_size, self._imm_size, self._modrm, self._sib, self._disp, \
self._sib_index, self._sib_scale, self._sib_base, self._operands) = x86.get_arch_info(detail.arch.x86)
return self._sib_base
else:
_dict = attr(self, '__dict__')
if 'operands' not in _dict:
self.__gen_detail()
if name not in _dict:
return None
return _dict[name]
# get the last error code
def errno():