c++ - 确定内存位置是否更改值

标签 c++ windows visual-c++

<分区>

在 Windows(32 位和 64 位)中,通过程序 (C++) 是否可以确定某个内存位置是否已更改?我试图推断我们在 Visual Studio 中看到的概念,我们可以在其中设置数据断点。

用例:我理解这是一个肮脏的 hack,但实现起来最快,稍后会重新实现

我正在跨进程边界共享数据(在 32 位客户端和 64 位服务器之间读取)。客户端分配内存(超出我们的控制)并将地址传递给服务器。服务器分配一个存储来映射客户端内存,并通过各种代码路径可以更新该映射内存位置。不是识别和捕获这些位置中的每一个(我试图找到一条更简单的路径),而是在更改时引发事件并最终通过 WriteProcessMemory 将数据写回客户端进程

最佳答案

虽然结合使用 VirtualProtectWindows debug interface 可能会找到解决方案,我不确定这对于这种情况是否是一个特别好的解决方案。问题之一是您在每次新写入时都引入了延迟,并且您正在考虑转移到另一个进程,该进程将程序作为“调试器”进行监视。然后,该进程将不得不“取消保护”该页面,将其标记为其他服务器(或客户端,具体取决于您要去的方向)的“已更新”,并“继续”应用程序进行更新。这是相当耗时的。当然,没有简单的方法可以知道写入过程何时完成了一系列更新。当有 SEH“__except”调用时,您还需要确切地知道从哪里“继续”,并且这并不总是完全微不足道的,特别是如果代码位于 memcpy 或类似的东西的中间。

当我处理图形时,我知道我们和一些竞争对手的驱动程序都会这样做,首先写保护内存,然后通过连接到 Windows 自己的页面错误处理程序,查找页面错误,请参阅如果是特殊区域,如果是,则将该页面标记为已更新并将其重置为可写。这允许驱动程序仅复制更新的区域。但在这种情况下,在完成所有更新后,会有一个明显的“我想画这个东西”。

关于c++ - 确定内存位置是否更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18703857/

相关文章:

c++ - 获得适用于 C++ 的正确编译器

c++ - 类型转换的原理是什么?

c++ - 仅阻止继承类的一个函数

c# - 从 C++/Java/C# 代码调用 C 方法?

c++ - 将静态库(.lib 文件)捆绑到 dll 中

windows - 如何自动更改文件内容?

c++ - Windows EXE/DLL : what is a "packed image"

c++ - 从串口读取数据时出错

windows - 在 Windows 上读取 hid 鼠标/键盘 (hidapi)

c++ - char* 加倍并再次返回 char*(64 位应用程序)