1

我创建了一个具有预定义协议的 SSH 代理(类似于 PuTTY 的 pageant.exe):身份验证请求通过包含文件映射名称的 WM_COPYDATA 发送到代理窗口:

// mapname is supplied via WM_COPYDATA
HANDLE filemap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapname);

是否可以找出哪个进程(最终是进程名称)创建了特定的文件映射?

我可以在“filemap”上使用 GetSecurityInfo 来获取安全属性(SID、GID、...),但是如何获取进程本身呢?

重要说明:无法更改协议(例如,将有关发送者的信息添加到 WM_COPYDATA),因为这是所有类似 PuTTY 的应用程序使用的预定义协议!

4

1 回答 1

1

不要试图通过文件句柄查找进程,您需要枚举进程以查找每个进程的打开句柄,这很复杂。该WM_COPYDATA消息向您发送发件人窗口的句柄,呼叫GetWindowThreadProcessId应该会给您答案。

请记住,这WM_COPYDATA是在 32 位和 64 位进程之间进行通信的一种方式,因此您的进程可能与调用者位于不同的空间中。

编辑-->
您在 WM_COPYDATA 中收到发送者 HWND,您只需使用该 HWND 来获取进程 ID

switch (uiMsg)
{
case WM_COPYDATA:
    {
        DWORD theProcessID;
        GetWindowThreadProcessId((HWND) wParam, &theProcessID);
        COPYDATASTRUCT *pMyCDS = (PCOPYDATASTRUCT) lParam;
        /*...*/
    }
    /*...*/
}
于 2013-11-30T15:58:42.563 回答