Эта функция устанавливает атрибуты на блоки памяти.
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 я не смотрел и не проверял.