Функция WndProc_OnCreate
Напомним, что при создании окна его функции окна передается сообщение WM_CREATE. Функция WndProc_OnCreate, определенная в нашем приложении, выполняет обработку этого сообщения.
Прежде всего, функция резервирует область виртуальной памяти размером MEMBLOCK_SIZE байт, вызывая функцию VirtualAlloc с параметром MEM_RESERVE:
lpReserved = VirtualAlloc(NULL, MEMBLOCK_SIZE,
MEM_RESERVE, PAGE_NOACCESS);
Через первый параметр мы передаем функции VirtualAlloc значение NULL, поэтому операционная система сама определит для нас начальный адрес резервируемой области. Этот адрес мы сохраняем во временной локальной переменной lpReserved.
В случае ошибки выводится соответствующее сообщение. Если же резервирование адресного пространства выполнено успешно, функция получает память в использование, вызывая для этого функцию VirtualAlloc еще раз, но уже с параметром MEM_COMMIT:
lpMemoryBuffer = VirtualAlloc(lpReserved,
MEMBLOCK_SIZE, MEM_COMMIT, PAGE_NOACCESS);
Так как в качестве первого параметра функции VirtualAlloc передается значение lpReserved, выделение страниц памяти выполняется в зарезервированной ранее области адресов.
При невозможности получения памяти в диапазоне зарезервированных адресов мы отдаем зарезервированные адреса системе и завершаем работу приложения, запрещая создание его главного окна:
VirtualFree(lpReserved, 0, MEM_RELEASE);
return FALSE;
Заметим, что мы могли бы и не вызывать функцию VirtualFree, так как после завершения процесса операционная система Microsoft Windows NT автоматически освобождает все распределенные для него ранее страницы виртуальной памяти.
Последнее, что делает обработчик сообщения WM_CREATE, это получение идентификатора меню Set protection и отметку в этом меню строки PAGE_NOACCESS:
hSetMenu = GetSubMenu(GetMenu(hWnd), 1);
CheckMenuItem(hSetMenu,
ID_SETPROTECTION_PAGENOACCESS, MF_CHECKED);
Использованные при этом функции были описаны в главе “Меню” 13 тома “Библиотеки системного программиста”, который называется “Операционная система Microsoft Windows 3.1 для программиста. Часть третья”.