Программирование для Windows NT

       

Изменение типа разрешенного доступа для страниц памяти


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

BOOL VirtualProtect(

  LPVOID lpvAddress,      // адрес области памяти

  DWORD  cbSize,          // размер области памяти в байтах

  DWORD  fdwNewProtect,   // новый тип разрешенного доступа

  PDWORD pfdwOldProtect); // указатель на переменную,

                // в которую будет записан прежний код доступа

Через параметр lpvAddress вы должны передать адрес области памяти, расположенной в готовых для использования страницах (а не в зарезервированных страницах).

Новый тип доступа передается через параметр fdwNewProtect. Здесь вы можете использовать все константы, что и для последнего параметра функции VirtualAlloc, например, PAGE_READWRITE или PAGE_READONLY.

Зачем вам может пригодиться изменение кода доступа?

Например, вы можете получить страницы страницы памяти, доступные на запись, а затем, записав туда данные, разрешить доступ только на чтение или на исполнение. Устанавливая тип доступа PAGE_NOACCESS для страниц, которые в данный момент не используются приложением, вы можете, например, обнаружить во время исполнения кода ошибки, связанные с использованием неправильных указателей. Для решения аналогичных задач можно также устанавливать тип доступа PAGE_GUARD.

Заметим, что функция VirtualProtect позволяет изменить код доступа только для тех страниц, которые созданы вызывающим ее процессом. При необходимости приложение может изменить код доступа страниц другого процесса, имеющего код доступа PROCESS_VM_OPERATION (например, процесса, созданного приложением). Это можно сделать при помощи функции VirtualProtectEx, прототип которой представлен ниже:

BOOL VirtualProtectEx(

  HANDLE hProcess,        // идентификатор процесса

  LPVOID lpvAddress,      // адрес области памяти

  DWORD  cbSize,          // размер области памяти в байтах

  DWORD  fdwNewProtect,   // новый тип разрешенного доступа

  PDWORD pfdwOldProtect); // указатель на переменную,

                // в которую будет записан прежний код доступа

Через параметр hProcess функции VirtualProtectEx следует передать идентификатор процесса. Подробнее об этом идентификаторе вы узнаете из главы, посвященной мультизадачности в операционной системе Microsoft Windows NT.



Содержание раздела