// Capstone Java binding // By Nguyen Anh Quynh & Dang Hoang Vu, 2013 package capstone; import com.sun.jna.Structure; import com.sun.jna.Union; import java.util.List; import java.util.Arrays; import static capstone.X86_const.*; public class X86 { public static class MemType extends Structure { public int segment; public int base; public int index; public int scale; public long disp; @Override public List getFieldOrder() { return Arrays.asList("segment", "base", "index", "scale", "disp"); } } public static class Encoding extends Structure { public byte modrmOffset; public byte dispOffset; public byte dispSize; public byte immOffset; public byte immSize; @Override public List getFieldOrder() { return Arrays.asList("modrmOffset", "dispOffset", "dispSize", "immOffset", "immSize"); } } public static class OpValue extends Union { public int reg; public long imm; public MemType mem; @Override public List getFieldOrder() { return Arrays.asList("reg", "imm", "mem"); } } public static class Operand extends Structure { public int type; public OpValue value; public byte size; public byte access; public int avx_bcast; public boolean avx_zero_opmask; public void read() { super.read(); if (type == X86_OP_MEM) value.setType(MemType.class); if (type == X86_OP_IMM) value.setType(Long.TYPE); if (type == X86_OP_REG) value.setType(Integer.TYPE); if (type == X86_OP_INVALID) return; readField("value"); } @Override public List getFieldOrder() { return Arrays.asList("type", "value", "size", "access", "avx_bcast", "avx_zero_opmask"); } } public static class UnionOpInfo extends Capstone.UnionOpInfo { public byte [] prefix; public byte [] opcode; public byte rex; public byte addr_size; public byte modrm; public byte sib; public long disp; public int sib_index; public byte sib_scale; public int sib_base; public int xop_cc; public int sse_cc; public int avx_cc; public byte avx_sae; public int avx_rm; public long eflags; public byte op_count; public Operand [] op; public Encoding encoding; public UnionOpInfo() { op = new Operand[8]; opcode = new byte[4]; prefix = new byte[4]; } @Override public List getFieldOrder() { return Arrays.asList("prefix", "opcode", "rex", "addr_size", "modrm", "sib", "disp", "sib_index", "sib_scale", "sib_base", "xop_cc", "sse_cc", "avx_cc", "avx_sae", "avx_rm", "eflags", "op_count", "op", "encoding"); } } public static class OpInfo extends Capstone.OpInfo { public byte [] prefix; public byte [] opcode; public byte opSize; public byte rex; public byte addrSize; public byte dispSize; public byte immSize; public byte modrm; public byte sib; public long disp; public int sibIndex; public byte sibScale; public int sibBase; public int xopCC; public int sseCC; public int avxCC; public boolean avxSae; public int avxRm; public long eflags; public Operand[] op; public Encoding encoding; public OpInfo(UnionOpInfo e) { prefix = e.prefix; opcode = e.opcode; rex = e.rex; addrSize = e.addr_size; modrm = e.modrm; sib = e.sib; disp = e.disp; sibIndex = e.sib_index; sibScale = e.sib_scale; sibBase = e.sib_base; xopCC = e.xop_cc; sseCC = e.sse_cc; avxCC = e.avx_cc; avxSae = e.avx_sae > 0; avxRm = e.avx_rm; eflags = e.eflags; op = new Operand[e.op_count]; for (int i=0; i