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
指定要執行的作業類型。 設定為 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 版。 |
目標平台 | Universal |
標頭 | ntifs.h (包含 Ntddk.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDDIs、PowerIrpDDis |