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

为要执行操作的上下文中的进程指定一个打开句柄。 此句柄不能无效。 使用 Ntddk.h 中定义的 NtCurrentProcess 宏指定当前进程。

[in] VmInformationClass

指定要执行的操作的类型。 设置为 VIRTUAL_MEMORY_INFORMATION_CLASS 枚举中定义的 VmPrefetchInformation,请参阅 ntddk.h。

[in] NumberOfEntries

VirtualAddresses 参数指向的数组中的条目数。 此参数不能为 0。

[in] VirtualAddresses

指向MEMORY_RANGE_ENTRY结构的数组的指针,其中每个条目指定要处理的虚拟地址范围。 虚拟地址范围可能涵盖目标进程可访问的进程地址空间的任何部分。

[in] VmInformation

指向包含内存信息的缓冲区的指针。 缓冲区的格式和内容取决于指定的信息类。

如果 VmInformationClassVmPrefetchInformation,则此参数不能为 NULL,并且必须指向设置为 0 的 ULONG 变量。

[in] VmInformationLength

VmInformation 指向的缓冲区的大小。

如果 VmInformationClassVmPrefetchInformation,则必须为 sizeof (ULONG)

返回值

ZwSetInformationVirtualMemory 在成功时返回STATUS_SUCCESS,或在失败时返回相应的 NTSTATUS 错误代码。

注解

ZwSetInformationVirtualMemory 例程由知道要访问的地址集的驱动程序调用。 如果这些地址可能不再驻留在内存中, (即它们已分页到磁盘) ,那么在访问之前对这些地址范围调用此例程可以减少总体延迟,因为它会尽可能使用大型并发 I/O 请求从磁盘有效地引入这些地址范围。

ZwSetInformationVirtualMemory 允许驱动程序在驱动程序提供要访问的进程地址范围列表时,尽可能发出大型并发 I/O,从而有效地使用磁盘硬件。 即使对于单个地址范围 (例如文件映射) ,例程也可以通过发出单个大型 I/O(而不是通过页面错误发出许多较小的 I/O)来提供性能改进。

驱动程序调用此例程纯粹是为了优化性能:访问目标地址范围不需要预提取。 预提取的内存不会添加到目标进程的工作集中;它缓存在物理内存中。 当目标进程访问预提取的地址范围时,它们将添加到工作集中。

由于驱动程序的正确操作不需要此调用,因此系统会将其视为强提示,并受常见物理内存约束的约束,在内存不足的情况下,它可能会完全或部分失败。 如果使用较大的地址范围调用,则它还会产生内存压力,因此应用程序应仅预提取它们实际使用的地址范围。

要求

要求
最低受支持的客户端 Windows 10版本 1511。
目标平台 通用
标头 ntifs.h (包括 Ntddk.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI、PowerIrpDDis