You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:30:14