c++ - 如何获取在对 VirtualAlloc 的初始分配调用中保留的区域大小

标签 c++ windows

在 VirtualFree 的 msdn 文档中

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

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

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

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

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

PS:VirtualQuery API 不能那样做

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

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

最佳答案

MEMORY_BASIC_INFORMATION :

AllocationBase A pointer to the base address of a range of pages allocated by the VirtualAlloc function. The page pointed to by the BaseAddress member is contained within this allocation range.

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

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));
}

关于c++ - 如何获取在对 VirtualAlloc 的初始分配调用中保留的区域大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15065097/

相关文章:

c++ - 如何编译和运行在 Windows 10 上使用 libev 的示例程序

c++ - 将无符号的int地址视为指针,并将其解引用为字节数组

c++ - FBXSDK,使用四元数设置旋转键?

c++ - 如何在普通用户环境中以编程方式隐藏 Windows 8 上的任务栏?

c++ - 使用 Windows API 获取键盘输入的更好方法?

mysql - 如何使用 CSV 存储引擎配置 MySQL?

windows - 使用 Windows 线程时,我可以指定一个用于线程堆栈的缓冲区,类似于 pthread_attr_setstack() 吗?

C++11 std::promise 从线程返回 std::string,数据指针看起来已复制未移动

c++ - qt中如何改变Qmenubar项的悬停效果颜色?

c++ - 声明用于比较的函数对象?