VirtualAlloc2 с MemExtendedParameterAddressRequirements всегда выдает ERROR_INVALID_PARAMETER - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь использовать 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,
    &param, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...