共用方式為


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

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

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

[in, out] RegionSize

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

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

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

ZwFreeVirtualMemoryZwAllocateVirtualMemory保留整個區域。 如果符合下列三個條件,整個區域就會進入保留狀態:

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

[in] FreeType

包含旗標的位掩碼,描述 ZwFreeVirtualMemory 將針對指定的頁面區域執行的免費作業類型。 可能的值為下列各項:

  • MEM_DECOMMIT

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

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

  • MEM_RELEASE

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

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

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

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

傳回值

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

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

言論

處理程式虛擬位址空間中的每個頁面都位於下列三種狀態之一。

  • 狀態為FREE

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

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

  • 狀態為 RESERVED

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

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

  • 狀態為 COMMITTED

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

    系統只會在第一次嘗試讀取或寫入該頁面時,將每個認可的頁面初始化並載入到物理記憶體中。

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

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

ZwFreeVirtualMemory 可以執行下列作業:

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

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

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

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

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

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

注意

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

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

要求

要求 價值
最低支援的用戶端 Windows 2000
目標平臺 普遍
標頭 ntifs.h (include Ntifs.h, Fltkernel.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIs(storport)PowerIrpDDis(wdm)

另請參閱

ZwAllocateVirtualMemory