// Capstone Java binding // By Nguyen Anh Quynh & Dang Hoang Vu, 2013 import com.sun.jna.Structure; import com.sun.jna.Pointer; import com.sun.jna.Union; import com.sun.jna.NativeLong; import java.util.List; import java.util.Arrays; class Arm { // ARM operand shift type public static final int ARM_SFT_INVALID = 0; public static final int ARM_SFT_ASR = 1; public static final int ARM_SFT_LSL = 2; public static final int ARM_SFT_LSR = 3; public static final int ARM_SFT_ROR = 4; public static final int ARM_SFT_RRX = 5; public static final int ARM_SFT_ASR_REG = 6; public static final int ARM_SFT_LSL_REG = 7; public static final int ARM_SFT_LSR_REG = 8; public static final int ARM_SFT_ROR_REG = 9; public static final int ARM_SFT_RRX_REG = 10; // ARM code condition type public static final int ARM_CC_INVALID = 0; public static final int ARM_CC_EQ = 1; public static final int ARM_CC_NE = 2; public static final int ARM_CC_HS = 3; public static final int ARM_CC_LO = 4; public static final int ARM_CC_MI = 5; public static final int ARM_CC_PL = 6; public static final int ARM_CC_VS = 7; public static final int ARM_CC_VC = 8; public static final int ARM_CC_HI = 9; public static final int ARM_CC_LS = 10; public static final int ARM_CC_GE = 11; public static final int ARM_CC_LT = 12; public static final int ARM_CC_GT = 13; public static final int ARM_CC_LE = 14; public static final int ARM_CC_AL = 15; // Operand type public static final int ARM_OP_INVALID = 0; // Uninitialized. public static final int ARM_OP_REG = 1 ; // Register operand. public static final int ARM_OP_CIMM = 2; // C-Immediate operand. public static final int ARM_OP_PIMM = 3; // C-Immediate operand. public static final int ARM_OP_IMM = 4 ; // Immediate operand. public static final int ARM_OP_FP = 5 ; // Floating-Point immediate operand. public static final int ARM_OP_MEM = 6 ; // Memory operand public static class MemType extends Structure { public int base; public int index; public int scale; public long disp; @Override public List getFieldOrder() { return Arrays.asList("base", "index", "scale", "disp"); } } public static class OpValue extends Union { public int reg; public long imm; public double fp; public MemType mem; @Override public List getFieldOrder() { return Arrays.asList("reg", "imm", "fp", "mem"); } } public static class OpShift extends Structure { public int type; public int value; @Override public List getFieldOrder() { return Arrays.asList("type","value"); } } public static class Operand extends Structure { public OpShift shift; public int type; public OpValue value; public void read() { super.read(); if (type == ARM_OP_MEM) value.setType(MemType.class); if (type == ARM_OP_FP) value.setType(Double.TYPE); if (type == ARM_OP_PIMM || type == ARM_OP_IMM || type == ARM_OP_CIMM) value.setType(Long.TYPE); if (type == ARM_OP_REG) value.setType(Integer.TYPE); readField("value"); } @Override public List getFieldOrder() { return Arrays.asList("shift", "type", "value"); } } public static class UnionOpInfo extends Structure { public int cc; public byte _update_flags; public byte _writeback; public byte op_count; public Operand [] op = new Operand[32]; @Override public List getFieldOrder() { return Arrays.asList("cc", "_update_flags", "_writeback", "op_count", "op"); } } public static class OpInfo extends Capstone.OpInfo { public int cc; public boolean update_flags; public boolean writeback; public Operand [] op = null; public OpInfo(UnionOpInfo op_info) { cc = op_info.cc; update_flags = (op_info._update_flags > 0); writeback = (op_info._writeback > 0); if (op_info.op_count == 0) return; op = new Operand[op_info.op_count]; for (int i=0; i