ncalrpc协议RPC回调中获取客户端PID的技术疑问
关于RPC_CALL_ATTRIBUTES_V2中ClientProcess的说明及使用要点
首先直接明确你的核心疑问:
- RPC_CALL_ATTRIBUTES_V2结构体里的
ClientProcess成员是一个已打开的进程句柄,不是指向存储PID的DWORD的指针。你需要通过GetProcessId()API传入这个句柄,才能获取到客户端的PID值。 - 这个进程句柄的所有权归调用
RpcServerInqCallAttributes的你所有,所以必须由你手动调用CloseHandle()来关闭它,避免系统句柄泄漏。不需要释放任何DWORD的内存——因为PID是GetProcessId()直接返回的栈上DWORD值,不存在动态分配的内存需要清理。
实用代码示例
RPC_CALL_ATTRIBUTES_V2 callAttrs = {0}; // 必须正确初始化版本和结构体大小,否则API调用会失败 callAttrs.Version = RPC_CALL_ATTRIBUTES_VERSION_2; callAttrs.Size = sizeof(RPC_CALL_ATTRIBUTES_V2); RPC_STATUS status = RpcServerInqCallAttributes(NULL, &callAttrs); if (status == RPC_S_OK) { // 从进程句柄提取客户端PID DWORD clientPid = GetProcessId(callAttrs.ClientProcess); // 这里可以对clientPid做业务逻辑处理 // 务必关闭句柄,否则会造成句柄泄漏 CloseHandle(callAttrs.ClientProcess); } else { // 处理API调用失败的场景,比如打印错误码或日志 }
额外注意细节
- 这个返回的进程句柄默认拥有
PROCESS_QUERY_LIMITED_INFORMATION权限,完全足够用来调用GetProcessId(),不需要额外申请更高权限。 - 只有在
RpcServerInqCallAttributes调用成功(返回RPC_S_OK)的情况下,ClientProcess字段才是有效的句柄,失败时不要尝试关闭它。
内容的提问来源于stack exchange,提问作者user738471
相关产品推荐
相关产品推荐

