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 }