Управление памятью. Глобальная память, страница 7

Пример

В следующем примере выполняется резервирование виртуальной памяти объемом 1 Мбайт во время запуска приложения. Когда пользователь выбирает пункт меню .Test!, выделяются и используются 70 Кбайт виртуальной памяти. Значения размещаются в каждом блоке памяти объемом 1 Кбайт. Доступ ко всему выделенному блоку памяти изменяется на доступ только для чтения. Происходит доступ к значению в блоке памяти и его отображение в окне сообщения. Затем предпринимается попытка изменить значение в памяти, что приводит к возникновению ситуации нарушения защиты. В этом примере для перехвата исключений, связанных с нарушением защиты, применяется конструкция try.. .except. Обработка исключительных ситуаций в такой форме может применяться в языке Visual C++ компании Microsoft. На рис. 11.4 показано окно сообщения, отображаемое при попытке приложения изменить значение в памяти, предназначенной только для чтения.

VirtualAllocEx                           • Windows 98   • Windows 2000

Описание

Функция VirtualAllocEx аналогична функции VirtualAlloc, за исключением того, что функция VirtualAlloc распределяет память в адресном пространстве вызывающего процесса, а функция VirtualAllocEx может распределить память для любого указанного процесса.

Синтаксис

LPVOID VirtualAllocEx( HANDLE hProcess, LPVOID IpvAddress, DWORD dwSize, DWORD dwAUocationType, DWORD dwProtect)

Параметры hProcess

HANDLE. Дескриптор процесса, для которого должна быть распределена память. Дескриптор должен обеспечивать доступ PROCESS_VM_OPERATION.

IpvAddress

LPVOID. Указатель на желаемый начальный адрес области. При резервировании памяти адрес округляется в меньшую сторону, до следующей границы 64 Кбайт. При выделении памяти адрес округляется в меньшую сторону до границы следующей страницы. Для определения размеров страницы на хост-компьютере применяется функция GetSystemlnfo. Если этот параметр установлен равным NULL, место распределения области памяти определяет система.

dwSize

DWORD. Размер области памяти в байтах. Если параметр IpvAddress равен1 NULL, это значение округляется в большую сторону до границы следующей страницы. В ином случае распределенные страницы включают все страницы,   содержащие  один  или  несколько  байтов  в диапазоне  от IpvAddress до (IpvAddress + dwSize).

dw Allocation Type

DWORD. Тип выполняемого распределения. В приложении может быть указано любое сочетание флажков, перечисленных в табл. 11.11.

dwProtect

DWORD. Тип защиты доступа для выделенных страниц. С любым из флажков, перечисленных в табл. 11.12, могут быть объединены модификаторы PAGE_GUARD и PAGE_NOCACHE.

Возвращаемое значение

LPVOID. В случае успешного выполнения базовый адрес распределенной области страниц; в ином случае возвращаемое значение — NULL.

Включаемый файл

winbase.h

См. также

VirtualAlloc, VirtualFreeEx

VirtualFree                               • Windows 98   • Windows 2000

Описание

Функция VirtualFree освобождает или отменяет выделение (или выполняет то и другое) для ряда страниц в виртуальном адресном пространстве вызывающего процесса. Чтобы можно было освободить страницы, все они должны быть в одинаковом состоянии (зарезервированы или выделены) и должна одновременно освобождаться вся область, первоначально зарезервированная функцией VirtualAlloc. Если была выделена только часть страниц в первоначально зарезервированной области, приложение должно вначале вызвать функцию VirtualFree, чтобы отменить выделение страниц, а затем снова вызвать VirtualFree, чтобы освободить весь блок.

Синтаксис

BOOL VirtualFree( LPVOID IpvAddress, DWORD dwSize, DWORD dwFreeType )

Параметры

IpvAddress

LPVOID. Указатель на базовый адрес области страниц, которая должна быть освобождена. Если параметр dwFreeType включает флажок MEMJRELEASE, этот параметр должен представлять собой базовый адрес, возвращенный функцией VirtualAlloc при резервировании области страниц.

dwSiu

DWORD. Размер в байтах области, которая должны быть освобождена. Если параметр dwFreeType включает флажок MEM_RELEASE, этот параметр должен иметь значение 0.

dwFreeType

