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) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI、PowerIrpDDis |