Функция ZwSetInformationVirtualMemory (ntifs.h)
Подпрограмма ZwSetInformationVirtualMemory выполняет операцию с указанным списком диапазонов адресов в адресном пространстве пользователя процесса.
Синтаксис
NTSYSAPI NTSTATUS ZwSetInformationVirtualMemory(
[in] HANDLE ProcessHandle,
[in] VIRTUAL_MEMORY_INFORMATION_CLASS VmInformationClass,
[in] ULONG_PTR NumberOfEntries,
[in] PMEMORY_RANGE_ENTRY VirtualAddresses,
[in] PVOID VmInformation,
[in] ULONG VmInformationLength
);
Параметры
[in] ProcessHandle
Указывает открытый дескриптор для процесса, в контексте которого должна быть выполнена операция. Этот дескриптор не может быть недопустимым. Используйте макрос NtCurrentProcess , определенный в ntddk.h, чтобы указать текущий процесс.
[in] VmInformationClass
Указывает тип выполняемой операции. Задайте для значение VmPrefetchInformation , определенное в перечислении VIRTUAL_MEMORY_INFORMATION_CLASS , см. ntddk.h.
[in] NumberOfEntries
Количество записей в массиве, на которые указывает параметр VirtualAddresses . Этот параметр не может иметь значение 0.
[in] VirtualAddresses
Указатель на массив MEMORY_RANGE_ENTRY структур, в которых каждая запись указывает диапазон виртуальных адресов для обработки. Диапазоны виртуальных адресов могут охватывать любую часть адресного пространства процесса, доступную целевому процессу.
[in] VmInformation
Указатель на буфер, содержащий сведения о памяти. Формат и содержимое буфера зависят от указанного класса информации.
Если vmInformationClass имеет значение VmPrefetchInformation, этот параметр не может иметь значение NULL и должен указывать на переменную ULONG, которая имеет значение 0.
[in] VmInformationLength
Размер буфера, на который указывает VmInformation.
Если vmInformationClass имеет значение VmPrefetchInformation, это должно быть sizeof (ULONG)
значение .
Возвращаемое значение
ZwSetInformationVirtualMemory возвращает STATUS_SUCCESS при успешном выполнении или соответствующий код ошибки NTSTATUS при сбое.
Комментарии
Подпрограмма ZwSetInformationVirtualMemory вызывается драйверами, которые знают набор адресов, к которым они будут обращаться. Если вполне вероятно, что эти адреса больше не находятся в памяти (т. е. они были выгружены на диск), вызов этой процедуры для этих диапазонов адресов перед доступом сокращает общую задержку, так как она эффективно переносит эти диапазоны адресов с диска с помощью больших одновременных запросов ввода-вывода, где это возможно.
ZwSetInformationVirtualMemory позволяет драйверам эффективно использовать дисковое оборудование, выполняя большие параллельные операции ввода-вывода, когда драйвер предоставляет список диапазонов адресов процесса, к которым будет осуществляться доступ. Даже для одного диапазона адресов (например, для сопоставления файлов) подпрограмма может обеспечить повышение производительности путем выпуска одного большого ввода-вывода, а не множества меньших операций ввода-вывода, которые будут выданы через сбой страницы.
Драйверы называют эту подпрограмму исключительно для оптимизации производительности: предварительная выборка не требуется для доступа к целевым диапазонам адресов. Предварительно выбранная память не добавляется в рабочий набор целевого процесса; он кэшируется в физической памяти. Когда целевой процесс обращается к предварительно подготовленным диапазонам адресов, они добавляются в рабочий набор.
Так как этот вызов не требуется для правильной работы драйвера, он рассматривается системой как строгое указание и подвержен обычным ограничениям физической памяти, когда он может полностью или частично завершить работу в условиях нехватки памяти. Это также может создать нехватку памяти при вызове с большими диапазонами адресов, поэтому приложения должны предварительно получать только диапазоны адресов, которые они будут использовать.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10 версии 1511. |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntddk.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDIs, PowerIrpDDis |