You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.6 KiB

/* Keystone Assembler Engine (www.keystone-engine.org) */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2016 */
/* Golang bindings by Remco Verhoef <remco@dutchcoders.io>, 2016 */
// +build darwin,linux,cgo
package keystone
// #cgo LDFLAGS: -lkeystone -lstdc++ -lm
// #include <keystone/keystone.h>
import "C"
import "unsafe"
func ks_version() (uint, uint) {
major := C.uint(0)
minor := C.uint(0)
C.ks_version(&major, &minor)
return uint(major), uint(minor)
}
func ks_arch_supported(a Architecture) bool {
return bool(C.ks_arch_supported((C.ks_arch)(a)))
}
func ks_open(a Architecture, m Mode, engine **C.ks_engine) error {
if err := C.ks_open((C.ks_arch)(a), (C.int)(m), (**C.ks_engine)(unsafe.Pointer(engine))); err != 0 {
return Error(err)
}
return nil
}
func ks_option(engine *C.ks_engine, type_ OptionType, value OptionValue) error {
if err := C.ks_option(engine, C.ks_opt_type(type_), C.size_t(value)); err != 0 {
return Error(err)
}
return nil
}
func ks_errno(engine *C.ks_engine) error {
if err := C.ks_errno(engine); err != 0 {
return Error(err)
}
return nil
}
func ks_asm(engine *C.ks_engine, str string, address uint64, encoding *[]byte, stat_count *uint64) bool {
cstr := C.CString(str)
defer C.free(unsafe.Pointer(cstr))
var p_insn unsafe.Pointer
defer C.free(unsafe.Pointer(p_insn))
var count, l_insn C.size_t
err := C.ks_asm(engine, cstr, C.uint64_t(address), (**C.uchar)(unsafe.Pointer(&p_insn)), &l_insn, &count)
*encoding = C.GoBytes(p_insn, C.int(l_insn))
*stat_count = uint64(count)
return err == 0
}
func ks_close(engine *C.ks_engine) error {
if err := C.ks_close(engine); err != 0 {
return Error(err)
}
return nil
}