![]() |
eXeL@B —› Основной форум —› Что означают команды VirtualAlloc и VirtualProtectEx? |
Посл.ответ | Сообщение |
|
Создано: 12 декабря 2005 00:58 · Личное сообщение · #1 |
|
Создано: 12 декабря 2005 01:05 · Личное сообщение · #2 VirtualProtectEx Функция VirtualProtect позволяет изменить атрибуты защиты указанного региона виртуального адресного програнства указанного процесса. { Вариант 1 } function VirtualProtectEx( hProcess: THandle; //дескриптор процесса lpAddress: Pointer; // начальный адрес фрагмента памяти dwSize: DWORD; // размер фрагмента памяти flNewProtect: DWORD; // новые атрибуты защиты lpflOldProtect: Pointer // старые атрибуты защиты ): BOOL; stdcall; overload; { Вариант 2 } function VirtualProtectEx( hProcess: THandle; //дескриптор процесса lpAddress: Pointer; // начальный адрес фрагмента памяти dwSize: DWORD; // размер фрагмента памяти flNewProtect: DWORD; // новые атрибуты защиты var OldProtect: DWORD // старые атрибуты защиты ): BOOL; stdcall; overload; Параметры hProcess [in] Дескриптор процесса, атрибутя защиты страниц виртуального адресного пространства которого будут изменены. Дескриптор должен иметь права доступа PROCESS_VM_OPERATION. Для более детальной информации о правах доступа и флаге PROCESS_VM_OPERATION смотрите функцию OpenProcess 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. Описание Вы можете установить атрибуты доступа только для страниц, под которыми присутствует физическая память. Если хотя-бы под одной из страниц указанного диапазона нет физической памяти, то функция вернет ошибку и никакого изменения атрибутов защиты не произойдет. Функция VirtualProtectEx в целом идентичнафункции VirtualProtect, за исключением того, что позволяет изменять атрибуты защиты страниц памяти любого указанного процесса. 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 ----- M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240 ![]() |
|
Создано: 12 декабря 2005 01:05 · Личное сообщение · #3 |
|
Создано: 12 декабря 2005 01:11 · Личное сообщение · #4 |
|
Создано: 12 декабря 2005 15:58 · Личное сообщение · #5 |
|
Создано: 12 декабря 2005 16:01 · Личное сообщение · #6 |
|
Создано: 12 декабря 2005 18:55 · Личное сообщение · #7 |
|
Создано: 12 декабря 2005 22:07 · Личное сообщение · #8 |
|
Создано: 12 декабря 2005 23:54 · Личное сообщение · #9 |
![]() |
eXeL@B —› Основной форум —› Что означают команды VirtualAlloc и VirtualProtectEx? |