具有MemExtendedParameterAddressRequirements的VirtualAlloc2始终会产生ERROR_INVALID_PARAMETER

时间:2019-01-16 18:40:05

标签: winapi

我正在尝试将VirtualAlloc2MemExtendedParameterAddressRequirements一起使用,以将内存分配给地址空间的特定区域。这是我第一次使用此新API,但我一直无法使其成功。它总是返回nullptr,而GetLastErrorERROR_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

0 个答案:

没有答案