| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Шаг 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 я не смотрел и не проверял.
Предыдущий Шаг | Следующий Шаг | Оглавление

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz