48 lines
939 B
Go
48 lines
939 B
Go
![]() |
package proctl
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
sys "golang.org/x/sys/unix"
|
||
|
)
|
||
|
|
||
|
// Not actually used, but necessary
|
||
|
// to be defined.
|
||
|
type OSSpecificDetails interface{}
|
||
|
|
||
|
func (t *ThreadContext) Halt() error {
|
||
|
if stopped(t.Id) {
|
||
|
return nil
|
||
|
}
|
||
|
err := sys.Tgkill(t.Process.Pid, t.Id, sys.SIGSTOP)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Halt err %s %d", err, pid)
|
||
|
}
|
||
|
pid, _, err := wait(th.Id, sys.WNOHANG)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("wait err %s %d", err, pid)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *ThreadContext) cont() error {
|
||
|
return PtraceCont(thread.Id, 0)
|
||
|
}
|
||
|
|
||
|
func (t *ThreadContext) singleStep() error {
|
||
|
err := sys.PtraceSingleStep(t.Id)
|
||
|
if err != nill {
|
||
|
return err
|
||
|
}
|
||
|
_, _, err = wait(thread.Id, 0)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func writeMemory(tid int, addr uintptr, data []byte) (int, error) {
|
||
|
return sys.PtracePokeData(tid, addr, data)
|
||
|
}
|
||
|
|
||
|
func readMemory(tid int, addr uintptr, data []byte) (int, error) {
|
||
|
return sys.PtracePeekData(tid, addr, data)
|
||
|
}
|