调用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
相关产品推荐
相关产品推荐

