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


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

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

Чтобы изменить защиту доступа любого процесса, используйте функцию VirtualProtectEx .

Синтаксис

BOOL VirtualProtect(
  [in]  LPVOID lpAddress,
  [in]  SIZE_T dwSize,
  [in]  DWORD  flNewProtect,
  [out] PDWORD lpflOldProtect
);

Параметры

[in] lpAddress

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

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

[in] dwSize

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

[in] flNewProtect

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

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

[out] lpflOldProtect

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

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

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

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

Комментарии

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

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

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

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

Требования

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

См. также

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

Константы защиты памяти

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

VirtualAlloc

VirtualProtectEx

API-интерфейсы Vertdll, доступные в анклавах VBS