Функция 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
Указатель на буфер, содержащий сведения о памяти. Формат и содержимое буфера зависят от указанного класса информации.
Если VmInformationClassVmPrefetchInformation, этот параметр не может иметь значение NULL и должен указывать на переменную ULONG, которая имеет значение 0.
[in] VmInformationLength
Размер буфера, на который указывает VmInformation.
Если VmInformationClassVmPrefetchInformation, это должно быть sizeof (ULONG)
.
Возвращаемое значение
ZwSetInformationVirtualMemory возвращает STATUS_SUCCESS при успешном выполнении или соответствующий код ошибки NTSTATUS при сбое.
Замечания
Подпрограмма ZwSetInformationVirtualMemory вызывается драйверами, которые знают набор адресов, к которым они будут получать доступ. Если скорее всего, эти адреса больше не находятся в памяти (т. е. они были разбиены на диск), вызывая эту подпрограмму в этих диапазонах адресов, прежде чем доступ уменьшает общую задержку, так как она эффективно приносит диапазоны адресов с диска с большими, параллельными запросами ввода-вывода по возможности.
ZwSetInformationVirtualMemory позволяет драйверам эффективно использовать оборудование диска путем выдачи большого числа одновременных операций ввода-вывода, когда драйвер предоставляет список диапазонов адресов процесса, к которым будет доступ. Даже для одного диапазона адресов (например, сопоставления файлов) подпрограмма может обеспечить улучшение производительности, выдавая один большой ввод-вывод, а не множество небольших операций ввода-вывода, которые будут выдаваться с помощью сбоя страниц.
Драйверы называют эту подпрограмму исключительно для оптимизации производительности: предварительная выборка не требуется для доступа к диапазонам целевых адресов. Предварительная память не добавляется в рабочий набор целевого процесса; он кэшируется в физической памяти. Когда к целевому процессу обращаются предварительно подготовленные диапазоны адресов, они добавляются в рабочий набор.
Так как этот вызов не требуется для правильной работы драйвера, он обрабатывается системой как строгое указание и подвергается обычным ограничениям физической памяти, где он может полностью или частично завершить сбой в условиях низкой памяти. Это также может создать давление на память при вызове с большими диапазонами адресов, поэтому приложения должны использовать только диапазоны адресов предварительной выборки.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 10 версии 1511. |
целевая платформа | Всеобщий |
заголовка | ntifs.h (include Ntddk.h) |
библиотеки |
NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
правил соответствия DDI |
HwStorPortProhibitedDDIs, PowerIrpDDis |