枚举内存范围内的页面
Enumerate the pages in a memory range
我在Visual Studio 2012下的Windows上使用C++。
我有一个开始和结束内存地址,需要在这两个地址之间生成一个页面基址/句柄列表。我考虑过手动探查页面的可能性,但认为一定有更好的方法来枚举它们。
这样的方式存在吗?
免责声明最后一个页面句柄必须是基地址,这样当窗口页面的大小添加到它们时,得到的地址不会重叠到下一个页面中。优选的解决方案将不是特定于平台的,并且与具有/不具有WOW64的32位兼容。
VirtualQuery
几乎是您唯一的选择。它应该相当高效:
函数确定区域中第一个页面的属性然后扫描后续页面,直到扫描页,或者直到遇到一个包含不匹配的属性。
所以你可以从你关心的范围的开头开始调用它,然后你会得到一大块页面。下一个调用将在该块之后立即开始,然后是下一个,依此类推
下面是一个完全未经测试的函数,它将填充一个MEMORY_BASIC_INFORMATION
结构数组:
int EnumVirtualAllocations(const void* ptr, size_t length, MEMORY_BASIC_INFORMATION* info, int size)
{
const void* end = (const void*)((const char*)ptr + length);
int index = 0;
while (index < size && ptr < end &&
VirtualQuery(ptr, &info[index], sizeof(*info)) == sizeof(*info))
{
MEMORY_BASIC_INFORMATION* i = &info[index];
if (i->State != MEM_FREE) index++;
ptr = (const void*)((const char*)(i->BaseAddress) + i->RegionSize);
}
return index;
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- 为什么我在具有 16 GB 内存的 Mac 上看到数 TB 范围内的 C++ 指针
- 我是否要删除函数范围内的内存?
- 错误:“内存集”未在此范围内声明
- 使用小于O(N^2)的内存,在i-j范围内找到小于O(j-i)的最小值
- 在适当的范围内使用动态内存
- 枚举内存范围内的页面