Функция VirtualAllocEx резервирует или предоставляет физическую память под указанными страницами в виртуальном адресном пространстве указанного процесса. Память, выделяемая этой функцией, автоматически инициализируется нулями, кроме случая, когда указан флаг MEM_RESET.
function VirtualAllocEx( hProcess: THandle; // процесс в котором выделяется память lpAddress: Pointer; // начальный адрес региона для резервирования/передачи памяти dwSize: DWORD; // размер региона flAllocationType: DWORD; // способ выделения flProtect: DWORD // атрибуты доступа ): Pointer; stdcall;
Параметры
hProcess [in]
Дескриптор процесса. Функция выделяет память в адресном пространстве именно
этого процесса.
Важно! Вы должны иметь атрибуты доступа PROCESS_VM_OPERATION к указанному процессу. В противном случае функция вернет признак ошибки.
lpAddress [in]
Указывает желаемый базовый адрес региона памяти, для которого будет произведено
выделение памяти. Если указанная память резервируется, то этот адрес будет
округлен вниз до границы 64 Кб. Если память уже зарезервирована и происходит
передача памяти, указанный адрс округляется вниз до ближайшей границы страницы.
Для того, чтобы определить размер страницы на компьютере, на котором выполняется
приложение, необходимо использовать функцию GetSystemInfo. Если желаетый адрес
равен nil, то система сама определит место, где будет выделен регион
памяти.
dwSize [in]
Указывает размер в байтах региона памяти. Если указанный желаемый адрес
lpAddress равен nil, то указанное значение округлится вверх таким
образом, чтобы включать целое число страниц. В противном случае выделяемые
страницы озватят весь диапазон начинающийся по адресу lpAddress и
заканчивающийся по адресу lpAddress + dsSize. В этом случае возможно выделение
двух страниц, память на которых будет использована не полностью (в начале и в
конце).
flAllocationType [in]
Указывает способ выделения памяти. Указанный параметр может быть комбинацией
следующих значений:
| Флаг | Назначение |
|---|---|
| MEM_COMMIT |
Передает память указанному региону адресного пространства. Память может находиться как непосредственно в оперативной памяти, так и в файле подкачки. Попытка передать памяти диапазону адресов,для которых уже выделена память, не может привести к ошибке. Это значит, что вы можете спокойно получать физическую память под адреса, находящеся в зарезервированном адресном пространстве, не тревожась ни за то, что возникнет ошибка в случае пересекаются указанного диапазона со страницами, которые уже имеют под собой физическую память, ни за то, что содержимое ранее выделенных страниц обнулиться. |
| MEM_RESERVE |
Резервирование указанного диапазона виртуального адресного пространства процесса без передачи физической памяти. Зарезервированный фрагменты памяти не могут участвовать в дальнейших операциях выделения памяти (например при помощи функций GetMem или LocalAlloc или подобных им) до тех пор пока она не будет освобождена. Физическая память под зарезервированные страницы может быть выделена только при помощи вызова функции VirtualAlloc. |
| MEM_RESET |
Windows NT/2000. Указывает, что диапазон адресов начиная с lpvAddress и длины dwSize больше для нас не представляет интереса. При обращении к таким блокам (чтение/запись) соответсвующие страницы не будут загружаться из файла подкачки. Тем не менее физическая память под указанным диапазоном остается, и указанный фрагмент можно будет использоваться в дальнейшем. Важно! Установка этого флага не гарантирует, что указанный диапазон будет обнулен. Если вы хотите обнулить оюду или несколько страниц, необходимо снять физическау память с них и передать ее им снова. Если вы указываете значение MEM_RESET, функция VirtualAlloc игнорирует значение параметра flProtect. Тем не менее необходимо передать в этом параметре правилиное значение, например PAGE_NOACCESS. Функция VirtualAlloc закончиться неуспешно при попытке использования флага MEM_RESET к диапазону адресов, занятого файлом проецируемым в память. Доступный для всех просмотр файла проецируемого в память не исказиться и будет, при необходимости, записан в файл подкачки. |
| MEM_TOP_DOWN |
Windows NT/2000. Выделяет память по наиболее высокому возможному адресу. |
flProtect [in]
Указывает тип доступа к памяти. Если указанный диапазон страниц имеет под собой
физическую память, вы можете указать одно из следующих значений, по
необходимости скомбинированных с флагами PAGE_GUARD и PAGE_NOCACHE.
| Флаг | Назначение |
|---|---|
| PAGE_READONLY |
Устанавливает права чтения для указанного региона. Попытка записи в этот регион приведет к нарушению доступа. Если операционная система выполняет различие между правами только для чтения и выполнения кода, то попытка передать управление на один из адресов, принадлежащих указанному региону, также вызовет нарушение доступа. |
| PAGE_READWRITE |
Предоставляет права чтения/записи для указанного региона. |
| PAGE_EXECUTE |
Предоставляет права выполнения кода для указанного региона. Попытка чтения/записи страниц указанного региона приведет к нарушению доступа. |
| PAGE_EXECUTE_READ |
Предоставляет права чтения памяти и выполнения кода для указанного региона. Попытка записи в страницы указанного региона приведет к нарушению доступа. |
| PAGE_EXECUTE_READWRITE |
Предоставляет права чтения/записи памяти и выполнения кода для указанного региона. |
| PAGE_GUARD |
Делает страницы памяти в указанном регионе защищаемыми. Любая попытка чтения или записи в такие страницы вызовет исключение STATUS_GUARD_PAGE, и одновременно приведет к выключению статуса защищаемости. Таким образом защита страниц может быть отличным способом сигнализации доступа к страницам памяти. Флаг PAGE_GUARD является модификатором типа защиты страниц. Приложение может использовать этот флаг только в том случае, если обращение к странице происходит без возникновения исключительной ситуации. Указанный флаг нельзя использовать совместно со правами доступа PAGE_NOACCESS. Любая попытка доступа к памяти приводит к тому, что система снимает защиту страницы, оставляя при этом все остальные права доступа к странице. Если исключение защиты страницы случилось в сервисе, то обычно сервис индицирует появление ошибки. |
| PAGE_NOACCESS |
Запрещает любой доступ к странице, которая имеет под собой физическую память. Любая попытка чтения/записи или передачи управления на указанную страницу приводит к исключению нарушения доступа вызываемого общей ошибкой защиты. |
| PAGE_NOCACHE |
Запрещает любое кэширование указанного диапазона страниц. Это аппаратный атрибут физической памяти может быть рассмотрен как "нет кэшированию". Этот атрибут не рекомендуется для обычного использования. Этот атрибут необходим для драйверов устройств, например для проекции кадров видеобуфера без кэширования. Этот атрибут используется только в том случае, когда указан атрибут доступа к странице отличный от PAGE_NOACCESS. |
Возвращаемое значение
В случае удачного завершения возвращаемым значением является базовый адрес выделенных страниц памяти.
К случае ошибк функция возвращает nil. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.
Описание
Функция VirtualAllocEx способна выполнить следующие операции:
Вы можете использовать функцию VirtualAllocEx для того, чтобы зерезервировать некоторый фрагмент памяти, а впоследсвии использовать эту же функцию для того, чтобы передавать физическую память выборочным страницам зарезервированного блока. Это позволяет процессу резервировать регион своего виртуального адресного пространства без выделения непосредственно физической памяти, если это необходимо.
Каждая страницы виртуальной памяти может находиться в одном из следующих состояний:
| Состояние страницы | Описание |
|---|---|
| Свободная |
Под такой страницей нет физической памяти, она не является зарезервированной и недоступна процессу. Функция VirtualAllocEx может либо зарезервировать такую страницу, либо одновременно как зарезервировать, так и передать такой странице физическую память. |
| Зарезервированная |
Диапазон адресов, занимаемый страницей, не может быть получен в результате выполнения какой-либо функции, выделяющей память. Но доступ к такой странице невозможен и она не занимает места в памяти. Функция VirtualAllocEx может выделить физическую память такой странице, но не может повторно ее зарезервировать. Функция VirtualFreeEx позволяет снять резервирование страницы, после чего страница станет свободной. |
| Переданная процессу |
Для такой страницы выделено место в памяти (либо в оперативной, либо в файле подкачки). Доступ к странице контролируется атрибутами защиты страницы. Выделение памяти под страницу и ее инициализация выполняется операционной системой только при попытке осуществления чтения/запии содержимого вновь выделенной страницы. По завершении процесса системой освобождаются все страницы, принадлежащие данному процессу. Функция VirtualAllocEx может передать физическую память страницам, которые уже имеют ее под собой. Это делает возможным передачу физической памяти диапазону страниц, не обращая внимания на то, проиводилась ли передача физической памяти под эти страницы ранее. Функция VirtualFreeEx позволяет либо освободить физическую память, находящуюся под страницей, либо как освободить физическую память, так и снять резервирование со страницы. |
Если параметр lpAddress не равен nil, функция использует значение параметров lpAddress и dwSize для того, чтобы вычислить размер выделяемого региона памяти. Текущее состояние страницы полученном регионе должно быть совместимо с тем способом выделения, что указан в параметре flAllocationType. В противном случае памяти не выделяется и функция возвратит ошибку. Требования по совместимости состояния страниц со способом выделения приведены в предшествующей таблице.
Указание атрибута PAGE_GUARD доступа к странице позволяет создавать в памяти защищаемые страницы. Создание таких страниц позволяет нам отловить попытки доступа к странице. Для большей информации смотрите раздел "Создание защищаемых страниц".
Требования
Windows NT/2000: Требуется Windows NT 4.0 или более поздняя версия
Windows 95/98: не поддерживается
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows
Смотри также:
VirtualAlloc |
VirtualFree![]() |
© Mystic, 2002