Поделиться через


Функция VirtualAllocFromApp (memoryapi.h)

Резервирует, фиксирует или изменяет состояние региона страниц в виртуальном адресном пространстве вызывающего процесса. Память, выделенная этой функцией, автоматически инициализирована до нуля.

Синтаксис

PVOID VirtualAllocFromApp(
  [in, optional] PVOID  BaseAddress,
  [in]           SIZE_T Size,
  [in]           ULONG  AllocationType,
  [in]           ULONG  Protection
);

Параметры

[in, optional] BaseAddress

Начальный адрес региона для выделения. Если память зарезервирована, указанный адрес округляется до ближайшего числа детализации выделения. Если память уже зарезервирована и фиксируется, адрес округляется до следующей границы страницы. Чтобы определить размер страницы и степень детализации выделения на хост-компьютере, используйте функцию GetSystemInfo. Если этот параметр null, система определяет, где выделить регион.

[in] Size

Размер региона в байтах. Если параметр baseAddress NULL, это значение округляется до следующей границы страницы. В противном случае выделенные страницы включают все страницы, содержащие один или несколько байтов в диапазоне от BaseAddress до BaseAddress+Size. Это означает, что 2-байтовый диапазон границы страницы приводит к включению обеих страниц в выделенный регион.

[in] AllocationType

Тип выделения памяти. Этот параметр должен содержать одно из следующих значений.

Ценность Значение
MEM_COMMIT
0x00001000
Выделяет расходы на память (от общего размера памяти и файлов разбиения по страницам на диске) для указанных зарезервированных страниц памяти. Функция также гарантирует, что, когда вызывающий объект позже обращается к памяти, содержимое будет равно нулю. Фактические физические страницы не выделяются, если только не будут доступны виртуальные адреса.

Чтобы зарезервировать и зафиксировать страницы на одном шаге, вызовите VirtualAllocFromApp с MEM_COMMIT | MEM_RESERVE.

Попытка зафиксировать определенный диапазон адресов путем указания MEM_COMMIT без MEM_RESERVE и неNULLBaseAddress, если только весь диапазон уже не зарезервирован. Полученный код ошибки ERROR_INVALID_ADDRESS.

Попытка зафиксировать страницу, которая уже зафиксирована, не приводит к сбою функции. Это означает, что страницы можно зафиксировать, не определяя текущее состояние обязательств каждой страницы.

MEM_RESERVE
0x00002000
Резервирует диапазон виртуального адресного пространства процесса без выделения фактического физического хранилища в памяти или в файле разбиения на диск.

Зарезервированные страницы можно зафиксировать в последующих вызовах функции VirtualAllocFromApp. Чтобы зарезервировать и зафиксировать страницы на одном шаге, вызовите VirtualAllocFromApp с MEM_COMMIT | MEM_RESERVE.

Другие функции выделения памяти, такие как malloc и LocalAlloc, не могут использовать зарезервированный диапазон памяти, пока он не будет освобожден.

MEM_RESET
0x00080000
Указывает, что данные в диапазоне памяти, заданном BaseAddress и Size больше не являются интересом. Страницы не должны быть считываются или записываются в файл разбиения на страницы. Однако блок памяти будет использоваться снова позже, поэтому его не следует выводить. Это значение нельзя использовать с любым другим значением.

Использование этого значения не гарантирует, что диапазон, на котором работает MEM_RESET, будет содержать нули. Если вы хотите, чтобы диапазон содержал нули, удалите память, а затем снова зафиксируете его.

При указании MEM_RESETфункция VirtualAllocFromApp игнорирует значение Protection. Однако для защиты необходимо задать допустимое значение защиты, например PAGE_NOACCESS.

VirtualAllocFromApp возвращает ошибку, если используется MEM_RESET, а диапазон памяти сопоставляется с файлом. Общее представление допускается только в том случае, если оно сопоставлено с файлом разбиения на страницы.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO следует вызывать только в диапазоне адресов, к которому MEM_RESET успешно применено ранее. Он указывает, что данные в указанном диапазоне памяти, указанные BaseAddress и Size, заинтересованы в вызове и пытается отменить эффекты MEM_RESET. Если функция выполнена успешно, это означает, что все данные в указанном диапазоне адресов не сохраняются. Если функция завершается ошибкой, по крайней мере некоторые данные в диапазоне адресов заменены нулями.

Это значение нельзя использовать с любым другим значением. Если MEM_RESET_UNDO вызывается в диапазоне адресов, который не был MEM_RESET ранее, поведение не определено. При указании MEM_RESETфункция VirtualAllocFromApp игнорирует значение Protection. Однако для защиты необходимо задать допустимое значение защиты, например PAGE_NOACCESS.

 

