为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
陪伴而非守候 2022-09-05 15:30:50
我想启动一个子进程(我在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)
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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)


查看完整回答
反对 回复 2022-09-05
?
富国沪深

TA贡献1790条经验 获得超9个赞

“Make that 4”的答案都是完美的,简单而解释得很好。


我只是添加一个我发现的其他方法,只是为了完整性(需要导入)

更新:显然这种方法可能会导致错误/错误,最好不要实现它(检查注释)golang.org/x/sys/windows


cmd := exec.Command("cmd.exe")

cmd.Start()


// using PROCESS_SUSPEND_RESUME since I want to call NtSuspendProcess function

handle, _ := windows.OpenProcess(windows.PROCESS_SUSPEND_RESUME, false, uint32(cmd.Process.Pid))

defer windows.CloseHandle(handle)


fmt.Println(handle)


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号