ZwFreeVirtualMemory 函式 (ntifs.h)

ZwFreeVirtualMemory 例程會釋放、取消認可或兩者,這是指定進程虛擬位址空間內的頁面區域。

語法

NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
  [in]      HANDLE  ProcessHandle,
  [in, out] PVOID   *BaseAddress,
  [in, out] PSIZE_T RegionSize,
  [in]      ULONG   FreeType
);

參數

[in] ProcessHandle

要釋放頁面所在的進程句柄。 使用 NtCurrentProcess 宏,定義於 Ntddk.h 中,以指定目前的進程。

[in, out] BaseAddress

將接收頁面釋放區域之虛擬位址的變數指標。

如果MEM_RELEASE旗標是在 FreeType 參數中設定,則保留區域時, BaseAddress 必須是 ZwAllocateVirtualMemory 所傳回的基位址。

[in, out] RegionSize

變數的指標,將接收頁面釋放區域的實際大小,以位元組為單位。 例程會將這個變數的初始值四捨五入到下一個主機頁面大小界限,並將四捨五入的值寫回此變數。

如果在 FreeType 參數中設定MEM_RELEASE旗標, 則 RegionSize 所指向的變數必須是零。 ZwFreeVirtualMemory 釋出在 ZwAllocateVirtualMemory 的初始配置呼叫中保留的整個區域。

如果MEM_DECOMMIT旗標是在FreeType參數中設定,ZwFreeVirtualMemory會取消認可範圍中包含一或多個字節的所有記憶體頁面,從BaseAddress參數 (BaseAddress + RegionSize) 。 例如,這表示如果記憶體的雙位元組區域跨越頁面界限,則會取消認可這兩個頁面。

ZwFreeVirtualMemory 會取消認可 ZwAllocateVirtualMemory 所保留的整個區域。 如果符合下列三個條件,整個區域就會進入保留狀態:

  • 已設定MEM_DECOMMIT旗標。
  • BaseAddress 是保留區域時 ,ZwAllocateVirtualMemory 所傳回的基位址。
  • RegionSize< 為零。

[in] FreeType

位掩碼,其中包含描述 ZwFreeVirtualMemory 針對頁面指定區域執行之免費作業類型的旗標。 可能的值如下:

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory 將會取消認可頁面的指定區域。 頁面會進入保留狀態。

    • 如果您嘗試取消認可頁面,ZwFreeVirtualMemory 不會失敗。 這表示您可以取消認可一系列頁面,而不需要先判斷其目前的承諾狀態。

  • MEM_RELEASE

    ZwFreeVirtualMemory 會釋放頁面的指定區域。 頁面進入免費狀態。

    如果您指定此旗標, RegionSize 所指向的變數必須是零, 而BaseAddress 必須在保留區域時指向 ZwAllocateVirtualMemory 所傳回的基位址。 如果不符合上述任一條件,ZwFreeVirtualMemory 就會失敗。

    如果區域中的任何頁面目前已認可, ZwFreeVirtualMemory 會先取消認可,然後釋放它們。

如果您嘗試釋放處於不同狀態的頁面,部分保留和某些已認可的頁面,ZwFreeVirtualMemory 不會失敗。 這表示您可以釋放一系列頁面,而不需要先判斷其目前的承諾狀態。

傳回值

ZwFreeVirtualMemory 會傳回STATUS_SUCCESS或錯誤狀態代碼。 可能的錯誤狀態代碼包括下列專案。

傳回碼 Description
STATUS_ACCESS_DENIED 進程已要求存取物件,但尚未授與這些訪問許可權。
STATUS_INVALID_HANDLE 指定了無效 的 ProcessHandle 值。
STATUS_OBJECT_TYPE_MISMATCH 要求作業所需的物件類型與要求中指定的物件類型不符。

備註

進程虛擬位址空間中的每個頁面都是下列三種狀態之一。

  • 狀態為免費

    頁面未認可或保留。 進程無法存取頁面。 嘗試讀取或寫入免費頁面會導致存取違規例外狀況。

    您可以使用 ZwFreeVirtualMemory 將保留或認可的頁面放入免費狀態。

  • 狀態為 RESERVED

    頁面已保留。 其他配置函式無法使用位址範圍。 此頁面無法供進程存取,而且沒有與其相關聯的實體記憶體。 嘗試讀取或寫入保留頁面會導致存取違規例外狀況。

    您可以使用 ZwFreeVirtualMemory 將認可的記憶體頁面放入保留狀態,並將保留的記憶體頁面放入免費狀態。

  • 狀態為 COMMITTED

    已認可頁面。 記憶體或磁碟上分頁檔案中的實體記憶體會配置給頁面,且存取權是由保護程式代碼所控制。

    系統只會在第一次嘗試讀取或寫入該頁面時,初始化並載入每個認可的頁面。

    當進程終止時,系統會釋放認可頁面的所有記憶體。

    您可以使用 ZwAllocateVirtualMemory 將認可的記憶體頁面放入保留狀態或免費狀態。

ZwFreeVirtualMemory 可以執行下列作業:

  • 取消認可或未認可的頁面區域。 此作業之後,頁面會處於保留狀態。
  • 釋放保留頁面的區域。 這項作業之後,頁面會處於免費狀態。
  • 取消認可並釋放已認可或未認可的頁面區域。 這項作業之後,頁面會處於免費狀態。

ZwFreeVirtualMemory 可以取消認可不同狀態、某些已認可和部分未認可的頁面範圍。 這表示您可以取消認可一系列頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 取消認可頁面會在記憶體中或磁碟上的分頁檔案中釋放其實體記憶體。

如果頁面已認可但未發行,其狀態會變更為保留。 您接著可以呼叫 ZwFreeVirtualMemory 加以認可,或 呼叫 ZwFreeVirtualMemory 來釋放它。 嘗試讀取或寫入保留頁面會導致存取違規例外狀況。

ZwFreeVirtualMemory 可以發行不同狀態、部分保留和已認可的頁面範圍。 這表示您可以釋放一系列頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 ZwAllocateVirtualMemory 原本保留的整個頁面範圍必須同時發行。

如果發行頁面,其狀態會變更為免費,而且可用於後續的配置作業。 釋放或取消認可記憶體之後,您永遠不能再次參考記憶體。 任何可能已在該記憶體中的資訊都永遠消失。 嘗試讀取或寫入免費頁面會導致存取違規例外狀況。 如果您需要資訊,請勿取消認可或釋放包含該資訊的記憶體。

如需核心模式驅動程序之內存管理支援的詳細資訊,請參閱 Windows 驅動程式的記憶體管理

注意

如果在使用者模式中呼叫 ZwFreeVirtualMemory 函式,您應該使用名稱 “NtFreeVirtualMemory”,而不是 “ZwFreeVirtualMemory”。

對於核心模式驅動程式的呼叫,Windows 原生系統服務例程的 NtXxxZwXxx 版本在處理和解譯輸入參數的方式可能會有不同的行為。 如需例程 NtXxxZwXxx 版本之間的關聯性詳細資訊,請參閱 使用 Nt 和 Zw 版本的原生系統服務例程

規格需求

需求
最低支援的用戶端 Windows 2000
目標平台 Universal
標頭 ntifs.h (包括 Ntifs.h、Fltkernel.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDDIs (storport) PowerIrpDDis (wdm)

另請參閱

ZwAllocateVirtualMemory