Этот параметр также может указать следующие значения, как указано.

Ценность Значение
MEM_LARGE_PAGES
0x20000000
Выделяет память с помощью поддержки больших страниц.

Размер и выравнивание должны быть несколькими из минимума больших страниц. Чтобы получить это значение, используйте функцию GetLargePageMinimum GetLargePageMinimum.

Если указать это значение, необходимо также указать MEM_RESERVE и MEM_COMMIT.

MEM_PHYSICAL
0x00400000
Резервирует диапазон адресов, который можно использовать для сопоставления страницы расширений окна адресов (AWE).

Это значение должно использоваться с MEM_RESERVE и никакими другими значениями.

MEM_TOP_DOWN
0x00100000
Выделяет память по максимально возможному адресу. Это может быть медленнее регулярных выделений, особенно при наличии большого количества выделений.
MEM_WRITE_WATCH
0x00200000
Система отслеживает страницы, записанные в выделенный регион. Если указать это значение, необходимо также указать MEM_RESERVE.

Чтобы получить адреса страниц, записанных с момента выделения региона или состояния отслеживания записи, вызовите функцию GetWriteWatch. Чтобы сбросить состояние отслеживания записи, вызовите GetWriteWatch или ResetWriteWatch. Функция отслеживания записи остается включенной для региона памяти, пока регион не будет освобожден.

[in] Protection

Защита памяти для выделенной области страниц. Если страницы фиксируются, можно указать одну из констант защиты памяти . Следующие константы вызывают ошибку:

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение является базовым адресом выделенного региона страниц.

Если функция завершается ошибкой, возвращаемое значение равно NULL. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.

Замечания

Вы можете вызывать VirtualAllocFromApp из приложений Магазина Windows с возможностями JIT для использования функций JIT. Приложение должно включать возможности codeGeneration в файл манифеста приложения для использования возможностей JIT.

Каждая страница имеет связанное состояние страницы. Функция VirtualAllocFromApp может выполнять следующие операции:

  • Фиксация области зарезервированных страниц
  • Зарезервировать область бесплатных страниц
  • Одновременно зарезервируйте и зафиксируйте область бесплатных страниц
VirtualAllocFromApp не может зарезервировать зарезервированную страницу. Он может зафиксировать страницу, которая уже зафиксирована. Это означает, что можно зафиксировать диапазон страниц независимо от того, были ли они уже зафиксированы, и функция не завершится ошибкой.

Вы можете использовать VirtualAllocFromApp для резервирования блока страниц и выполнения дополнительных вызовов для VirtualAllocFromApp для фиксации отдельных страниц из зарезервированного блока. Это позволяет процессу резервировать диапазон своего виртуального адресного пространства без использования физического хранилища до тех пор, пока он не потребуется.

Если параметр baseAddress не NULL, функция использует параметры BaseAddress и Size для вычисления области страниц, выделенной. Текущее состояние всего диапазона страниц должно быть совместимо с типом выделения, указанным параметром AllocationType. В противном случае функция завершается ошибкой, и ни одна из страниц не выделяется. Это требование совместимости не препятствует фиксации уже зафиксированной страницы, как упоминалось ранее.

VirtualAllocFromApp не позволяет создавать исполняемые страницы.

Функцию VirtualAllocFromApp можно использовать для резервирования расширения окна адресов (AWE) в виртуальном адресном пространстве указанного процесса. Затем этот регион памяти можно использовать для сопоставления физических страниц с виртуальной памятью и из нее, как это требуется приложению. Значения MEM_PHYSICAL и MEM_RESERVE должны быть заданы в параметре AllocationType. Значение MEM_COMMIT не должно быть задано. Для защиты страницы необходимо задать значение PAGE_READWRITE.

Функция VirtualFree может отключить зафиксированную страницу, освободить хранилище страницы или одновременно выпустить зафиксированную страницу. Он также может освободить зарезервированную страницу, что делает ее бесплатной.

При создании региона, который будет исполняемым, вызывающая программа несет ответственность за обеспечение совместного использования кэша с помощью соответствующего вызова FlushInstructionCache после установки кода. В противном случае попытки выполнить код из только что исполняемого региона могут привести к непредсказуемым результатам.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 10 [классические приложения | Приложения UWP]
минимальный поддерживаемый сервер Windows Server 2016 [классические приложения | Приложения UWP]
целевая платформа Виндоус
заголовка memoryapi.h (включая Windows.h)
библиотеки WindowsApp.lib
DLL Kernel32.dll

См. также

Функции управления памятью

функции виртуальной памяти

VirtualAlloc

VirtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

VirtualQuery