Windows 10 NtQueryVirtualMemory不';不能在64位上工作

Windows 10 NtQueryVirtualMemory不';不能在64位上工作,windows-10,64-bit,Windows 10,64 Bit,所以我现在正在做一个项目,它使用NtQueryVirtualMemory扫描自己进程的内存区域。它在32位上工作得很好,但在64位版本中,我一直获得状态\访问\违规(0xC0000005)。这个错误意味着BaseAddress无效,但对于我使用的任何地址,我都会遇到这个错误,我不知道还有什么可以尝试。即使在我下面写的例子中,我仍然得到同样该死的无法解释的错误 #include <stdio.h> #include <Windows.h> typedef enum _ME

所以我现在正在做一个项目,它使用NtQueryVirtualMemory扫描自己进程的内存区域。它在32位上工作得很好,但在64位版本中,我一直获得状态\访问\违规(0xC0000005)。这个错误意味着BaseAddress无效,但对于我使用的任何地址,我都会遇到这个错误,我不知道还有什么可以尝试。即使在我下面写的例子中,我仍然得到同样该死的无法解释的错误

#include <stdio.h>
#include <Windows.h>

typedef enum _MEMORY_INFORMATION_CLASS {
    MemoryBasicInformation
} MEMORY_INFORMATION_CLASS, *PMEMORY_INFORMATION_CLASS;

typedef NTSTATUS(NTAPI *PNTAPI)(
    HANDLE ProcessHandle, 
    PVOID BaseAddress, 
    MEMORY_INFORMATION_CLASS MemoryInformationClass, 
    PVOID Buffer, 
    ULONG Length, 
    PULONG ResultLength
);

void main(void)
{
    PNTAPI NtQueryVirtualMemory = (PNTAPI)GetProcAddress(
        GetModuleHandle("ntdll.dll"), "NtQueryVirtualMemory");

    MEMORY_BASIC_INFORMATION Mbi = { 0 };
    NTSTATUS status = NtQueryVirtualMemory(NtCurrentProcess(), (PVOID)main, MemoryBasicInformation,
        &Mbi, sizeof(MEMORY_BASIC_INFORMATION), 0);

    printf("%.8X", status);
    getchar();
}
#包括
#包括
typedef枚举\u内存\u信息\u类{
记忆基础信息
}内存信息类,*PMEMORY信息类;
类型定义NTSTATUS(NTAPI*PNTAPI)(
句柄进程句柄,
PVOID基址,
内存\信息\类内存信息类,
PVOID缓冲区,
乌龙长度,
普隆结果长度
);
真空总管(真空)
{
PNTAPI NtQueryVirtualMemory=(PNTAPI)GetProcAddress(
GetModuleHandle(“ntdll.dll”),“NtQueryVirtualMemory”);
内存基本信息Mbi={0};
NTSTATUS status=NtQueryVirtualMemory(NtCurrentProcess(),(PVOID)main,MemoryBasicInformation,
&Mbi,sizeof(内存基本信息),0;
printf(“%.8X”,状态);
getchar();
}

我在谷歌上搜索了一些可能的原因,但什么也没找到。如果有人能解释一下这件事,我将不胜感激。操作系统是Windows 10 64位,编译器是Microsoft Visual Studio 2015。提前谢谢

好的,我解决了我的问题。我决定用一个调试器来检查到底发生了什么,我看到最后两个参数Length和ResultLength被作为32位整数推送到堆栈上,这显然是事情不起作用的原因,但这也让我想知道为什么我的程序毕竟没有进行正确的对齐?我再次检查了NtQueryVirtualMemory的定义,发现最后两个参数是size_t(64位)类型,而不是ULONG类型(32位)。现在一切都好了