1*9a0e4156SSadaf Ebrahimi // Capstone Java binding 2*9a0e4156SSadaf Ebrahimi // By Nguyen Anh Quynh & Dang Hoang Vu, 2013 3*9a0e4156SSadaf Ebrahimi 4*9a0e4156SSadaf Ebrahimi package capstone; 5*9a0e4156SSadaf Ebrahimi 6*9a0e4156SSadaf Ebrahimi import com.sun.jna.Structure; 7*9a0e4156SSadaf Ebrahimi import com.sun.jna.Union; 8*9a0e4156SSadaf Ebrahimi 9*9a0e4156SSadaf Ebrahimi import java.util.List; 10*9a0e4156SSadaf Ebrahimi import java.util.Arrays; 11*9a0e4156SSadaf Ebrahimi 12*9a0e4156SSadaf Ebrahimi import static capstone.X86_const.*; 13*9a0e4156SSadaf Ebrahimi 14*9a0e4156SSadaf Ebrahimi public class X86 { 15*9a0e4156SSadaf Ebrahimi 16*9a0e4156SSadaf Ebrahimi public static class MemType extends Structure { 17*9a0e4156SSadaf Ebrahimi public int segment; 18*9a0e4156SSadaf Ebrahimi public int base; 19*9a0e4156SSadaf Ebrahimi public int index; 20*9a0e4156SSadaf Ebrahimi public int scale; 21*9a0e4156SSadaf Ebrahimi public long disp; 22*9a0e4156SSadaf Ebrahimi 23*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()24*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 25*9a0e4156SSadaf Ebrahimi return Arrays.asList("segment", "base", "index", "scale", "disp"); 26*9a0e4156SSadaf Ebrahimi } 27*9a0e4156SSadaf Ebrahimi } 28*9a0e4156SSadaf Ebrahimi 29*9a0e4156SSadaf Ebrahimi public static class Encoding extends Structure { 30*9a0e4156SSadaf Ebrahimi public byte modrmOffset; 31*9a0e4156SSadaf Ebrahimi public byte dispOffset; 32*9a0e4156SSadaf Ebrahimi public byte dispSize; 33*9a0e4156SSadaf Ebrahimi public byte immOffset; 34*9a0e4156SSadaf Ebrahimi public byte immSize; 35*9a0e4156SSadaf Ebrahimi 36*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()37*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 38*9a0e4156SSadaf Ebrahimi return Arrays.asList("modrmOffset", "dispOffset", "dispSize", "immOffset", "immSize"); 39*9a0e4156SSadaf Ebrahimi } 40*9a0e4156SSadaf Ebrahimi } 41*9a0e4156SSadaf Ebrahimi 42*9a0e4156SSadaf Ebrahimi public static class OpValue extends Union { 43*9a0e4156SSadaf Ebrahimi public int reg; 44*9a0e4156SSadaf Ebrahimi public long imm; 45*9a0e4156SSadaf Ebrahimi public MemType mem; 46*9a0e4156SSadaf Ebrahimi 47*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()48*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 49*9a0e4156SSadaf Ebrahimi return Arrays.asList("reg", "imm", "mem"); 50*9a0e4156SSadaf Ebrahimi } 51*9a0e4156SSadaf Ebrahimi } 52*9a0e4156SSadaf Ebrahimi 53*9a0e4156SSadaf Ebrahimi public static class Operand extends Structure { 54*9a0e4156SSadaf Ebrahimi public int type; 55*9a0e4156SSadaf Ebrahimi public OpValue value; 56*9a0e4156SSadaf Ebrahimi public byte size; 57*9a0e4156SSadaf Ebrahimi public byte access; 58*9a0e4156SSadaf Ebrahimi public int avx_bcast; 59*9a0e4156SSadaf Ebrahimi public boolean avx_zero_opmask; 60*9a0e4156SSadaf Ebrahimi read()61*9a0e4156SSadaf Ebrahimi public void read() { 62*9a0e4156SSadaf Ebrahimi super.read(); 63*9a0e4156SSadaf Ebrahimi if (type == X86_OP_MEM) 64*9a0e4156SSadaf Ebrahimi value.setType(MemType.class); 65*9a0e4156SSadaf Ebrahimi if (type == X86_OP_IMM) 66*9a0e4156SSadaf Ebrahimi value.setType(Long.TYPE); 67*9a0e4156SSadaf Ebrahimi if (type == X86_OP_REG) 68*9a0e4156SSadaf Ebrahimi value.setType(Integer.TYPE); 69*9a0e4156SSadaf Ebrahimi if (type == X86_OP_INVALID) 70*9a0e4156SSadaf Ebrahimi return; 71*9a0e4156SSadaf Ebrahimi readField("value"); 72*9a0e4156SSadaf Ebrahimi } 73*9a0e4156SSadaf Ebrahimi 74*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()75*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 76*9a0e4156SSadaf Ebrahimi return Arrays.asList("type", "value", "size", "access", "avx_bcast", "avx_zero_opmask"); 77*9a0e4156SSadaf Ebrahimi } 78*9a0e4156SSadaf Ebrahimi } 79*9a0e4156SSadaf Ebrahimi 80*9a0e4156SSadaf Ebrahimi public static class UnionOpInfo extends Capstone.UnionOpInfo { 81*9a0e4156SSadaf Ebrahimi public byte [] prefix; 82*9a0e4156SSadaf Ebrahimi public byte [] opcode; 83*9a0e4156SSadaf Ebrahimi public byte rex; 84*9a0e4156SSadaf Ebrahimi public byte addr_size; 85*9a0e4156SSadaf Ebrahimi public byte modrm; 86*9a0e4156SSadaf Ebrahimi public byte sib; 87*9a0e4156SSadaf Ebrahimi public long disp; 88*9a0e4156SSadaf Ebrahimi public int sib_index; 89*9a0e4156SSadaf Ebrahimi public byte sib_scale; 90*9a0e4156SSadaf Ebrahimi public int sib_base; 91*9a0e4156SSadaf Ebrahimi public int xop_cc; 92*9a0e4156SSadaf Ebrahimi public int sse_cc; 93*9a0e4156SSadaf Ebrahimi public int avx_cc; 94*9a0e4156SSadaf Ebrahimi public byte avx_sae; 95*9a0e4156SSadaf Ebrahimi public int avx_rm; 96*9a0e4156SSadaf Ebrahimi public long eflags; 97*9a0e4156SSadaf Ebrahimi 98*9a0e4156SSadaf Ebrahimi public byte op_count; 99*9a0e4156SSadaf Ebrahimi 100*9a0e4156SSadaf Ebrahimi public Operand [] op; 101*9a0e4156SSadaf Ebrahimi 102*9a0e4156SSadaf Ebrahimi public Encoding encoding; 103*9a0e4156SSadaf Ebrahimi UnionOpInfo()104*9a0e4156SSadaf Ebrahimi public UnionOpInfo() { 105*9a0e4156SSadaf Ebrahimi op = new Operand[8]; 106*9a0e4156SSadaf Ebrahimi opcode = new byte[4]; 107*9a0e4156SSadaf Ebrahimi prefix = new byte[4]; 108*9a0e4156SSadaf Ebrahimi } 109*9a0e4156SSadaf Ebrahimi 110*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()111*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 112*9a0e4156SSadaf Ebrahimi return Arrays.asList("prefix", "opcode", "rex", "addr_size", 113*9a0e4156SSadaf Ebrahimi "modrm", "sib", "disp", "sib_index", "sib_scale", "sib_base", "xop_cc", "sse_cc", "avx_cc", "avx_sae", "avx_rm", "eflags", "op_count", "op", "encoding"); 114*9a0e4156SSadaf Ebrahimi } 115*9a0e4156SSadaf Ebrahimi } 116*9a0e4156SSadaf Ebrahimi 117*9a0e4156SSadaf Ebrahimi public static class OpInfo extends Capstone.OpInfo { 118*9a0e4156SSadaf Ebrahimi public byte [] prefix; 119*9a0e4156SSadaf Ebrahimi public byte [] opcode; 120*9a0e4156SSadaf Ebrahimi public byte opSize; 121*9a0e4156SSadaf Ebrahimi public byte rex; 122*9a0e4156SSadaf Ebrahimi public byte addrSize; 123*9a0e4156SSadaf Ebrahimi public byte dispSize; 124*9a0e4156SSadaf Ebrahimi public byte immSize; 125*9a0e4156SSadaf Ebrahimi public byte modrm; 126*9a0e4156SSadaf Ebrahimi public byte sib; 127*9a0e4156SSadaf Ebrahimi public long disp; 128*9a0e4156SSadaf Ebrahimi public int sibIndex; 129*9a0e4156SSadaf Ebrahimi public byte sibScale; 130*9a0e4156SSadaf Ebrahimi public int sibBase; 131*9a0e4156SSadaf Ebrahimi public int xopCC; 132*9a0e4156SSadaf Ebrahimi public int sseCC; 133*9a0e4156SSadaf Ebrahimi public int avxCC; 134*9a0e4156SSadaf Ebrahimi public boolean avxSae; 135*9a0e4156SSadaf Ebrahimi public int avxRm; 136*9a0e4156SSadaf Ebrahimi public long eflags; 137*9a0e4156SSadaf Ebrahimi 138*9a0e4156SSadaf Ebrahimi public Operand[] op; 139*9a0e4156SSadaf Ebrahimi 140*9a0e4156SSadaf Ebrahimi public Encoding encoding; 141*9a0e4156SSadaf Ebrahimi OpInfo(UnionOpInfo e)142*9a0e4156SSadaf Ebrahimi public OpInfo(UnionOpInfo e) { 143*9a0e4156SSadaf Ebrahimi prefix = e.prefix; 144*9a0e4156SSadaf Ebrahimi opcode = e.opcode; 145*9a0e4156SSadaf Ebrahimi rex = e.rex; 146*9a0e4156SSadaf Ebrahimi addrSize = e.addr_size; 147*9a0e4156SSadaf Ebrahimi modrm = e.modrm; 148*9a0e4156SSadaf Ebrahimi sib = e.sib; 149*9a0e4156SSadaf Ebrahimi disp = e.disp; 150*9a0e4156SSadaf Ebrahimi sibIndex = e.sib_index; 151*9a0e4156SSadaf Ebrahimi sibScale = e.sib_scale; 152*9a0e4156SSadaf Ebrahimi sibBase = e.sib_base; 153*9a0e4156SSadaf Ebrahimi xopCC = e.xop_cc; 154*9a0e4156SSadaf Ebrahimi sseCC = e.sse_cc; 155*9a0e4156SSadaf Ebrahimi avxCC = e.avx_cc; 156*9a0e4156SSadaf Ebrahimi avxSae = e.avx_sae > 0; 157*9a0e4156SSadaf Ebrahimi avxRm = e.avx_rm; 158*9a0e4156SSadaf Ebrahimi eflags = e.eflags; 159*9a0e4156SSadaf Ebrahimi op = new Operand[e.op_count]; 160*9a0e4156SSadaf Ebrahimi for (int i=0; i<e.op_count; i++) 161*9a0e4156SSadaf Ebrahimi op[i] = e.op[i]; 162*9a0e4156SSadaf Ebrahimi encoding = e.encoding; 163*9a0e4156SSadaf Ebrahimi } 164*9a0e4156SSadaf Ebrahimi } 165*9a0e4156SSadaf Ebrahimi } 166