Функция 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 (include Ntddk.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDDIs, PowerIrpDDis |