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 合規性規則 HwStorPortProhibitedDIS、 PowerIrpDDis