使用QueryVirtualMemoryInformation失败(错误码24)的原因及解决咨询
错误原因及解决方法
错误码24对应ERROR_BAD_LENGTH,表示命令长度参数无效,结合你的代码和Windows 11环境,常见原因及修复方案如下:
1. 进程位数不匹配(32位程序访问64位进程)
如果你的程序是32位编译版本,而目标进程是64位,调用QueryVirtualMemoryInformation时会因内存地址宽度、结构大小不匹配触发长度错误。32位程序的指针宽度为4字节,64位进程的内存地址为8字节,结构尺寸计算差异会导致传递的长度参数无效。
解决方法:
将你的程序编译为64位版本,确保与目标进程的位数完全一致。
2. 结构定义或头文件问题
若代码未正确包含winnt.h头文件,WIN32_MEMORY_REGION_INFORMATION的结构定义会缺失或错误,导致sizeof(WIN32_MEMORY_REGION_INFORMATION)计算出错误的长度值,触发ERROR_BAD_LENGTH。
解决方法:
- 确保代码开头包含正确的头文件:
#include <winnt.h> - 检查编译环境的结构大小计算,Windows 11中该结构的定义未变更,64位环境下结构总大小为36字节,32位环境下为32字节。
3. 权限参数过度且可能无效
你使用PROCESS_ALL_ACCESS打开进程,该权限包含大量敏感权限,在UAC限制下可能无法获取有效句柄(虽此时错误码通常为ERROR_INVALID_HANDLE,但仍需排除权限间接影响)。QueryVirtualMemoryInformation仅需PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限。
解决方法:
替换OpenProcess的权限参数为最小必要权限:
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, 32440); if (hProcess == NULL) { printf("OpenProcess failed: %d\n", GetLastError()); return; }
4. 缓冲区长度验证流程缺失
虽然WIN32_MEMORY_REGION_INFORMATION是固定大小结构,但部分场景下可通过预调用获取所需长度来避免长度错误:
修改代码示例:
ULONG_PTR requiredLength = 0; // 预调用获取所需缓冲区长度 QueryVirtualMemoryInformation(hProcess, 0x6d0000, MemoryRegionInfo, NULL, 0, &requiredLength); // 分配对应大小的缓冲区 PWIN32_MEMORY_REGION_INFORMATION pMemInfo = (PWIN32_MEMORY_REGION_INFORMATION)malloc(requiredLength); if (pMemInfo) { BOOL ret = QueryVirtualMemoryInformation(hProcess, 0x6d0000, MemoryRegionInfo, pMemInfo, requiredLength, &requiredLength); if (!ret) { printf("Error: %d\n", GetLastError()); } else { // 处理内存区域信息 } free(pMemInfo); } CloseHandle(hProcess);
内容的提问来源于stack exchange,提问作者sbsbsbsb
相关产品推荐
相关产品推荐

