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  }