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


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

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

Синтаксис

__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
  [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

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

[in] ZeroBits

Число битов адресов высокого порядка, которые должны быть равны нулю в базовом адресе представления разделов. Используется только в том случае, если операционная система определяет, где следует выделить регион, например, если BaseAddress* имеет значение NULL. Обратите внимание, что если значение ZeroBits больше 32, оно становится битовой маской.

[in, out] RegionSize

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

[in] AllocationType

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

Примечание

Необходимо задать один из MEM_COMMIT, MEM_RESET или MEM_RESERVE.

Flag Значение
MEM_COMMIT Указанная область страниц должна быть зафиксирована.
MEM_RESERVE Указанная область страниц должна быть зарезервирована.
MEM_RESET Сбросьте состояние указанной области, чтобы, если страницы находятся в файле подкачки, они отклонялись и вносились страницы с нулями. Если страницы находятся в памяти и изменены, они помечаются как не измененные, поэтому они не будут записаны в файл подкачки. Содержимое не обнуляется. Параметр Protect не используется, но ему необходимо задать допустимое значение. Если MEM_RESET задано, другие флаги не могут быть установлены.
Другие флаги MEM_XXX См. раздел VirtualAlloc.

[in] Protect

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

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

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

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

  • STATUS_ACCESS_DENIED
  • STATUS_ALREADY_COMMITTED
  • STATUS_COMMITMENT_LIMIT
  • STATUS_CONFLICTING_ADDRESSES
  • STATUS_INSUFFICIENT_RESOURCES
  • STATUS_INVALID_HANDLE
  • STATUS_INVALID_PAGE_PROTECTION
  • STATUS_NO_MEMORY
  • STATUS_OBJECT_TYPE_MISMATCH
  • STATUS_PROCESS_IS_TERMINATING

Комментарии

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

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

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

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

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

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

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

Примечание Если вызов функции NtAllocateVirtualMemory выполняется в пользовательском режиме, следует использовать имя 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, PowerIrpDDis, SpNoWait, StorPortStartIo

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

NtFreeVirtualMemory