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 я не смотрел и не проверял.