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

Изменяет защиту в области зафиксированных страниц в виртуальном адресном пространстве вызывающего процесса.

Синтаксис

BOOL VirtualProtectFromApp(
  [in]  PVOID  Address,
  [in]  SIZE_T Size,
  [in]  ULONG  NewProtection,
  [out] PULONG OldProtection
);

Параметры

[in] Address

Указатель на адрес, описывающий начальную страницу области страниц, атрибуты защиты доступа которых необходимо изменить.

Все страницы в указанном регионе должны находиться в одном зарезервированном регионе, выделенном при вызове функции VirtualAlloc, VirtualAllocFromApp или VirtualAllocEx с помощью MEM_RESERVE. Страницы не могут охватывать смежные зарезервированные регионы, выделенные отдельными вызовами VirtualAlloc, VirtualAllocFromApp или VirtualAllocEx с помощью MEM_RESERVE.

[in] Size

Размер региона, атрибуты защиты доступа которого необходимо изменить, в байтах. Область затронутых страниц включает все страницы, содержащие один или несколько байтов в диапазоне от параметра Address до (Address+Size). Это означает, что 2-байтовой диапазон границы страницы приводит к изменению атрибутов защиты обеих страниц.

[in] NewProtection

Параметр защиты памяти. Этот параметр может быть одной из констант защиты памяти.

Для сопоставленных представлений это значение должно быть совместимо с защитой доступа, указанной при сопоставлении представления (см. MapViewOfFile,MapViewOfFileEx и MapViewOfFileExNuma).

Следующие константы создают ошибку:

  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY
Следующие константы разрешены только для приложений с возможностью codeGeneration :
  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ

[out] OldProtection

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

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

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

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

Комментарии

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

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

Модификатор защиты PAGE_GUARD устанавливает страницы защиты. Охранные страницы выступают в качестве однократных оповещений о доступе. Дополнительные сведения см. в разделе Creating Guard Pages.

Рекомендуется избегать использования VirtualProtectFromApp для изменения защиты страниц в блоках памяти, выделенных GlobalAlloc, HeapAlloc или LocalAlloc, так как на одной странице может существовать несколько блоков памяти. Диспетчер кучи предполагает, что все страницы в куче предоставляют по крайней мере доступ на чтение и запись.

VirtualProtectFromApp позволяет пометить страницы как исполняемые, но не позволяет одновременно задавать разрешения на запись и выполнение.

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

Требования

Требование Значение
Минимальная версия клиента Windows 10 [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2016 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header memoryapi.h (включая Windows.h)
Библиотека WindowsApp.lib
DLL Kernel32.dll

См. также

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

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

VirtualAllocFromApp

VirtualProtect

VirtualProtectEx