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
指向包含内存信息的缓冲区的指针。 缓冲区的格式和内容取决于指定的信息类。
如果 VmInformationClass 为 VmPrefetchInformation,则此参数不能为 NULL,并且必须指向设置为 0 的 ULONG 变量。
[in] VmInformationLength
VmInformation 指向的缓冲区的大小。
如果 VmInformationClass 为 VmPrefetchInformation,则必须为 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 |
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