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


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

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

Синтаксис

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

Параметры

[in] hProcess

Дескриптор для процесса, защита памяти которого должна быть изменена. Дескриптор должен иметь право доступа PROCESS_VM_OPERATION . Дополнительные сведения см. в разделе Управление правами на доступ и безопасность процесса.

[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.

Рекомендуется избегать использования VirtualProtectEx для изменения защиты страниц для блоков памяти, выделенных 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

VirtualProtect

VirtualQueryEx