MEMORY_BASIC_INFORMATION32不再合法
MEMORY_BASIC_INFORMATION32 not legal anymore?
我正在尝试使用Windows API查询内存信息。我的目标是x86和x64。所以我读了文档MEMORY_BASIC_INFORMATION,发现我需要两个不同的查询取决于目标进程的"位"。
但是当我查询x86进程并使用MEMORY_BASIC_INFORMATION32结构我得到系统错误码24。哪个表示命令的长度
但是当我使用MEMORY_BASIC_INFORMATION64版本时,调用对x86和x64进程都有效。这是怎么回事?这不是我所理解的文档告诉我的。https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775 (v = vs.85) . aspx
那么这个行为在不同版本之间是可移植的吗?有人能解释这种行为吗?还是我的系统完全出了问题?
这是我使用的代码:
class Process {
HANDLE m_handle;
bool Process::query_impl(RemotePointer address, void *info, size_t size) {
return VirtualQueryEx(m_handle, address.get(), (MEMORY_BASIC_INFORMATION*) info, size);
}
public:
bool Process::query(RemotePointer address, MEMORY_BASIC_INFORMATION64 &info) {
return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION64));
}
bool Process::query(RemotePointer address, MEMORY_BASIC_INFORMATION32 &info) {
return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION32));
}
}
与具有冲突位的进程的内存交互代表了许多Windows API函数的问题,包括这个函数。VirtualQueryEx()在x86下编译时需要一个4字节的指针,但是如果你试图在x86程序的x64进程中使用它,你不能给它一个8字节的指针。
即使你让它以某种方式工作,你也只能查询底部的4GB内存
出于这个原因,最好的方法是为每个位编译单独的二进制文件,并且只使用MEMORY_BASIC_INFORMATION,以便它使用宏自行解析。
相关文章:
- 更新后的Android Studio现在需要Clang,不再链接到GCC的库
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 编译器现在遵循C++14标准,我的项目不再编译神秘的SFML错误
- 不再支持Android NDK APP_STL gnustl_shared
- Visual Studio 2019:使用 vcvars64 从命令行构建C++.bat不再工作
- 如果我从流中提取某些内容,该流是否不再包含我提取的内容?
- QObjects 被移动到 QThreads 后信号不再工作
- WinAPI 窗口在使用 PrintWindow 截屏后不再更新
- Cuda 中的多个 GPU - 以前可以使用代码,但现在不再使用
- Dev c++ mingw 不再编译
- std::cin 在读取 EOF 并清除后不再读取
- 将静态 IP 分配给我的 ESP32 服务器后不再响应
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- Windows 函数 "NetUserChangePassword" 在 Windows 10 下不再工作(在 Windows 7 下工作)
- Visual Studio在创建类时不再生成构造函数/解构器
- 不再使用 QT OpenGL?
- 我正在调试这个C++程序.编译器不再显示语法错误,但存在隐藏的逻辑错误
- 为什么"cin"在EOF之后不再wοrk?
- v8 不再支持 v8::Value::ToNumber 了吗?