您能否确定哪些进程在外部使用ncalrpc RPC端点?

问题描述 投票:0回答:1

当我们的开发人员在将新构建并运行的服务器进程附加到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似乎表明,首先避免这个问题可以通过一种称为关联的东西来实现,但对于如何做到这一点却有点模糊。

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

Update:

接受的答案表明外部过程无法做到这一点;它不是通过外部流程实现此目标的方法。

debugging rpc visual-studio-debugging endpoint c++-winrt
1个回答
1
投票

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

您必须传递仅适用于Windows Vista和更高版本Windows版本的RPC_CALL_ATTRIBUTES_V2(或者适用于Windows 8及更高版本的RPC_CALL_ATTRIBUTES_V3),如下所示:

// 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以便能够列出它们。

© www.soinside.com 2019 - 2024. All rights reserved.