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


Функция 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 и используется только в том случае, если операционная система определяет, где следует выделить регион, например, если BaseAddress имеет значение NULL.

[in, out] RegionSize

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

[in] AllocationType

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

Flag Значение
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

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

Flag Значение
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 Включает объединение операций записи, т. е. объединение операций записи из кэша в main память, где это поддерживается оборудованием. Этот флаг используется в основном для памяти буфера кадров, чтобы записи в одну и ту же строку кэша объединялись по возможности перед записью на устройство. Это может значительно сократить объем операций записи в (например) видеопамяти по всей шине. Если оборудование не поддерживает объединение операций записи, флаг игнорируется. Этот флаг является модификатором защиты страницы, допустимым только при использовании с одним из флагов защиты страниц, отличных от PAGE_NOACCESS.

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

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

Комментарии

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

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

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

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

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

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

Состояние Значение
FREE Страница не зафиксирована или зарезервирована и недоступна для процесса. ZwAllocateVirtualMemory может резервировать или одновременно резервировать и фиксировать бесплатную страницу.
RESERVED Диапазон адресов не может использоваться другими функциями выделения, но страница недоступна для процесса и не имеет связанного с ней физического хранилища. ZwAllocateVirtualMemory может зафиксировать зарезервированную страницу, но не может зарезервировать ее повторно. ZwFreeVirtualMemory может освободить зарезервированную страницу, сделав ее бесплатной.
СОВЕРШИЛ Для страницы выделяется физическое хранилище, а доступ контролируется кодом защиты. Система инициализирует и загружает каждую зафиксированную страницу в физическую память только при первой попытке чтения или записи на нее. После завершения процесса система освобождает хранилище для зафиксированных страниц. ZwAllocateVirtualMemory может зафиксировать уже зафиксированную страницу. Это означает, что можно зафиксировать диапазон страниц независимо от того, были ли они уже зафиксированы, и функция не завершится ошибкой. ZwFreeVirtualMemory может удалить зафиксированную страницу, освободить хранилище страницы или одновременно снять и освободить зафиксированную страницу.

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

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

Примечание

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

Для вызовов из драйверов режима ядра версии NtXxx и ZwXxx подпрограммы Собственные системные службы Windows могут вести себя по-разному, так как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между версиями подпрограмм NtXxx и ZwXxx см. в разделе Использование версий NT и Zw подпрограмм собственных системных служб.

Требования

Требование Значение
Минимальная версия клиента Windows 2000
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

См. также раздел

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

ZwFreeVirtualMemory