微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何获得子进程的句柄 uintptr?

我想启动一个子进程(我使用的是 Windows 10)并且我希望能够随意暂停和恢复该进程。

我发现这个来自 NtSuspendProcess 的整洁的未记录的 windows 函数 ntdll.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)

解决方法

Go 不会公开 # Sample data network plot import networkx as nx import pandas as pd data = {'ID': {0: 1,1: 2,2: 4,3: 4,4: 12,5: 12,6: 13,7: 17},'Target': {0: 12,1: 24,2: 13,3: 12,4: 1,5: 4,6: 4,7: 1},'Weight': {0: 0.4,1: 0.1,2: 0.5,3: 0.3,4: 0.1,5: 0.4,6: 0.2,7: 0.1},'Label': {0: 1,1: 0,2: 1,3: 1,5: 1,6: 1,7: 0}} df = pd.DataFrame.from_dict(data) G = nx.from_pandas_edgelist(df,source='ID',target='Target',edge_attr=['Weight','Label']) width = [20 * d['Weight'] for (u,v,d) in G.edges(data=True)] edge_color = [d['Label'] for (u,d) in G.edges(data=True)] nx.draw_networkx(G,width=width,edge_color=edge_color) 中的句柄,您必须通过 .

反思

exec.Command

或者通过创建相同的 Process 类型并将 Cmd.Process 转换为您自己的类型以访问私有字段。

cmd := exec.Command("cmd.exe")
cmd.Start()
handle := uintptr(reflect.ValueOf(cmd.Process).Elem().FieldByName("handle").Uint())
type Process struct {
   Pid int
   handle uintptr
   isdone uint32
   sigMu sync.RWMutex
}
,

“Make that 4”的 answer 都完美无瑕,简单明了,解释也很好。

我只想添加一个我发现的额外方法,只是为了完整性(需要导入 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。