我正在编写一个Windows服务,它将与用户级应用程序进行通信。Windows服务将在用户机器上24/7运行,每当用户启动相应的应用程序时,它将使用命名管道与服务建立连接。但是这里的service也负责创建客户端的named-pipe。在服务器端一切正常,但我不明白如何通过SCM将服务创建的Handle发送到客户端进程?
xzv2uavs1#
您不应该传递句柄,而是给予管道一个名称,并使用该名称通过调用CreateFile来访问它
roejwanj2#
我正在回答如何将句柄从一个进程传递到另一个进程的问题,这不是OP最初需要的,并且@AndersK在实际问题方面是正确的。但是这个答案对于那些真正想要将HANDLE从一个进程传递到另一个进程的人来说可能是有用的。您可以使用函数DuplicateHandle和WSADuplicateSocket(如果您的句柄是Socket)。但这在Windows中似乎真的很棘手,看起来你需要对目标进程具有高级别的访问权限,但这必须是可能的,如果是从服务发送到常规进程,但我认为这是不可能的,如果你想从用户进程发送句柄到更高的特权(不损害系统的安全性)。在你复制句柄后--你有一个句柄值,这个值在你的进程中是不可用的,但是你可以通过任何方式(Pipes,SendMessage,Sockets,Clipboard等)将它作为值发送给另一个进程,接收进程将能够将收到的BYTE[]转换为Handle并使用它。但这实际上是硬核代码体操,但它是可行的。我手头没有现成的例子。
qaxu7uf23#
您不能通过任何IPC机制发送HANDLE。我能想到的最好的方法是传递命名管道的名称(可能在命令行参数中传递给第二个程序),然后让第二个程序重新打开该管道。这就是这个名字的主要目的。
HANDLE
3条答案
按热度按时间xzv2uavs1#
您不应该传递句柄,而是给予管道一个名称,并使用该名称通过调用CreateFile来访问它
roejwanj2#
我正在回答如何将句柄从一个进程传递到另一个进程的问题,这不是OP最初需要的,并且@AndersK在实际问题方面是正确的。
但是这个答案对于那些真正想要将HANDLE从一个进程传递到另一个进程的人来说可能是有用的。
您可以使用函数DuplicateHandle和WSADuplicateSocket(如果您的句柄是Socket)。
但这在Windows中似乎真的很棘手,看起来你需要对目标进程具有高级别的访问权限,但这必须是可能的,如果是从服务发送到常规进程,但我认为这是不可能的,如果你想从用户进程发送句柄到更高的特权(不损害系统的安全性)。
在你复制句柄后--你有一个句柄值,这个值在你的进程中是不可用的,但是你可以通过任何方式(Pipes,SendMessage,Sockets,Clipboard等)将它作为值发送给另一个进程,接收进程将能够将收到的BYTE[]转换为Handle并使用它。
但这实际上是硬核代码体操,但它是可行的。我手头没有现成的例子。
qaxu7uf23#
您不能通过任何IPC机制发送
HANDLE
。我能想到的最好的方法是传递命名管道的名称(可能在命令行参数中传递给第二个程序),然后让第二个程序重新打开该管道。这就是这个名字的主要目的。