Функция 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 |