我一直在努力学习如何读取进程分配的所有内存。现在我有点纠结于这个问题:
每当我执行VirtualQueryEx请求一些基本内存信息时,函数总是返回0,并且我得到Win32错误24(error_BAD_LENGTH)。据我所知,我严格遵循了教程,但似乎错误在于教程的源代码。MEMORY_BASIC_INFORMATION结构似乎有问题,但我不确定。
这是代码的精简版本:
const int PROCESS_QUERY_INFORMATION = 0x0400;
const int PROCESS_WM_READ = 0x0010;
public struct MEMORY_BASIC_INFORMATION {
public int BaseAddress;
public int AllocationBase;
public int AllocationProtect;
public int RegionSize;
public int State;
public int Protect;
public int lType;
}
IntPtr processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id);
MEMORY_BASIC_INFORMATION mem_basic_info = new MEMORY_BASIC_INFORMATION();
uint infoSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(mem_basic_info);
VirtualQueryEx(processHandle, proc_min_address, out mem_basic_info, infoSize);
有人能在这里给我指正确的方向吗?提前感谢!
这是所有相关代码的粘贴框。
64位系统的定义不一样:
typedef struct _MEMORY_BASIC_INFORMATION32 {
DWORD BaseAddress;
DWORD AllocationBase;
DWORD AllocationProtect;
DWORD RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;
typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {
ULONGLONG BaseAddress;
ULONGLONG AllocationBase;
DWORD AllocationProtect;
DWORD __alignment1;
ULONGLONG RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
DWORD __alignment2;
} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;