C++ DLL(本地挂钩)和 C# 应用程序之间的合适 IPC

Posted

技术标签:

【中文标题】C++ DLL(本地挂钩)和 C# 应用程序之间的合适 IPC【英文标题】:Suitable IPC between a C++ DLL (local hooks) and C# application 【发布时间】:2021-03-05 21:17:35 【问题描述】:

对于注入第三方进程和 C# 应用程序的 C++ DLL,最好的进程间通信是什么?这是目前的情况:

// This gets executed within the target process memory region
LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)

    if (code > 0)
    
        auto csharpApplicationFunctionPointerAddress = 0xdeadbeef;
        auto csharpApplicationFunctionResult = call csharp function with N parameters here

        // Do something with the result
        if (csharpApplicationFunctionResult == "foo")
        
            
        
    

    return CallNextHookEx(hookInstance, code, wParam, lParam);

我遇到了this 并发现我需要一个 RPC,但是我似乎无法找到最适合这个问题的 RPC,因为该通信需要传递 N 个参数并将结果返回为尽可能快。

注意事项:

    因为我不想处理超时,所以不考虑套接字 命名管道可以在这里工作还是只适用于字符串消息?(不考虑序列化/反序列化) 我不想对远程线程使用消息轮询,因为这会占用太多 CPU

还有什么选择吗?请随时纠正我上面的注释。

【问题讨论】:

在Windows上的IPC基本表现为:套接字、命名管道、共享内存和消息队列。所以,看起来你唯一的选择是共享内存。 WM_COPYDATA 非常简单,如果你在接收端有一个消息队列docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata 下一个最简单的是UDP(没有超时) 还有其他形式的 IPC 可用 - 邮槽、RPC、ActiveX/COM、DDE 等。但即使您要使用套接字或管道,也不必轮询入站消息,您可以让操作系统通过重叠 I/O 或 I/O 完成端口通知您新消息。老实说,我只会使用窗口消息,它们非常简单并且不会消耗很多开销,尽管 OP 声称相反。 【参考方案1】:

我最终创建了一个 invisible dummy window,作为通过来自 DLL 的 SendMessage 调用接收消息的中心点。

【讨论】:

以上是关于C++ DLL(本地挂钩)和 C# 应用程序之间的合适 IPC的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ DLL 和 C# 类之间来回传递变量

在非托管 C++ DLL 和托管 C# UI 之间发送信息

C++ DLL 和 C# Unity 之间的集成

使用 EasyHook (c#) 从 ntdll.dll 挂钩 NtCreateFile API

本地键盘挂钩终止目标进程

使用 KeyboardProc / SetWindowsHookEx 从注入的 DLL 中挂钩键盘