Шаг 30 - VirtualProtect

Эта функция устанавливает атрибуты на блоки памяти.

BOOL VirtualProtect
(
	LPVOID lpAddress,		// адрес региона для установки флага
	DWORD dwSize,		// размер региона
	DWORD flNewProtect,	// флаг
	PDWORD lpflOldProtect	// адрес для сохранения старых флагов
);

Какие бывают флаги ???

#define PAGE_NOACCESS          0x01     
#define PAGE_READONLY          0x02     
#define PAGE_READWRITE         0x04     
#define PAGE_WRITECOPY         0x08     
#define PAGE_EXECUTE           0x10     
#define PAGE_EXECUTE_READ      0x20     
#define PAGE_EXECUTE_READWRITE 0x40     
#define PAGE_EXECUTE_WRITECOPY 0x80     
#define PAGE_GUARD            0x100     
#define PAGE_NOCACHE          0x200     

Я думаю, что имена их более менее понятны. Нет доступа или только для чтения. Давайте попробуем.

// TestPrivate.cpp : Defines the entry point for the application.
//
#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance,
		LPSTR lpCmdLine,
		int nCmdShow)
{
	DWORD* dwPointer;
	DWORD old;
	dwPointer =new DWORD;
	*dwPointer=2;

	if (VirtualProtect(dwPointer, sizeof(DWORD), PAGE_READONLY, &old))
	{
		MessageBox(NULL,"Protected","Info",MB_OK);
	}

	//*dwPointer=10; // Error Protected

	DWORD test;
	test=*dwPointer;

	if (VirtualProtect(dwPointer, sizeof(DWORD), old, &old))
	{
		MessageBox(NULL,"Not Protected","Info",MB_OK);
	}

	*dwPointer=*dwPointer+10;
	delete dwPointer;
	return 0;
}

Код такой. Заводим переменную типа DWORD и размещаем ее в памяти. Присваиваем значения и потом закрываем доступ. Можно только читать. В конце возвращаем старые сохраненные значения из old, куда помещаются ранее установленные флаги на этой странице. Можно и писать после этого. Можете раскомментировать строку:

//*dwPointer=10; // Error Protected.

Что будет догадываетесь ? Windows вам про незаконные операции расскажет.

Пользоваться этой функцией нельзя в диапазоне:

0xBFFFFFFF 
0x80000000 

Кстати она BOOL и если Вам не удастся поменять атрибуты памяти, то можно будет это обработать. Этот пример хорошо работает под Windows9x для NT я не смотрел и не проверял.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 8.11.2000