EventPipe – 一种使用事件对象在进程之间传输二进制数据的 IPC 方法

原文链接:https://www.x86matthew.com/view_post?id=eventpipe

这篇文章展示了我为隐蔽的进程间通信提出的一个想法。

当系统上的两个进程需要相互通信时,它们通常会使用命名管道或共享内存等常用方法。然而,这些都相当容易检测和监控——我决定想出一种使用 Windows 事件对象的新方法。

事件句柄只有两种状态——开和关。它们通常用于一般的多线程同步,通常不需要任何进一步的调查。

我的基本理论如下: 1. 使用CreateEvent

在接收程序中创建 256 个事件对象。2.在接收程序中对上述所有事件句柄 调用WaitForMultipleObjects 。

3. 发送方程序使用OpenEvent打开接收方程序创建的所有 256 个事件对象。
4、在发送方程序中调用SetEvent,触发每个字节发送的对应事件(0-255)。

上面的理论有几个问题。正如大多数 Windows 开发人员已经知道的那样,WaitForMultipleObjects函数最多只允许 64 个句柄。另一个问题是同步——我们需要知道最初触发事件的确切顺序。

要解决上述问题,需要进行以下更改:

1. 我们不使用 256 个事件对象(每个字节一个),而是将每个字节分成两个事件——我们将在 base-16 中称其为“高”和“低”。例如,当发送 0x95 时,我们会触发 0x9“高”事件和 0x5“低”事件。这意味着我们只需要在任何时候使用WaitForMultipleObjects等待 16 个事件句柄,而不是全部 256 个。作为副作用,这也意味着事件对象的总数减少到 32 个(16 高 + 16 低) .
2. 为了解决同步问题,我们将创建一个称为“确认”标志的额外事件句柄。处理完每个字节后,将在接收程序中触发此事件。发送方程序只会在确认标志设置后发送下一个字节。

我创建了一个函数库来演示这个概念:

接收程序:

发件人程序:

潜在的未来改进:

– 目前只有单向通信 – 添加双工支持。
– 事件对象的命名允许我们在远程进程中打开句柄 – 使它们“匿名”并将句柄复制到远程进程中。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部