在 Windows(32 位和 64 位)中,通过程序 (C++) 是否可以确定某个内存位置是否已更改?我试图推断我们在 Visual Studio 中看到的概念,我们可以在其中设置数据断点。
用例:我理解这是一个肮脏的 hack,但实现起来最快,稍后会重新实现
我正在跨进程边界共享数据(在 32 位客户端和 64 位服务器之间读取)。客户端分配内存(超出我们的控制)并将地址传递给服务器。服务器分配一个存储来映射客户端内存,并通过各种代码路径可以更新该映射内存位置。不是识别和捕获这些位置中的每一个(我试图找到一条更简单的路径),而是在更改时引发事件并最终通过 WriteProcessMemory
将数据写回客户端进程
虽然结合使用 VirtualProtect
和 Windows debug interface 可能会找到解决方案,我不确定这对于这种情况是否是一个特别好的解决方案。问题之一是您在每次新写入时都引入了延迟,并且您正在考虑转移到另一个进程,该进程将程序作为“调试器”进行监视。然后,该进程将不得不“取消保护”该页面,将其标记为其他服务器(或客户端,具体取决于您要去的方向)的“已更新”,并“继续”应用程序进行更新。这是相当耗时的。当然,没有简单的方法可以知道写入过程何时完成了一系列更新。当有 SEH“__except”调用时,您还需要确切地知道从哪里“继续”,并且这并不总是完全微不足道的,特别是如果代码位于 memcpy 或类似的东西的中间。
当我处理图形时,我知道我们和一些竞争对手的驱动程序都会这样做,首先写保护内存,然后通过连接到 Windows 自己的页面错误处理程序,查找页面错误,请参阅如果是特殊区域,如果是,则将该页面标记为已更新并将其重置为可写。这允许驱动程序仅复制更新的区域。但在这种情况下,在完成所有更新后,会有一个明显的“我想画这个东西”。