DWORD. Тип операции освобождения. Может быть указан один из флажков, перечисленных в табл. 11.13.

Таблица 11.13. Флажки функции VirtualFree

Флажок

Описание

MEM DECOMMIT

Отменить выделение указанной области выделенных страниц

MEM_RELEASE

Освободить указанную область зарезервированных страниц

Возвращаемое значение

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

Включаемый файл

winbase.h

См. также

VirtualAlloc

Пример

См. пример для функции VirtualAlloc.

VirtualFreeEx                                    + Windows 98   + Windows 2000

Описание

Функция VirtualFreeEx аналогична функции VirtualFree, за исключением того, что функция VirtualFree освобождает память в адресном пространстве вызывающего процесса, а функция VirtualFreeEx может освободить память для любого указанного процесса.

Синтаксис

BOOL VirtuaIFreeEx( HANDLE hProcess, LPVOID IpvAddress, DWORD dwSize, DWORD dwFreeType )

Параметры

hProcess

HANDLE. Дескриптор процесса, для которого должна быть освобождена память. Дескриптор должен обеспечивать доступ PROCESS_VM_OPERATION.

IpvAddress

LPVOID. Указатель на базовый адрес области страниц, которая должна быть освобождена. Если параметр dwFreeType включает флажок MEM_RELEASE, данный параметр должен представлять собой базовый адрес, возвращенный функцией VirtualAllocEx при резервировании области страниц.

dwSize

DWORD. Размер в байтах области, которая должны быть освобождена. Если параметр dwFreeType включает флажок MEM_RELEASE, этот параметр должен иметь значение 0.

dwFreeType

DWORD. Тип операции освобождения. Может быть указан один из флажков, перечисленных в табл. 11.13.

Возвращаемое значение

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

Включаемый файл

winbase.h

См. также

VirtualAllocEx

VirtualLock                                • Windows 98   • Windows 2000

Описание

Функция VirtualLock блокирует указанную область виртуального адресного пространства процесса в памяти, благодаря чему последующий доступ к этой области не вызывает ошибку отсутствия страницы. Максимальное число страниц, которые могут быть заблокированы, равно 30. Этот предел установлен преднамеренно, чтобы предотвратить неблагоприятное снижение производительности. Блокировка страниц в памяти может ухудшить производительность системы, поскольку уменьшает доступный объем оперативной памяти и вынуждает систему выводить другие важные страницы в файл подкачки.

Синтаксис

BOOL VirtualLock( LPVOID IpvAddress, DWORD dwSize )

Параметры IpvAddress

LPVOID. Указатель на базовый адрес области страниц, которая должна быть заблокирована.

dwSize

DWORD. Размер в байтах области, которая должна быть заблокирована.

Возвращаемое значение

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

Включаемый файл

winbase.h

См. также

VirtualUnlock, VirtualAlloc

Пример

См. пример для функции VirtualAlloc.

VirtualProtect                            + Windows 98   * Winrln«ic ->nnn

Описание

VirtualProtect изменяет защиту доступа ряда выделенных страниц в виртуальном адресном пространстве вызывающего процесса.

Синтаксис

BOOL VirtuaIProtect( LPVOID IpvAddress, DWORD dwSize, DWORD dwNewProtect, PDWORD pdwOldProtect )

Параметры IpvAddress

LPVOID. Указатель на базовый адрес области страниц, для которой должны быть изменены атрибуты защиты доступа.

dwSize

DWORD. Размер в байтах области, для которой должны быть изменены атрибуты защиты доступа.

dwNewProtect

DWORD. Новый тип защиты доступа. С любым из флажков, перечисленных в табл. 11.12, могут быть объединены модификаторы PAGE_GUARD и PAGE_NOCACHE.

pdwOldProtect

PDWORD. Указатель на переменную, которая принимает предыдущее значение защиты доступа к первой странице в указанной области страниц.

Возвращаемое значение

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

Включаемыйфайл

wirthucp hW1IIU*1>C.1I

См. также

VirtualAlloc

Пример               

См. пример для функции VirtualAlloc.

VirtualProtectEx                          + Windows 98   * winHnu/c ->nnn

Описание

VirtualProtectEx аналогична функции VirtualProtect, за исключением того, что она может действовать в виртуальном адресном пространстве других процессов, тогда как функция VirtualProtect действует только в рамках вызывающего процесса.

