如何获取子进程的句柄 uintptr?

我想启动一个子进程(我在Windows 10上),我希望能够随意暂停和恢复该进程。


我发现这个整洁的未记录的Windows功能应该可以完成这项工作,但现在我需要获得进程的句柄来发出挂起命令。NtSuspendProcessntdll.dll


这是一个例子:


modntdll = syscall.NewLazyDLL("ntdll.dll")

procNtSuspendProcess = modntdll.NewProc("NtSuspendProcess")

procNtResumeProcess  = modntdll.NewProc("NtResumeProcess")

_, _, err = procNtSuspendProcess.Call(uintptr(handle))

_, _, err = procNtResumeProcess.Call(uintptr(handle))

要启动该过程,我通常会使用该函数,但我找不到检索该过程句柄的方法。exec.Command


有没有办法在启动流程时获取句柄?

如果不是 ,我应该使用哪个其他库来启动同时返回进程句柄的进程?exec.Command


作为旁注:

我已经研究了syscall。StartProcess,但它的级别很低,我觉得无法处理这样的原始实现。


_, handle, err := syscall.StartProcess("C:\\WINDOWS\\system32\\cmd.exe", []string{}, procAttr)



陪伴而非守候
浏览 124回答 2
2回答

梵蒂冈之花

Go 不会公开中的句柄,您将不得不通过它来访问它。exec.Command反射cmd := exec.Command("cmd.exe")cmd.Start()handle := uintptr(reflect.ValueOf(cmd.Process).Elem().FieldByName("handle").Uint())或者通过创建相同的“进程”类型并将 Cmd.Process 强制转换为您自己的类型以访问私有字段。type Process struct {   Pid int   handle uintptr   isdone uint32   sigMu sync.RWMutex}cmd := exec.Command("cmd.exe")cmd.Start()proc := (*Process)(unsafe.Pointer(cmd.Process))println(proc.handle)

富国沪深

“Make that 4”的答案都是完美的,简单而解释得很好。我只是添加一个我发现的其他方法,只是为了完整性(需要导入)更新:显然这种方法可能会导致错误/错误,最好不要实现它(检查注释)golang.org/x/sys/windowscmd := exec.Command("cmd.exe")cmd.Start()// using PROCESS_SUSPEND_RESUME since I want to call NtSuspendProcess functionhandle, _ := windows.OpenProcess(windows.PROCESS_SUSPEND_RESUME, false, uint32(cmd.Process.Pid))defer windows.CloseHandle(handle)fmt.Println(handle)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go