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

调用VirtualQueryEx返回ERROR_BAD_LENGTH(错误24)问题排查求助

解决VirtualQueryEx返回ERROR_BAD_LENGTH(错误24)的问题

核心问题:MEMORY_BASIC_INFORMATION结构体定义错误

你的代码中MEMORY_BASIC_INFORMATION的字段与Windows API要求的标准结构不匹配,导致传递的结构体大小不符合函数预期,直接触发ERROR_BAD_LENGTH错误。

标准的MEMORY_BASIC_INFORMATION结构定义如下:

typedef struct _MEMORY_BASIC_INFORMATION {
    PVOID BaseAddress;
    PVOID AllocationBase;
    DWORD AllocationProtect;
    SIZE_T RegionSize;
    DWORD State;
    DWORD Protect;
    DWORD Type;
} MEMORY_BASIC_INFORMATION;

你当前的结构体额外添加了PartitionId和Size字段,且字段顺序错误,这会让ct.sizeof(info)计算出的长度和API要求的不一致。

修正后的代码

将结构体修正为标准定义,再调用VirtualQueryEx即可解决问题:

import ctypes as ct
from ctypes.wintypes import *

SIZE_T = ct.c_size_t
PVOID = LPVOID

class MEMORY_BASIC_INFORMATION(ct.Structure):
    _fields_ = (
        ("BaseAddress", PVOID),
        ("AllocationBase", PVOID),
        ("AllocationProtect", DWORD),
        ("RegionSize", SIZE_T),
        ("State", DWORD),
        ("Protect", DWORD),
        ("Type", DWORD),
    )

k32 = ct.WinDLL('kernel32')
VirtualQueryEx = k32.VirtualQueryEx
VirtualQueryEx.argtypes = HANDLE, LPCVOID, ct.POINTER(MEMORY_BASIC_INFORMATION), SIZE_T
VirtualQueryEx.restype = SIZE_T

# 确保proch是通过OpenProcess获取的有效句柄,且拥有PROCESS_QUERY_INFORMATION权限
info = MEMORY_BASIC_INFORMATION()
bytes_returned = VirtualQueryEx(proch, 0x1408E125, ct.byref(info), ct.sizeof(info))
if bytes_returned == 0:
    print(f"Error occurred: {k32.GetLastError()}")
else:
    print(f"返回字节数: {bytes_returned}")
    print(f"基地址: {info.BaseAddress}")
    print(f"区域大小: {info.RegionSize}")

额外注意事项

  • 确保OpenProcess调用时传入了PROCESS_QUERY_INFORMATION或PROCESS_QUERY_LIMITED_INFORMATION权限,否则也可能导致调用失败。
  • 传入的目标地址0x1408E125必须是目标进程中有效的内存地址,否则VirtualQueryEx也会返回0,但错误码可能不同。

内容的提问来源于stack exchange,提问作者Sheepposu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:40:31