NtFreeVirtualMemory 函式 (ntifs.h)
NtFreeVirtualMemory 例程會發行、取消認可或同時發行和取消認可,這是指定進程虛擬位址空間內的頁面區域。
語法
__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
[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 必須是保留區域時 NtAllocateVirtualMemory 所傳回的基位址。
[in, out] RegionSize
變數的指標,將接收頁面釋放區域的實際大小,以位元組為單位。 例程會將這個變數的初始值四捨五入到下一個主機頁面大小界限,並將四捨五入的值寫回此變數。
如果MEM_RELEASE旗標是在 *FreeType 中設定, *RegionSize 必須為零。 NtFreeVirtualMemory 釋放在 NtAllocateVirtualMemory 初始配置呼叫中保留的整個區域。
如果MEM_DECOMMIT旗標是在 *FreeType 中設定,NtFreeVirtualMemory 會取消認可範圍中包含一或多個字節的所有記憶體頁面,範圍從 *BaseAddress 到 (*BaseAddress + *RegionSize) 。 例如,這表示如果記憶體的雙位元組區域跨越頁面界限,則會取消認可這兩個頁面。
NtFreeVirtualMemory 會取消認可 NtAllocateVirtualMemory 所保留的整個區域。 如果符合下列三個條件,整個區域就會進入保留狀態:
- 已設定MEM_DECOMMIT旗標。
- *BaseAddress 是保留區域時 NtAllocateVirtualMemory 所傳回的基位址。
- *RegionSize 為零。
[in] FreeType
位掩碼,其中包含旗標,描述 NtFreeVirtualMemory 針對頁面指定區域執行的免費作業類型。 下表列出可能的值。
旗標 | 意義 |
---|---|
MEM_DECOMMIT | NtFreeVirtualMemory 將會取消認可頁面的指定區域。 頁面會進入保留狀態。 如果您嘗試取消認可頁面,NtFreeVirtualMemory 不會失敗。 這表示您可以取消認可一系列頁面,而不需要先判斷其目前的承諾狀態。 |
MEM_RELEASE | NtFreeVirtualMemory 會釋放頁面的指定區域。 頁面進入免費狀態。 如果您指定此旗標, RegionSize 必須是零, 而BaseAddress 必須在保留區域時指向 NtAllocateVirtualMemory 所傳回的基位址。 如果不符合上述任一條件,NtFreeVirtualMemory 就會失敗。 如果區域中的任何頁面目前已認可, NtFreeVirtualMemory 會先取消認可,然後釋放它們。 如果您嘗試釋放處於不同狀態的頁面,某些保留和某些已認可的頁面,NtFreeVirtualMemory 不會失敗。 這表示您可以釋放一系列頁面,而不需要先判斷其目前的承諾狀態。 |
傳回值
NtFreeVirtualMemory 會傳回STATUS_SUCCESS或錯誤狀態代碼。 可能的錯誤狀態代碼包括下列專案。
傳回碼 | Description |
---|---|
STATUS_ACCESS_DENIED | 進程已要求存取物件,但尚未授與這些訪問許可權。 |
STATUS_INVALID_HANDLE | 指定了無效 的 ProcessHandle 值。 |
STATUS_OBJECT_TYPE_MISMATCH | 要求作業所需的物件類型與要求中指定的物件類型不符。 |
備註
進程虛擬位址空間中的每個頁面都位於下表所述的三種狀態之一。
狀態 | 意義 |
---|---|
FREE | 頁面未認可或保留。 進程無法存取頁面。 嘗試讀取或寫入免費頁面會導致存取違規例外狀況。 您可以使用 NtFreeVirtualMemory 將保留或認可的頁面放入免費狀態。 |
已保留 | 頁面已保留。 其他配置函式無法使用位址範圍。 此頁面無法供進程存取,而且沒有與其相關聯的實體記憶體。 嘗試讀取或寫入保留頁面會導致存取違規例外狀況。 您可以使用 NtFreeVirtualMemory 將認可的記憶體頁面放入保留狀態,並將保留的記憶體頁面放入免費狀態。 |
承諾 | 已認可頁面。 記憶體或磁碟上分頁檔案中的實體記憶體會配置給頁面,且存取權是由保護程式代碼所控制。 系統只會在第一次嘗試讀取或寫入該頁面時,初始化並載入每個認可的頁面。 當進程終止時,系統會釋放認可頁面的所有記憶體。 您可以使用 NtAllocateVirtualMemory 將認可的記憶體頁面放入保留狀態或免費狀態。 |
NtFreeVirtualMemory 可以執行下列作業:
- 取消認可或未認可的頁面區域。 此作業之後,頁面會處於保留狀態。
- 釋放保留頁面的區域。 這項作業之後,頁面會處於免費狀態。
- 取消認可並釋放已認可或未認可的頁面區域。 這項作業之後,頁面會處於免費狀態。
NtFreeVirtualMemory 可以取消認可處於不同狀態、某些已認可和部分未認可的頁面範圍。 這表示您可以取消認可一系列頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 取消認可頁面會在記憶體中或磁碟上的分頁檔案中釋放其實體記憶體。
如果頁面已認可但未發行,其狀態會變更為保留。 您接著可以呼叫 NtAllocateVirtualMemory 來認可它,或 NtFreeVirtualMemory 將其釋放。 嘗試讀取或寫入保留頁面會導致存取違規例外狀況。
NtFreeVirtualMemory 可以釋放不同狀態、部分保留和某些已認可的頁面。 這表示您可以釋放一系列頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 NtAllocateVirtualMemory 原本保留的整個頁面範圍必須同時發行。
如果發行頁面,其狀態會變更為免費,而且可用於後續的配置作業。 釋放或取消認可記憶體之後,您永遠不能再次參考記憶體。 任何可能已在該記憶體中的資訊都永遠消失。 嘗試讀取或寫入免費頁面會導致存取違規例外狀況。 如果您需要資訊,請勿取消認可或釋放包含該資訊的記憶體。
如需核心模式驅動程序之內存管理支援的詳細資訊,請參閱 Windows 驅動程式的記憶體管理。
注意
如果 對 NtFreeVirtualMemory 函式的呼叫發生在使用者模式中,您應該使用名稱 “NtFreeVirtualMemory”,而不是 “ZwFreeVirtualMemory”。
對於核心模式驅動程式的呼叫,Windows 原生系統服務例程的 NtXxx 和 ZwXxx 版本在處理和解譯輸入參數的方式可能會有不同的行為。 如需例程 NtXxx 和 ZwXxx 版本之間的關聯性詳細資訊,請參閱 使用 Nt 和 Zw 版本的原生系統服務例程。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 |
目標平台 | Universal |
標頭 | ntifs.h (包含 Ntifs.h、Fltkernel.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDDIs、PowerIrpDDis |