【问题标题】:Difference between QueryVirtualMemoryInformation and VirtualQueryExQueryVirtualMemoryInformation 和 VirtualQueryEx 之间的区别
【发布时间】:2022-12-18 23:18:30
【问题描述】:

在寻找查询有关 Windows 中一系列页面的特定信息的方法时,我遇到了两种常用的解决方案。然而,这两种选择似乎返回重叠信息。

虚拟查询Ex

MSDN 上我们看到它使用参数 hProcesslpAddresslpBufferdwLength 来查询该页面范围的信息。它返回 this 结构,它告诉我们一些关于页面状态、保护和类型的信息。哦,这样查询页面信息是个不错的选择吧?但是等等还有更多!

查询虚拟内存信息

也可以在MSDN 上找到并且确实几乎同样的事情。不同之处在于它使用DUMMYSTRUCTNAME 并返回一个与 VirtualQueryEx 返回的结构完全重叠的内存结构。

看起来这可能是一种疏忽,使用哪个并不重要。也许 MS 自己甚至不知道为什么在一个操作系统中有两个重叠的变体。但是对于确实知道的人来说:这里有什么区别?

【问题讨论】:

  • 您是否注意到第一个是旧的,自 Windows XP 以来就存在,而第二个是较新的,自 Windows 10 以来就存在?
  • QueryVirtualMemoryInformation 是一个新的 API 并且是可扩展的:可以添加新的 MemoryInformationClass 类型以在将来返回更多/附加数据而不会破坏合同。
  • 一旦只有 VirtualQuery(),他们就会对其进行扩展,这样您就可以使用 VirtualQueryEx() 在另一个进程中四处寻找。然后他们扩展了它,他们可以称它为 VirtualQueryExEx()。 the NLS team中常见的一种做法。但他们没有,前缀“查询”似乎是新方法。使用您需要的那个。

标签: c++ windows winapi msdn


【解决方案1】:

VirtualQueryVirtualQueryEx 一直存在 (NT v3.51)。

QueryVirtualMemoryInformation 更新很多 (10 1607) 并添加了在 NT API 中常见的信息类参数。这允许将来扩展。目前只有一个记录的类值,返回的信息与 VirtualQueryEx 非常相似,但不完全相同(BaseAddressCommitSize 等)。

DUMMYSTRUCTNAME 是与没有名称的成员相关的编译器事物,与返回的实际数据无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    • 2011-02-18
    • 2019-12-21
    相关资源
    最近更新 更多