Поделиться через


Функция ZwAllocateVirtualMemory (ntifs.h)

ZwAllocateVirtualMemory резервирования, фиксации или обоих страниц в виртуальном адресном пространстве пользовательского режима указанного процесса.

Синтаксис

NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
  [in]      HANDLE    ProcessHandle,
  [in, out] PVOID     *BaseAddress,
  [in]      ULONG_PTR ZeroBits,
  [in, out] PSIZE_T   RegionSize,
  [in]      ULONG     AllocationType,
  [in]      ULONG     Protect
);

Параметры

[in] ProcessHandle

Дескриптор процесса, для которого необходимо выполнить сопоставление. Используйте макрос NtCurrentProcess, определенный в Ntddk.h, чтобы указать текущий процесс.

[in, out] BaseAddress

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

[in] ZeroBits

Количество битов адресов с высоким порядком, которые должны быть равны нулю в базовом адресе представления раздела. Это значение должно быть меньше 21 и используется только в том случае, если операционная система определяет, где выделить регион, как если BaseAddressNULL.

[in, out] RegionSize

Указатель на переменную, которая получит фактический размер в байтах выделенного региона страниц. Начальное значение этого параметра указывает размер в байтах региона и округляется до следующей границы размера страницы узла. * RegionSize не может быть нулевым для входных данных.

[in] AllocationType

Битовая маска, содержащая флаги, указывающие тип выполняемого выделения. В следующей таблице описаны эти флаги.

Флаг Значение
MEM_COMMIT Указанная область страниц должна быть зафиксирована. Необходимо задать один из MEM_COMMIT, MEM_RESET или MEM_RESERVE.
MEM_PHYSICAL Выделение физической памяти. Этот флаг предназначен исключительно для использования с памятью расширений окна адресов (AWE). Если MEM_PHYSICAL задано, MEM_RESERVE также необходимо задать, другие флаги не могут быть заданы и для защиты должно быть задано значение PAGE_READWRITE.
MEM_RESERVE Указанный регион страниц должен быть зарезервирован. Необходимо задать один из MEM_COMMIT, MEM_RESET или MEM_RESERVE.
MEM_RESET Сбросить состояние указанного региона таким образом, чтобы если страницы находятся в файле разбиения на страницы, они удаляются, а страницы с нулями добавляются. Если страницы находятся в памяти и изменены, они помечены как не измененные, чтобы они не были записаны в файл подкачки. Содержимое не ноль. Параметр Protect не используется, но он должен иметь допустимое значение. Необходимо задать один из MEM_COMMIT, MEM_RESET или MEM_RESERVE; Если MEM_RESET задано, другой флаг не может быть задан.
MEM_TOP_DOWN Указанный регион должен быть создан в максимально возможном виртуальном адресе на основе ZeroBits.

[in] Protect

Битовая маска, содержащая флаги защиты страниц, указывающие защиту, необходимую для зафиксированного региона страниц. В следующей таблице описаны эти флаги.

