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.
68 lines
1.3 KiB
68 lines
1.3 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 */
|
|
|
|
package keystone
|
|
|
|
// #include <keystone/keystone.h>
|
|
import "C"
|
|
|
|
type Architecture uint
|
|
|
|
type Mode uint
|
|
|
|
type OptionType uint
|
|
|
|
type OptionValue uint
|
|
|
|
type Error uint32
|
|
|
|
func (e Error) Error() string {
|
|
s := C.ks_strerror((C.ks_err)(e))
|
|
return C.GoString(s)
|
|
}
|
|
|
|
func (a Architecture) Supported() bool {
|
|
return ks_arch_supported(a)
|
|
}
|
|
|
|
func Version() (uint, uint) {
|
|
return ks_version()
|
|
}
|
|
|
|
type Keystone struct {
|
|
engine *C.ks_engine
|
|
}
|
|
|
|
func New(a Architecture, m Mode) (*Keystone, error) {
|
|
ks := &Keystone{}
|
|
if err := ks_open(a, m, &ks.engine); err != nil {
|
|
return nil, err
|
|
} else {
|
|
return ks, nil
|
|
}
|
|
}
|
|
|
|
func (ks *Keystone) LastError() error {
|
|
return ks_errno(ks.engine)
|
|
}
|
|
|
|
func (ks *Keystone) Option(type_ OptionType, value OptionValue) error {
|
|
if err := ks_option(ks.engine, type_, value); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ks *Keystone) Assemble(str string, address uint64) ([]byte, uint64, bool) {
|
|
encoding := []byte{}
|
|
stat_count := uint64(0)
|
|
ok := ks_asm(ks.engine, str, address, &encoding, &stat_count)
|
|
return encoding, stat_count, ok
|
|
}
|
|
|
|
func (ks *Keystone) Close() error {
|
|
return ks_close(ks.engine)
|
|
}
|