【问题标题】:how to get the region size that is reserved in the initial allocation call to VirtualAlloc如何获取在对 VirtualAlloc 的初始分配调用中保留的区域大小
【发布时间】:2013-02-10 11:40:03
【问题描述】:

在 VirtualFree 的 msdn 文档中

BOOL WINAPI VirtualFree(
  _In_  LPVOID lpAddress,
  _In_  SIZE_T dwSize,
  _In_  DWORD dwFreeType
);

dwSize [in] 要释放的内存区域的大小,以字节为单位。

如果 dwFreeType 参数为 MEM_RELEASE,则此参数必须为 0(零)。该函数释放在对 VirtualAlloc 的初始分配调用中保留的整个区域。

好像系统可以通过地址得到整个区域的大小

我的问题是: 我该怎么做(通过地址获得整个区域大小)

PS : VirtualQuery API 无法做到这一点

void* p = VirtualAlloc(null, static_cast<SIZE_T>(_K * 128), MEM_RESERVE, PAGE_NOACCESS);
p = VirtualAlloc(p, _K * 64, MEM_COMMIT, PAGE_READWRITE);
MEMORY_BASIC_INFORMATION im;
VirtualQuery(p, &im, sizeof(im));

im.RegionSize 是 MEM_COMMIT 的大小,而不是第一次调用 VirtualAlloc 的整个区域大小

【问题讨论】:

  • 这听起来像是一个 XY 问题,所以我想知道您是否可以稍微扩展一下您实际想要实现的目标?

标签: c++ windows


【解决方案1】:

MEMORY_BASIC_INFORMATION:

AllocationBase 指向一系列页面的基地址的指针 由 VirtualAlloc 函数分配。指向的页面 BaseAddress 成员包含在此分配范围内。

继续查询,直到你掉出边缘:

void* p = VirtualAlloc(NULL, static_cast<SIZE_T>(_K * 128), MEM_RESERVE, PAGE_NOACCESS);
void* p2 = VirtualAlloc(p, _K * 64, MEM_COMMIT, PAGE_READWRITE);
MEMORY_BASIC_INFORMATION im;
VirtualQuery(p2, &im, sizeof(im));
while (im.AllocationBase == p)
{
    p2 = (unsigned char *)p2 + im.RegionSize;
    VirtualQuery(p2, &im, sizeof(im));
}

【讨论】:

    【解决方案2】:

    这是您必须跟踪自己的信息。

    保留地址空间就是这样做的——它保留地址。没有关于该空间有多大的概念,因为您可以保留两个碰巧彼此相邻的块,然后跨两个保留空间提交一个块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-24
      • 2013-07-18
      • 2011-08-30
      • 2019-01-20
      • 2013-11-30
      • 1970-01-01
      • 2011-02-26
      • 2014-07-14
      相关资源
      最近更新 更多