Я пытаюсь использовать VirtualAlloc2
с MemExtendedParameterAddressRequirements
для выделения памяти для определенных областей адресного пространства. Я впервые использую этот новый API, но мне так и не удалось добиться успеха. Он всегда возвращает nullptr
и GetLastError
равно ERROR_INVALID_PARAMETER
.
Вот минимальный пример, который почти идентичен примеру MSDN
#include <Windows.h>
void*
AllocateAlignedBelow2GB(size_t size, size_t alignment)
{
MEM_ADDRESS_REQUIREMENTS addressReqs = { 0 };
MEM_EXTENDED_PARAMETER param = { 0 };
addressReqs.Alignment = alignment;
addressReqs.HighestEndingAddress = (PVOID)(ULONG_PTR)0x7fffffff;
param.Type = MemExtendedParameterAddressRequirements;
param.Pointer = &addressReqs;
auto pVirtualAlloc2 =
(decltype(&::VirtualAlloc2))GetProcAddress(GetModuleHandle(L"kernelbase"),
"VirtualAlloc2");
return pVirtualAlloc2(
nullptr, nullptr,
size,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE,
¶m, 1);
}
int main()
{
void* p = AllocateAlignedBelow2GB(1024, 1024);
// p is now nullptr
// GetLastError() is ERROR_INVALID_PARAMETER
// Same behavior on 32-bit or 64-bit
return 0;
}
Просто пытаясь заставить этот вызов вообще преуспеть, я пробовал несколько вещей:
- Различные размеры выделения
- Различные выравнивания (от 1 до гранулярности распределения системы)
- Использование реального дескриптора процесса с
PROCESS_ALL_ACCESS
- Указание различных адресных границ в
addressReqs
Windows SDK версии 10.0.17763.0, KERNELBASE.dll - версия 10.0.17134.441