VirtualProtect

Функция VirtualProtect позволяет изменить атрибуты защиты указанного региона виртуального адресного програмнства вызывающего процесса. Для того, чтобы изменить атрибуты защиты страницы виртуального адресного пространства любого процесса, следует воспользоваться функцией VirtualProtectEx.

{ Вариант 1 }
function VirtualProtect(
  lpAddress: Pointer;         // начальный адрес фрагмента памяти
  dwSize: DWORD;              // размер фрагмента памяти
  flNewProtect: DWORD;        // новые атрибуты защиты
  lpflOldProtect: Pointer     // старые атрибуты защиты
): BOOL; stdcall; overload;

{ Вариант 2 }
function VirtualProtect(
  lpAddress: Pointer;         // начальный адрес фрагмента памяти
  dwSize: DWORD;              // размер фрагмента памяти
  flNewProtect: DWORD;        // новые атрибуты защиты
  var OldProtect: DWORD       // старые атрибуты защиты
): BOOL; stdcall; overload;

Параметры

lpAddress [in]
Указывает на начальный адрес диапазона, для которого будут изменены атрибуты защиты страниц.

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

dwSize [in]
Указывает размер в байтах региона, страницы которого должны изменить атрибуты защиты. При этом будут изменены атрибуты всех страниц, в которых присутсвует хотя бы один байт из указанного диапазона от lpAddress до (lpAddress + dwSize). Это означает, в частности, что при попытке зафиксировать в памяти диапазон длиной 2 байта, который берет начало на одной странице, а заканчивается на другой, в памяти будут зафиксированы две страницы памяти (8192 байт).

flNewProtect [in]
Указывает новое значения атрибута защиты страниц. Вы можете указать одно из следующих значений, в сочетании с флагами PAGE_GUARD и PAGE_NOCACHE, если это необходимо.

Флаг Назначение

PAGE_READONLY

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

PAGE_READWRITE

Предоставляет права чтения/записи для указанного региона.

PAGE_WRITECOPY

Windows NT/2000 Устанавливает атрибуты защиты "копирование при записи" для указанного диапазона страниц.

PAGE_EXECUTE

Предоставляет права выполнения кода для указанного региона. Попытка чтения/записи страниц указанного региона приведет к нарушению доступа.

PAGE_EXECUTE_READ

Предоставляет права чтения памяти и выполнения кода для указанного региона. Попытка записи в страницы указанного региона приведет к нарушению доступа.

PAGE_EXECUTE_READWRITE

Предоставляет права чтения/записи памяти и выполнения кода для указанного региона.

PAGE_EXECUTE_WRITECOPY

Windows NT/2000 Устанавливает атрибуты защиты "копирование при записи" и выполнения кода для указанного диапазона страниц.

PAGE_GUARD

Windows NT/2000. Делает страницы памяти в указанном регионе защищаемыми. Любая попытка чтения или записи в такие страницы вызовет исключение STATUS_GUARD_PAGE, и одновременно приведет к выключению статуса защищаемости. Таким образом защита страниц может быть отличным способом сигнализации доступа к страницам памяти.

Флаг PAGE_GUARD является модификатором типа защиты страниц. Приложение может использовать этот флаг только в том случае, если обращение к странице происходит без возникновения исключительной ситуации. Указанный флаг нельзя использовать совместно со правами доступа PAGE_NOACCESS. Любая попытка доступа к памяти приводит к тому, что система снимает защиту страницы, оставляя при этом все остальные права доступа к странице.

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

Windows 95/98. Для симуляции подобного поведения необходимо использовать атрибут защиты страницы PAGE_NOACCESS.

PAGE_NOACCESS

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

PAGE_NOCACHE

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

lpflOldProtect [out]
Указатель на переменную, которая принимает старое значение атрбута доступа к памяти для первой страницы из указанного диапазона. Если этот параметр равен nil, или не является правильным указателем на переменную, функция вернет ошибку.

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

В случае удачного завершения функция возвращает значение True.

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

Описание

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

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

Windows NT/2000: Указание атрибута PAGE_GUARD доступа к странице позволяет создавать в памяти защищаемые страницы. Создание таких страниц позволяет нам отловить попытки доступа к странице. Для большей информации смотрите раздел "Создание защищаемых страниц".

Windows 95/98: Вы не можете использвоать функцию VirtualProtect к любому региону адресного пространства, расположенного внутри разделяемого адресного пространства (от $80000000 до $BFFFFFFF).

Требования

Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Требуется Windows 95 или более поздняя версия
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows

Смотри также:

  • виртуальная память,
  • работа с виртуальной памятью,
  • список функций для работы с виртуальной памятью,
  • VirtualAlloc,
  • VirtualProtectEx
  • НазадVirtualLock VirtualProtectExВперед

    © Mystic, 2002