我试图在 Windows 应用程序中加载的 DLL 中的某个内存范围内分配一定数量的内存。
我这样做的方式是使用VirtualQuery()
搜索标记为空闲并且在我需要进行分配的边界内的内存区域。我所看到的是,即使该区域被标记为MEM_FREE
VirtualAlloc()
有时无法分配内存。
代码非常接近以下内容:
LPVOID address = NULL, mem = NULL;
for (address = LOWER_RANGE; address < UPPER_RANGE;) {
MEMORY_BASIC_INFORMATION mbi = {0};
if (VirtualQuery(address, &mbi, sizeof(mbi))) {
if (mbi.State == MEM_FREE && mbi.RegionSize >= ALLOC_SIZE) {
mem = VirtualAlloc(address, ALLOC_SIZE,
MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READ);
if (mem) {
break;
}
}
}
address = mbi.BaseAddress + mbi.RegionSize;
}
VirtualAlloc()
失败时GetLastError()
返回ERROR_INVALID_ADDRESS
(487).
我解决它的方法是,如果它足够大,则mbi.RegionSize
使用页面大小步骤扫描以找到一个地址,该地址将允许我分配我需要的内存。
为什么根据VirtualQuery
整个区域应该是免费的,我应该能够在我想要的任何地址内分配,但通常当第一次VirtualAlloc
失败时,我必须循环几个步骤,直到它最终成功。