NtQueryVirtualMemory 在 64 位上不起作用



所以我现在正在做一个项目,该项目使用NtQueryVirtualMemory扫描自己进程的内存区域。它在32位上运行得很好,但我一直在64位版本中获得STATUS_ACCESS_VIOLATION(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();
}

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

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

最新更新