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
失敗すると、最終的に成功するまでいくつかのステップをループする必要があるのはなぜですか。