带有PROCESS_QUERY_INFORMATION的VirtualQueryEx给出错误24



我一直在努力学习如何读取进程分配的所有内存。现在我有点纠结于这个问题:

每当我执行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;

相关内容

最新更新