Handle thread_get_state errors
This commit is contained in:
parent
77725b3d66
commit
636719a4c6
@ -2,6 +2,7 @@ package proctl
|
||||
|
||||
// #include "threads_darwin.h"
|
||||
import "C"
|
||||
import "fmt"
|
||||
|
||||
type Regs struct {
|
||||
pc, sp uint64
|
||||
@ -21,7 +22,11 @@ func (r *Regs) SetPC(thread *ThreadContext, pc uint64) error {
|
||||
}
|
||||
|
||||
func registers(thread *ThreadContext) (Registers, error) {
|
||||
state := C.get_registers(C.mach_port_name_t(thread.os.thread_act))
|
||||
var state C.x86_thread_state64_t
|
||||
kret := C.get_registers(C.mach_port_name_t(thread.os.thread_act), &state)
|
||||
if kret != C.KERN_SUCCESS {
|
||||
return nil, fmt.Errorf("could not get registers")
|
||||
}
|
||||
regs := &Regs{pc: uint64(state.__rip), sp: uint64(state.__rsp)}
|
||||
return regs, nil
|
||||
}
|
||||
|
||||
@ -37,18 +37,13 @@ read_memory(mach_port_name_t task, mach_vm_address_t addr, void *d, mach_msg_typ
|
||||
return count;
|
||||
}
|
||||
|
||||
x86_thread_state64_t
|
||||
get_registers(mach_port_name_t task) {
|
||||
kern_return_t
|
||||
get_registers(mach_port_name_t task, x86_thread_state64_t *state) {
|
||||
kern_return_t kret;
|
||||
x86_thread_state64_t state;
|
||||
mach_msg_type_number_t stateCount = x86_THREAD_STATE64_COUNT;
|
||||
|
||||
// TODO(dp) - possible memory leak - vm_deallocate state
|
||||
kret = thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)&state, &stateCount);
|
||||
if (kret != KERN_SUCCESS) printf("SOMETHING WENT WRONG-------------- %d\n", kret);
|
||||
if (kret == KERN_INVALID_ARGUMENT) puts("INAVLID ARGUMENT");
|
||||
|
||||
return state;
|
||||
return thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)state, &stateCount);
|
||||
}
|
||||
|
||||
// TODO(dp) this should return kret instead of void
|
||||
|
||||
@ -10,8 +10,8 @@ write_memory(mach_port_name_t, mach_vm_address_t, void *, mach_msg_type_number_t
|
||||
int
|
||||
read_memory(mach_port_name_t, mach_vm_address_t, void *, mach_msg_type_number_t);
|
||||
|
||||
x86_thread_state64_t
|
||||
get_registers(mach_port_name_t);
|
||||
kern_return_t
|
||||
get_registers(mach_port_name_t, x86_thread_state64_t*);
|
||||
|
||||
void
|
||||
set_pc(thread_act_t, uint64_t);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user