Синтаксис

BOOL VirtualProtectEx( HANDLE hProcess, LPVOID IpvAddress, DWORD dwSize, DWORD dwNewProtect, PDWORD pdwOldProtect )

Параметры

hProcess

HANDLE. Дескриптор процесса, для которого должна быть изменена защита памяти. Дескриптор должен обеспечивать

IpvAddress

LPVOID. Указатель на базовый адрес области страниц, для которой должны быть изменены атрибуты защиты доступа.

dwSize

DWORD. Размер в байтах области, для которой должны быть изменены атрибуты защиты доступа.

dwNewProtect

DWORD. Новый тип защиты доступа. С любым из флажков, перечисленных в табл. 11.12, могут быть объединены модификаторы PAGE_GUARD и PAGE_NOCACHE.

pdwOldProtect

PDWORD. Указатель на переменную, которая принимает предыдущее значение доступа к первой странице в указанной области страниц.

Возвращаемое значение

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

Включаемый файл

winbase.h

См. также

VirtualAlloc

VirtualQuery                             * Windows 98   * Windows 2000

Описание

Функция VirtualQuery предоставляет информацию о ряде страниц в виртуальном адресном пространстве вызывающего процесса.

Синтаксис

DWORD VirtualQuery( LPCVOID IpvAddress, PMEMORY_BASIC_INFORMATION pmbiBuffer, DWORD dwLength )

Параметры IpvAddress

LPCVOID. Указатель на базовый адрес области страниц, для которого должен быть выполнен запрос.

pmbiBuffer

PMEMORY_BASIC_INFORMATION. Указатель на структуру MEMORY_BASIC_INFORMATION, в которой возвращается информация об указанном диапазоне страниц. См. приведенное ниже определение структуры MEMORY_BASIC_INFORMATION.

dwLength

DWORD. Размер в байтах буфера, указанного параметром pmbiBuffer.

Возвращаемое значение

DWORD. Фактическое число байтов, возвращенных в информационном буфере.

Включаемый файл

winbase.h

Определение MEMORY_BASIC_INFORMATION

typedef struct _MEMORY_BASIC_INFORMATIONFVOID

BaseAddress ;         //   Базовый  адрес  области FVOID

AllocationBase ; //  Базовый  адрес  распределения

DWORD AllocationProtect ;         //   Начальное   состояние  защиты доступа

DWORD RegionSize;        //   Размер  области  в  байтах

DWORD State;       //   Выделенная,   зарезервированная,   свободная

DWORD Protect;   //   Текущее   состояние   защиты  доступа

DWORD Type;         //   Тип   страниц

}   MEMORY BASIC INFORMATION,   *PMEMORY_BASIC_INFORMATION;

BaseAddress

PVOID. Указатель на базовый адрес области страниц.

AllocationBase

PVOID. Указатель на базовый адрес диапазона страниц, распределенных функцией VirtualAlloc.

AllocationProtect

DWORD. Зашита доступа, указанная при первоначальном распределении области. С любым из флажков в табл. 11.12 могут быть объединены модификаторы PAGE_GUARD и PAGE_NOCACHE

RegionSize

DWORD. Размер в байтах области, начинающейся с базового адреса, в которой все страницы имеют одинаковые атрибуты.

State

DWORD. Состояние страниц в области. Этот параметр может иметь одно из значений, перечисленных в табл. 11.14.

Protect

DWORD. Защита доступа к страницам в области. Может быть указан один из флажков, перечисленных для члена AllocationProtect.

Type

DWORD. Тип страниц в области. Допустимые типы перечислены в табл. 11.15.

Таблица 11.14. Значения члена State структуры MEMORY_BASIC_INFORMATION

Значение члена структуры State Описание

МЕМ_СОММ1Т

Страницы выделены.

MEM_FREE

Страницы недоступны для вызывающего процесса и подлежат распределению.

MEM_RESERVE

Страницы зарезервированы.

Таблица 1 1. 15. Значения члена Туре структуры MEMORY_BASIC_INFORMATION

Значение члена Туре

Описание

MEMJMAGE

Страницы памяти отображены в представление раздела

изображения.

MEM_MAPPED

Страницы памяти отображены в представление раздела.

MEM_PRIVATE

Страницы памяти являются приватными.