在COM RPC模型中,如果服务器在单独的进程上运行,是否可以知道与服务器通信的客户端进程的进程ID?
用例
我有一个Out process RPC Server,它可以接收来自一个或多个客户端进程的请求。有时,服务器需要知道客户机进程,以便使用写入进程存储器将数据写回客户端地址空间。
还请注意,API签名、缓冲区的分配方式和API的调用方式超出了我的控制范围。
发布于 2022-09-10 00:08:03
我知道我已经晚了将近9年了,但我只是在回答这个问题,以防将来有人需要它。
所以有办法做到这一点..。但是通过一个私有/无文档的COM接口,即ICallingProcessInfo
接口定义:
MIDL_INTERFACE("68C6A1B9-DE39-42C3-8D28-BF40A5126541")
ICallingProcessInfo : public IUnknown
{
public:
virtual STDMETHOD(OpenCallerProcessHandle)(DWORD dwDesiredAccess, HANDLE* handle) = 0;
};
用法:
HANDLE handle;
ComPtr<ICallingProcessInfo> callingProcessInfo; // ComPtr is from WRL, you can use the interface directly instead
CoGetCallContext(__uuidof(ICallingProcessInfo), (void**)callingProcessInfo.GetAddressOf());
callingProcessInfo->OpenCallerProcessHandle(PROCESS_QUERY_LIMITED_INFORMATION, &handle);
auto pid = GetProcessId(handle);
我在WinRT OOP服务器上测试了这一点,但是由于WinRT服务器只是COM服务器,所以它也应该与普通COM服务器一起工作
https://stackoverflow.com/questions/18770684
复制相似问题