Флаг Значение
PAGE_NOACCESS Доступ к зафиксированной области страниц запрещен. Попытка чтения, записи или выполнения зафиксированного региона приводит к исключению нарушения доступа, называемому ошибкой общей защиты (GP).
PAGE_READONLY Разрешен доступ только для чтения и выполнение доступа к зафиксированной области страниц. Попытка записи зафиксированного региона приводит к нарушению доступа.
PAGE_READWRITE Разрешен доступ на чтение, запись и выполнение доступа к зафиксированной области страниц. Если доступ на запись к базовому разделу разрешен, будет предоставлен общий доступ к одной копии страниц. В противном случае страницы доступны только для чтения и копирования при записи.
PAGE_EXECUTE Разрешен доступ к зафиксированной области страниц. Попытка чтения или записи в зафиксированный регион приводит к нарушению доступа.
PAGE_EXECUTE_READ Разрешен доступ к зафиксированной области страниц и доступ на чтение. Попытка записи в зафиксированный регион приводит к нарушению доступа.
PAGE_EXECUTE_READWRITE Разрешен доступ на выполнение, чтение и запись к зафиксированной области страниц.
PAGE_GUARD Страницы в регионе становятся страницами защиты. Любая попытка считывания или записи на страницу охранника приводит к возникновению STATUS_GUARD_PAGE исключения системы. Сторожевые страницы, таким образом, действуют как однострелковая сигнализация доступа. Этот флаг является модификатором защиты страницы, допустимым только при использовании с одним из флагов защиты страниц, отличных от PAGE_NOACCESS. При попытке доступа система отключает состояние страницы, базовая защита страницы берет на себя. Если исключение страницы охранника возникает во время системной службы, служба обычно возвращает индикатор состояния сбоя.
PAGE_NOCACHE Область страниц должна быть выделена как некашируемая. PAGE_NOCACHE не допускается для разделов.
PAGE_WRITECOMBINE Включает объединение записей, то есть объединение записей из кэша в основную память, где оборудование поддерживает его. Этот флаг используется в основном для памяти буфера кадра, чтобы записи в одну строку кэша сочетались, когда это возможно, прежде чем записывать на устройство. Это может значительно уменьшить объем записей в шине (например) в память видео. Если оборудование не поддерживает объединение записей, флаг игнорируется. Этот флаг является модификатором защиты страницы, допустимым только при использовании с одним из флагов защиты страниц, отличных от PAGE_NOACCESS.

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

ZwAllocateVirtualMemory возвращает STATUS_SUCCESS или код состояния ошибки. Возможные коды состояния ошибок включают следующие:

Замечания

ZwAllocateVirtualMemory могут выполнять следующие операции:

  • Зафиксируйте область страниц, зарезервированную предыдущим вызовом ZwAllocateVirtualMemory.

  • Зарезервировать область бесплатных страниц.

  • Зарезервируйте и зафиксируйте область бесплатных страниц.

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

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

Государство Значение
СВОБОДНЫЙ Страница не зафиксирована или зарезервирована и недоступна для процесса. ZwAllocateVirtualMemory может зарезервировать или одновременно зарезервировать и зафиксировать бесплатную страницу.
СКРЫТНЫЙ Диапазон адресов не может использоваться другими функциями выделения, но страница недоступна для процесса и не связана с ним физическим хранилищем. ZwAllocateVirtualMemory может зафиксировать зарезервированную страницу, но не может зарезервировать ее во второй раз. ZwFreeVirtualMemory может освободить зарезервированную страницу, что делает ее бесплатной.
ПРЕДАННЫЙ ИДЕЕ Физическое хранилище выделяется для страницы, а доступ управляется кодом защиты. Система инициализирует и загружает каждую зафиксированную страницу в физическую память только при первой попытке чтения или записи на эту страницу. После завершения процесса система освобождает хранилище для зафиксированных страниц. ZwAllocateVirtualMemory может зафиксировать уже зафиксированную страницу. Это означает, что можно зафиксировать диапазон страниц независимо от того, были ли они уже зафиксированы, и функция не завершится ошибкой. ZwFreeVirtualMemory может отключить зафиксированную страницу, освободить хранилище страницы или одновременно выпустить зафиксированную страницу.

Память, выделенная вызовом ZwAllocateVirtualMemory, должна быть освобождена путем вызова ZwFreeVirtualMemory.

Дополнительные сведения об управлении памятью см. в разделе Управление памятью для драйверов Windows.

Заметка

Если вызов функции ZwAllocateVirtualMemory происходит в пользовательском режиме, следует использовать имя "NtAllocateVirtualMemor y" вместо "ZwAllocateVirtualMemory".

Для вызовов драйверов в режиме ядра NtXxx и ZwXxx версии подпрограммы Windows Native System Services могут вести себя по-разному в том, как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между NtXxx и ZwXxx версиями подпрограммы см. в разделе Using Nt and Zw Versions of the Native System Services Routines.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
правил соответствия DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

См. также

использование версий собственных системных служб и Zw

ZwFreeVirtualMemory