您可以确定哪些进程在外部使用ncalrpc RPC端点吗?

时间:2019-02-27 01:13:55

标签: debugging rpc visual-studio-debugging endpoint c++-winrt

当我们的开发人员在将新建且正在运行的服务器进程附加到VS2017调试器后尝试调试C ++ / Winrt ncalrpc RPC服务器时,即使启用断点来编码该代码,他们也无法断点到新的或修改的代码行不完全一样;它会在IDE内部产生意外的符号错误消息。

我从一个团队成员那里获悉,这是由于使用核心服务的其他应用程序和服务与RPC端点之间的RPC连接持续存在所致。我对RPC不太了解,但是一直在阅读。检查核心服务的来源似乎表明它们为stopping the server做的一切正确,

RPC_STATUS rs = 0;
rs = RpcMgmtStopServerListening(NULL);
//...
rs = RpcServerUnregisterIf(RPC_IF_SPEC, nullptr, 0);
//...
rs = RpcEpUnregister(RPC_IF_SPEC, BindingVector, nullptr);

但是,老实说,也有可能他们应该使用rs = RpcServerUnregisterIf(NULL, NULL, 0);来代替,我真的不能说。

现在,我们要么必须手动跟踪连接到该服务的所有进程并杀死/停止它们,要么采取“简便”的方法,并在安装新服务后执行重新引导,从而使我们能够以正确的方式进行调试将该过程附加到VS2017时的文件位置。

要解决这个问题,我的实用工具想法是看是否可以生成连接到RPC端点的进程列表,对它们进行核对,安装新服务,然后重新启动它们。

或者,this article似乎表明,可以通过一种称为“关联”的方法来避免该问题的发生,但是在执行该操作方面有些含糊。

  

关联本身是引用计数的,当所有引用消失时,它将停止并关闭所有连接。每个绑定句柄和每个上下文句柄都拥有对该关联的引用。全部关闭后,关联消失。

更新:

已接受的答案表明这在外部过程中是不可能的;这不是通过外部过程 来实现此目标的方法。

1 个答案:

答案 0 :(得分:1)

RPC具有RpcServerInqCallAttributes function,RPC服务器可以在客户端调用期间使用该RPC_CALL_ATTRIBUTES_V2来获取客户端的安全上下文属性和其他信息。

您必须传递Array.map()仅适用于Windows Vista和更高版本的Windows(或RPC_CALL_ATTRIBUTES_V3适用于Windows 8和更高版本),因此是这样的:

// the code depends on the minimal platform you compile for
RPC_CALL_ATTRIBUTES atts = { 0 }; // should map to RPC_CALL_ATTRIBUTES_V2 or RPC_CALL_ATTRIBUTES_V3

atts.Version = RPC_CALL_ATTRIBUTES_VERSION; // should be 2 or 3
atts.Flags = RPC_QUERY_CLIENT_PID;
RpcServerInqCallAttributes(0, &atts);
... pid is in atts.ClientPID ...

只能从RPC服务器本身调用它,因此您必须以某种方式记录所有客户端pid,并向服务器添加一些API才能列出它们。