【问题标题】:NtQueryVirtualMemory doesn't work on 64-bitsNtQueryVirtualMemory 不适用于 64 位
【发布时间】:2021-03-20 00:07:27
【问题描述】:

所以我现在正在研究一个使用 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。提前致谢!

【问题讨论】:

    标签: windows-10 64-bit


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多