Merge pull request #819 from akirschbaum/next-java-add-binding

Java: Support cs_strerror() and cs_regs_access()
This commit is contained in:
Nguyen Anh Quynh 2016-11-27 21:31:57 +08:00 committed by GitHub
commit 83a3a39bf6
2 changed files with 44 additions and 0 deletions

View File

@ -7,6 +7,10 @@ This file details the changelog of Capstone.
- Fix a bug where Arm.OpInfo.memBarrier and Arm.OpInfo.op is wrongly
calculated
[ Bindings ]
- Java; add Capstone.strerror() and CsInsn.regsAccess().
---------------------------------
Version 3.0.2: March 11th, 2015

View File

@ -4,8 +4,10 @@
package capstone;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.NativeLongByReference;
import com.sun.jna.Structure;
import com.sun.jna.Union;
@ -238,6 +240,38 @@ public class Capstone {
return cs.cs_insn_group(csh, raw.getPointer(), gid) != 0;
}
public CsRegsAccess regsAccess() {
Memory regsReadMemory = new Memory(64*2);
ByteByReference regsReadCountRef = new ByteByReference();
Memory regsWriteMemory = new Memory(64*2);
ByteByReference regsWriteCountRef = new ByteByReference();
int c = cs.cs_regs_access(csh, raw.getPointer(), regsReadMemory, regsReadCountRef, regsWriteMemory, regsWriteCountRef);
if (c != CS_ERR_OK) {
return null;
}
byte regsReadCount = regsReadCountRef.getValue();
byte regsWriteCount = regsWriteCountRef.getValue();
short[] regsRead = new short[regsReadCount];
regsReadMemory.read(0, regsRead, 0, regsReadCount);
short[] regsWrite = new short[regsWriteCount];
regsWriteMemory.read(0, regsWrite, 0, regsWriteCount);
return new CsRegsAccess(regsRead, regsWrite);
}
}
public static class CsRegsAccess {
public short[] regsRead;
public short[] regsWrite;
public CsRegsAccess(short[] regsRead, short[] regsWrite) {
this.regsRead = regsRead;
this.regsWrite = regsWrite;
}
}
private CsInsn[] fromArrayRaw(_cs_insn[] arr_raw) {
@ -270,6 +304,8 @@ public class Capstone {
public int cs_errno(NativeLong csh);
public int cs_version(IntByReference major, IntByReference minor);
public boolean cs_support(int query);
public String cs_strerror(int code);
public int cs_regs_access(NativeLong handle, Pointer insn, Pointer regs_read, ByteByReference regs_read_count, Pointer regs_write, ByteByReference regs_write_count);
}
// Capstone API version
@ -478,4 +514,8 @@ public class Capstone {
return allInsn;
}
public String strerror(int code) {
return cs.cs_strerror(code);
}
}