所有结构上的奇怪内存位移
Weird memory displacement on all structures
我已经为此工作了几个月,我和我的团队都无法解决这个问题,我感到非常生气:/
情况是这样的 - 我正在管理另一个程序的内存,特别是读取结构。当读取简单的东西(如整数)时,它可以正常工作。读取结构时,我需要将读取位置移回 4 个字节,否则我最终会在错误的位置读取并且存储的值不正确。
下面是一个示例:
ReadProcessMemory( hProcess, lpBaseAddress, &xBuffer, sizeof( xBuffer ), nullptr );
只要 xBuffer 不是类或结构,就可以正常工作。假设 xBuffer 被声明为vector_t的对象 - 这是我读取工作的唯一方式:
class vector_t
{
public:
float x, y, z;
};
vector_t xBuffer;
ReadProcessMemory( hProcess, lpBaseAddress - 0x4, &xBuffer, sizeof( xBuffer ), nullptr );
我知道这段代码不是 MCRE/可重现的,因为我尝试复制我的代码片段并且它工作正常,但这就是正在发生的一切,我不知道还有什么可能导致这种情况。
获取类的大小,它返回所有成员的大小 +0x4,而它应该是 +0x1,对吧?也许这有帮助?
编辑:经过进一步调试,我发现问题出在原子上。为什么?
#include <Windows>
#include <atomic>
class vector_t
{
public:
float x, y, z;
};
/* ... */
std::atomic< DWORD > dwBaseAddress { };
/* ... */
std::atomic< vector_t > vecBuffer { };
// unless we subtract 4 bytes from lpBaseAddress._My_val, we will not read properly
ReadProcessMemory( hProcess, LPVOID( lpBaseAddress._My_val ), &vecBuffer, sizeof( vector_t ), nullptr );
当我制作vecBuffer的副本(不是原子的)时,它可以正常工作。我该怎么做才能确保这种情况不会发生?
复制原子变量,然后将其复制到工作上。
不过,我很想知道它背后的原因,所以我把这个问题留给大家,以防有人知道。我想只有 WinAPI 函数的开发人员ReadProcessMemory
知道,因为我们实际上看不到代码。
无论什么:/
相关文章:
- 如何在C++类内存结构中创建"spacer"?
- C++在变量的内存地址上做什么来"deallocate"它?
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 未使用的 asm() 在不受支持的体系结构上的行为
- 复制引用结构上的赋值
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- C 嵌套结构上的 g++ 编译错误
- 结构上溢出的整数加法
- 在通过 P/Invoke 获取的 C++ 结构上设置 C# 回调
- 在包含浮点数的结构上使用 memset()
- 为什么我只能在 4 GB 的虚拟内存空间上分配 2 GB?
- C++ 友元函数在内存位置上有何不同?
- 特定内存地址上的分段错误
- 在模板化数据结构上调用 begin() 或 end()
- 在现有数据结构上使用BGL算法需要什么(边和顶点作为矢量<对象*>)?
- boost :: Spirit :: Karma语法:逗号从结构上划定了带有选件属性的输出
- 所有结构上的奇怪内存位移
- 结构上的内存分配和复制构造函数
- NUMA体系结构上大(8MB)内存区域的可扩展分配
- x86 体系结构上的内存排序限制