Функция 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
Тип выделения памяти. Этот параметр должен содержать одно из следующих значений.
Значение | Значение |
---|---|
|
Выделяет расходы на память (из общего размера памяти и файлов подкачки на диске) для указанных зарезервированных страниц памяти. Функция также гарантирует, что при первоначальном обращении вызывающего объекта к памяти содержимое будет равно нулю. Фактические физические страницы не выделяются до тех пор, пока не будут доступны виртуальные адреса.
Чтобы зарезервировать и зафиксировать страницы за один шаг, вызовите VirtualAllocFromApp с Попытка зафиксировать определенный диапазон адресов путем указания MEM_COMMIT без MEM_RESERVE и baseAddress, отличного от NULL, завершается ошибкой, если весь диапазон еще не зарезервирован. Полученный код ошибки ERROR_INVALID_ADDRESS. Попытка зафиксировать уже зафиксированную страницу не приводит к сбою функции. Это означает, что вы можете фиксировать страницы без предварительного определения текущего состояния обязательств каждой страницы. |
|
Резервирует диапазон виртуального адресного пространства процесса, не выделяя фактическое физическое хранилище в памяти или в файле подкачки на диске.
Зарезервированные страницы можно зафиксировать в последующих вызовах функции VirtualAllocFromApp . Чтобы зарезервировать и зафиксировать страницы за один шаг, вызовите VirtualAllocFromApp с MEM_COMMIT | MEM_RESERVE. Другие функции выделения памяти, такие как malloc и LocalAlloc, не могут использовать зарезервированный диапазон памяти, пока он не будет освобожден. |
|
Указывает, что данные в диапазоне памяти, заданном baseAddress и Size , больше не представляют интереса. Страницы не должны считываться из файла подкачки или записываться в нее. Однако блок памяти будет использоваться позже, поэтому он не должен быть списан. Это значение нельзя использовать с каким-либо другим значением.
Использование этого значения не гарантирует, что диапазон, с которым работает MEM_RESET , будет содержать нули. Если вы хотите, чтобы диапазон содержал нули, удалите память, а затем снова зафиксируете ее. При указании MEM_RESET функция VirtualAllocFromApp игнорирует значение Protection. Однако необходимо по-прежнему задать для параметра Защита допустимое значение защиты, например PAGE_NOACCESS. VirtualAllocFromApp возвращает ошибку, если используется MEM_RESET и диапазон памяти сопоставлен с файлом. Общее представление допустимо только в том случае, если оно сопоставлено с файлом подкачки. |
|
MEM_RESET_UNDO следует вызывать только для диапазона адресов, к которому MEM_RESET были успешно применены ранее. Он указывает, что данные в указанном диапазоне памяти, заданном BaseAddress и Size , представляют интерес для вызывающего объекта и пытаются обратить вспять эффекты MEM_RESET. Если функция выполнена успешно, это означает, что все данные в указанном диапазоне адресов остаются без изменений. Если функция завершается сбоем, по крайней мере некоторые данные в диапазоне адресов были заменены нулями.
Это значение нельзя использовать с каким-либо другим значением. Если MEM_RESET_UNDO вызывается в диапазоне адресов, который не был MEM_RESET ранее, поведение не определено. При указании MEM_RESET функция VirtualAllocFromApp игнорирует значение Protection. Однако необходимо по-прежнему задать для параметра Защита допустимое значение защиты, например PAGE_NOACCESS. |
Этот параметр также может указывать следующие значения, как указано.
Значение | Значение |
---|---|
|
Выделяет память с помощью поддержки больших страниц.
Размер и выравнивание должны быть кратными минимуму большой страницы. Чтобы получить это значение, используйте функцию GetLargePageMinimum . Если указать это значение, необходимо также указать MEM_RESERVE и MEM_COMMIT. |
|
Резервирует диапазон адресов, который можно использовать для сопоставления страниц расширений окон адресов (AWE).
Это значение должно использоваться с MEM_RESERVE и никакими другими значениями. |
|
Выделяет память по максимально возможному адресу. Это может быть медленнее, чем обычное выделение, особенно при наличии большого количества выделений. |
|
Заставляет систему отслеживать страницы, записанные в выделенном регионе. Если указать это значение, необходимо также указать MEM_RESERVE.
Чтобы получить адреса страниц, на которые были записаны с момента выделения региона или сброса состояния отслеживания записи, вызовите функцию GetWriteWatch . Чтобы сбросить состояние отслеживания записи, вызовите Метод GetWriteWatch или ResetWriteWatch. Функция отслеживания записи остается включенной для области памяти, пока регион не будет освобожден. |
[in] Protection
Защита памяти для области выделенных страниц. Если страницы фиксируются, можно указать одну из констант защиты памяти. Следующие константы создают ошибку:
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение является базовым адресом выделенной области страниц.
Если функция завершается сбоем, возвращается значение NULL. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
Вы можете вызывать VirtualAllocFromApp из приложений Магазина Windows с возможностями JIT для использования функций JIT. Чтобы использовать возможности JIT, приложение должно включать возможность codeGeneration в файл манифеста приложения.
Каждая страница имеет связанное состояние страницы. Функция 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] |
Целевая платформа | Windows |
Header | memoryapi.h (включая Windows.h) |
Библиотека | WindowsApp.lib |
DLL | Kernel32.dll |
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по