Основы программирования в Win32API. Марапулец Ю.В. - 48 стр.

UptoLike

Составители: 

Если аргумент lpvAddress имеет значение NULL,
функция VirtualAlloc() ок-
ругляет значение аргумента dwsize до ближайшей границы между страница-
ми. Если значение аргумента lpvAddress не равно NULL,
она закрепляет все
страницы, содержащие хотя бы один байт информации в диапазоне адресов
от lpvAddress до lpvAddress + dwSize. Если, например, при выделении двух
байтов памяти заданный адрес пересекает границу двух страниц, то закреп-
ляются две целые страницы. В большинстве систем Windows 98 размер стра-
ницы составляет 4 Кб, но если вы хотите проверить это значение, вызовите
функцию GetSystemInfo().
По завершении процесса система автоматически освобождает использо-
вавшуюся им память. Освободить память, не дожидаясь окончания процесса,
позволяет функция VirtualFree():
BOOL VirtualFree
(LPVOID lpvAddress, // адрес освобождаемого блока
DWORD dwSize, // размер освобождаемого блока
DWORD fdwFreeType // перевести в резерв или освободить);…
Функция VirtualFree() отменяет закрепление набора страниц, оставляя их
адреса зарезервированными, или полностью освобождает память, занимаемую
этими страницами. Закрепление можно отменять маленькими блоками, содер-
жащими как зарезервированные, так и закрепленные страницы.
При освобождении зарезервированных адресов необходимо очищать весь
выделенный блок, причем все страницы этого блока должны находиться в одина-
ковом состояниилибо в закрепленном, либо в зарезервированном. Аргумент
lpvAddress должен содержать базовый адрес, возвращенный функцией
VirtualAlloc(). Значение аргумента dwSize игнорируется, поскольку сразу освобо-
ждается весь выделенный диапазон. Аргумент dwSize учитывается лишь при от-
мене закрепления отдельных фрагментов. Аргумент fdwFreeType может прини-
мать следующие значения:
MEM_RELEASE
освободить зарезервированный регион; при ис-
пользовании этого флага параметр dwSize должен быть равен нулю;
MEM_DECOMMIT
освободить выделенную память.
В программах, где используются команды для работы с виртуальной памя-
тью, должен быть предусмотрен механизм «сбора мусора», обеспечивающий ос-
вобождение страниц, которые становятся пустыми. В качестве такого механизма
может применяться низкоприоритетный поток, который время от времени про-
сматривает выделенную область и ищет пустые страницы.
Для изменения атрибутов защиты регионов используются функции
VirtualProtect() и VirtualProtectEx(). Причем первая позволяет изменять атрибуты
защиты в адресном пространстве текущего процесса, а втораяпроизвольного.
Рассмотрим подробнее функцию VirtualProtect():
BOOL VirtualProtect
(LPVOID lpvAddress, // адрес защищаемого блока
DWORD dwSize, // размер защищаемого блока
48
Если аргумент lpvAddress имеет значение NULL, функция VirtualAlloc() ок-
ругляет значение аргумента dwsize до ближайшей границы между страница-
ми. Если значение аргумента lpvAddress не равно NULL, она закрепляет все
страницы, содержащие хотя бы один байт информации в диапазоне адресов
от lpvAddress до lpvAddress + dwSize. Если, например, при выделении двух
байтов памяти заданный адрес пересекает границу двух страниц, то закреп-
ляются две целые страницы. В большинстве систем Windows 98 размер стра-
ницы составляет 4 Кб, но если вы хотите проверить это значение, вызовите
функцию GetSystemInfo().
      По завершении процесса система автоматически освобождает использо-
вавшуюся им память. Освободить память, не дожидаясь окончания процесса,
позволяет функция VirtualFree():

BOOL VirtualFree
   (LPVOID lpvAddress,            // адрес освобождаемого блока
   DWORD dwSize,                 // размер освобождаемого блока
   DWORD fdwFreeType           // перевести в резерв или освободить);…

     Функция VirtualFree() отменяет закрепление набора страниц, оставляя их
адреса зарезервированными, или полностью освобождает память, занимаемую
этими страницами. Закрепление можно отменять маленькими блоками, содер-
жащими как зарезервированные, так и закрепленные страницы.
     При освобождении зарезервированных адресов необходимо очищать весь
выделенный блок, причем все страницы этого блока должны находиться в одина-
ковом состоянии – либо в закрепленном, либо в зарезервированном. Аргумент
lpvAddress должен содержать базовый адрес, возвращенный функцией
VirtualAlloc(). Значение аргумента dwSize игнорируется, поскольку сразу освобо-
ждается весь выделенный диапазон. Аргумент dwSize учитывается лишь при от-
мене закрепления отдельных фрагментов. Аргумент fdwFreeType может прини-
мать следующие значения:
     – MEM_RELEASE – освободить зарезервированный регион; при ис-
пользовании этого флага параметр dwSize должен быть равен нулю;
     – MEM_DECOMMIT – освободить выделенную память.
     В программах, где используются команды для работы с виртуальной памя-
тью, должен быть предусмотрен механизм «сбора мусора», обеспечивающий ос-
вобождение страниц, которые становятся пустыми. В качестве такого механизма
может применяться низкоприоритетный поток, который время от времени про-
сматривает выделенную область и ищет пустые страницы.
     Для изменения атрибутов защиты регионов используются функции
VirtualProtect() и VirtualProtectEx(). Причем первая позволяет изменять атрибуты
защиты в адресном пространстве текущего процесса, а вторая – произвольного.
Рассмотрим подробнее функцию VirtualProtect():
 BOOL VirtualProtect
     (LPVOID lpvAddress,                    // адрес защищаемого блока
     DWORD dwSize,                      // размер защищаемого блока

                                      48