github.com/yanndegat/hiera@v0.6.8/session/proc_windows.go (about) 1 //go:build windows 2 // +build windows 3 4 package session 5 6 import ( 7 "os" 8 "syscall" 9 10 "golang.org/x/sys/windows" 11 ) 12 13 var procAttrs = &windows.SysProcAttr{ 14 CreationFlags: windows.CREATE_UNICODE_ENVIRONMENT | windows.CREATE_NEW_PROCESS_GROUP, 15 } 16 17 // Windows doesn't understand SIGINT, instead we attach a console 18 // to the process and send CTRL+BREAK / CTRL+C 19 // Code from https://github.com/mattn/goreman/blob/master/proc_windows.go 20 func terminateProc(process *os.Process) error { 21 dll, err := windows.LoadDLL("kernel32.dll") 22 if err != nil { 23 return err 24 } 25 defer dll.Release() 26 27 pid := process.Pid 28 29 f, err := dll.FindProc("AttachConsole") 30 if err != nil { 31 return err 32 } 33 r1, _, err := f.Call(uintptr(pid)) 34 if r1 == 0 && err != syscall.ERROR_ACCESS_DENIED { 35 return err 36 } 37 38 f, err = dll.FindProc("SetConsoleCtrlHandler") 39 if err != nil { 40 return err 41 } 42 r1, _, err = f.Call(0, 1) 43 if r1 == 0 { 44 return err 45 } 46 f, err = dll.FindProc("GenerateConsoleCtrlEvent") 47 if err != nil { 48 return err 49 } 50 r1, _, err = f.Call(windows.CTRL_BREAK_EVENT, uintptr(pid)) 51 if r1 == 0 { 52 return err 53 } 54 return nil 55 }