共用方式為


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

包含記憶體資訊的緩衝區指標。 緩衝區的格式和內容取決於指定的資訊類別。

如果 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 合規性規則 HwStorPortProhibitedDDIs, PowerIrpDDis