github.com/bazelbuild/bazel-watcher@v0.25.2/internal/ibazel/process_group/syscalls_windows.go (about)

     1  package process_group
     2  
     3  import (
     4  	"syscall"
     5  )
     6  
     7  var (
     8  	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
     9  	modntdll    = syscall.NewLazyDLL("ntdll.dll")
    10  
    11  	procCreateJobObject          = modkernel32.NewProc("CreateJobObjectW")
    12  	procSetInformationJobObject  = modkernel32.NewProc("SetInformationJobObject")
    13  	procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject")
    14  	procTerminateJobObject       = modkernel32.NewProc("TerminateJobObject")
    15  	procNtResumeProcess          = modntdll.NewProc("NtResumeProcess")
    16  )
    17  
    18  const (
    19  	// CREATE_SUSPEND flag - used in CreateProcess 'dwCreationFlags' field to
    20  	// specify that the process should start suspended.
    21  	createSuspended = 0x00000004
    22  
    23  	// PROCESS_ALL_ACCESS flag - used in OpenProcess 'dwDesiredAccess' field to
    24  	// request all permission. Seems needed for NtResumeProcess.
    25  	processAllAccess = 0x1F0FFF
    26  
    27  	// JobObjectAssociateCompletionPortInformation - used in
    28  	// SetInformationJobObject to set completion port of job object.
    29  	jobObjectAssociateCompletionPortInformation = 7
    30  
    31  	// JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO - message returned from IO completion
    32  	// port when no more processes are active in job object.
    33  	jobObjectMsgActiveProcessZero = 4
    34  )
    35  
    36  type jobObjectAssociationCompletionPort struct {
    37  	CompletionKey  syscall.Handle
    38  	CompletionPort syscall.Handle
    39  }
    40  
    41  func createJobObject() (syscall.Handle, error) {
    42  	job, _, errno := syscall.Syscall(procCreateJobObject.Addr(), 2, 0, 0, 0)
    43  	if errno != 0 {
    44  		return 0, errno
    45  	}
    46  	return syscall.Handle(job), nil
    47  }
    48  
    49  func setInformationJobObject(job syscall.Handle, infoClass int, objInfo uintptr, objInfoLen uintptr) error {
    50  	_, _, errno := syscall.Syscall6(procSetInformationJobObject.Addr(), 4, uintptr(job), uintptr(infoClass), objInfo, objInfoLen, 0, 0)
    51  	if errno != 0 {
    52  		return errno
    53  	}
    54  	return nil
    55  }
    56  
    57  func assignProcessToJobObject(job syscall.Handle, process syscall.Handle) error {
    58  	_, _, errno := syscall.Syscall(procAssignProcessToJobObject.Addr(), 2, uintptr(job), uintptr(process), 0)
    59  	if errno != 0 {
    60  		return errno
    61  	}
    62  	return nil
    63  }
    64  
    65  func terminateJobObject(job syscall.Handle, exitCode uint) error {
    66  	_, _, errno := syscall.Syscall(procTerminateJobObject.Addr(), 2, uintptr(job), uintptr(exitCode), 0)
    67  	if errno != 0 {
    68  		return errno
    69  	}
    70  	return nil
    71  }
    72  
    73  func ntResumeProcess(process syscall.Handle) error {
    74  	_, _, errno := syscall.Syscall(procNtResumeProcess.Addr(), 1, uintptr(process), 0, 0)
    75  	if errno != 0 {
    76  		return errno
    77  	}
    78  	return nil
    79  }