编辑:我的问题无法解决。即使人们指责它,也不是重复的。如果你决定对这个问题进行投票,请告诉我原因,所以我能理解。谢谢。
如何强制其他进程关闭当前正在使用的端口。 例如如果Skype正在本地侦听端口80。如何以编程方式强制Skype再次释放该端口,以便我可以在同一端口上正确运行XAMPP?无需更改Skype设置或关闭Skype。
是的,我知道这可能会导致意外行为。
是否只是使用DuplicateObject关闭句柄或者如何完成?
我对关闭流程或找出阻止端口的流程不感兴趣。即使没有netstat,我已经知道它是如何正确完成的。
修改:
我发现WSADuplicateSocket看起来很有希望。但必须从已经拥有Descriptor identifying the local socket
的进程调用它,正如微软所称的那样。如果我能以某种方式获得Descriptor identifying the local socket
,我可能会在CurrPorts
上致电undefined method `name' for nil:NilClass
。这可能是通过代码注入完成的,但我确信有更好的方法。
修改:
据称,一种名为current_user
的工具可以做我想做的事情。所以它绝对可能......但是怎么样?
答案 0 :(得分:0)
从另一个进程访问套接字的正确方法是将代码注入到调用WSADuplicateSocket()
的进程中以复制所需的套接字句柄以供进程访问,然后发送详细信息通过IPC访问您的进程,并通过WSASocket()
访问套接字。参见:
C++ Get Handle of Open Sockets of a Program
但是,更强力的方法是使用带有DUPLICATE_CLOSE_SOURCE
标志的DuplicateHandle()
。无需代码注入:
GetTcpTable2()
和GetExtendedTcpTable()
以及其他相关功能)OpenProcess()
打开进程ID的句柄NtQuerySystemInformation(SystemHandleInformation)
枚举进程的打开句柄(请参阅HOWTO: Enumerate handles),查找打开的套接字对象。NtDeviceIoControlFile()
查询每个套接字句柄的IP /端口信息,以确定哪个套接字对象正在使用您想要的端口(参见Socket handles)。DuplicateHandle()
找到的套接字句柄将其关闭(无需指定目标将其复制到)。