ZwAllocateVirtualMemory 函式 (ntifs.h)

ZwAllocateVirtualMemory 例程會保留、認可或兩者,這是指定進程之使用者模式虛擬位址空間內的頁面區域。

語法

NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
  [in]      HANDLE    ProcessHandle,
  [in, out] PVOID     *BaseAddress,
  [in]      ULONG_PTR ZeroBits,
  [in, out] PSIZE_T   RegionSize,
  [in]      ULONG     AllocationType,
  [in]      ULONG     Protect
);

參數

[in] ProcessHandle

應該完成對應之程式的句柄。 使用 NtCurrentProcess 宏,定義於 Ntddk.h 中,以指定目前的進程。

[in, out] BaseAddress

將接收頁面所配置區域基位址之變數的指標。 如果此參數的初始值為非 NULL,則區域會從指定的虛擬位址四捨五入到下一個主機頁面大小位址界限開始配置。 如果此參數的初始值為 NULL,操作系統會決定要配置區域的位置。

[in] ZeroBits

區段檢視基地址中必須為零的高序位址位數目。 此值必須小於 21,而且只有在操作系統決定配置區域的位置時,才會使用,如同 BaseAddressNULL 時一樣。

[in, out] RegionSize

變數的指標,將接收頁面所配置區域的實際大小,以位元組為單位。 此參數的初始值會指定區域的大小,以位元組為單位,並進位至下一個主機頁面大小界限。 *輸入時,RegionSize 不能為零。

[in] AllocationType

位掩碼,其中包含指定要執行之配置類型的旗標。 下表描述這些旗標。

旗標 意義
MEM_COMMIT 要認可頁面的指定區域。 必須設定MEM_COMMIT、MEM_RESET或MEM_RESERVE之一。
MEM_PHYSICAL 配置實體記憶體。 此旗標僅適用於 AWE) 記憶體 (位址視窗延伸模組。 如果已設定MEM_PHYSICAL,也必須設定MEM_RESERVE,不可以設定其他旗標,且 [保護 ] 必須設定為PAGE_READWRITE。
MEM_RESERVE 要保留頁面的指定區域。 必須設定MEM_COMMIT、MEM_RESET或MEM_RESERVE之一。
MEM_RESET 重設指定區域的狀態,如此一來,如果頁面位於分頁檔案中,則會捨棄這些頁面,並將零頁帶入。 如果頁面在記憶體中並經過修改,則會標示為未修改,因此不會將其寫出至分頁檔案。 內容 不會 為零。 未使用 Protect 參數,但必須設定為有效的值。 必須設定其中一個MEM_COMMIT、MEM_RESET或MEM_RESERVE;如果已設定MEM_RESET,則不會設定其他旗標。
MEM_TOP_DOWN 指定的區域應該根據 ZeroBits,以可能的最高虛擬位址建立。

[in] Protect

位掩碼,包含頁面保護旗標,指定頁面認可區域所需的保護。 下表描述這些旗標。

旗標 意義
PAGE_NOACCESS 不允許存取已認可的頁面區域。 嘗試讀取、寫入或執行認可的區域會導致存取違規例外狀況,稱為一般保護 (GP) 錯誤。
PAGE_READONLY 允許對已認可頁面區域的唯讀和執行存取權。 嘗試寫入認可的區域會導致存取違規。
PAGE_READWRITE 允許讀取、寫入和執行頁面認可區域的存取權。 如果允許基礎區段的寫入許可權,則會共用頁面的單一複本。 否則,頁面會在寫入時共用唯讀/複製。
PAGE_EXECUTE 允許對已認可的頁面區域執行存取。 嘗試讀取或寫入已認可的區域會導致存取違規。
PAGE_EXECUTE_READ 允許對已認可的頁面區域執行和讀取許可權。 嘗試寫入已認可的區域會導致存取違規。
PAGE_EXECUTE_READWRITE 允許對已認可頁面區域的執行、讀取和寫入存取權。
PAGE_GUARD 區域中的頁面會變成防護頁面。 任何嘗試讀取或寫入防護頁面,都會讓系統引發STATUS_GUARD_PAGE例外狀況。 因此,防護頁面會作為單次存取警示。 此旗標是頁面保護修飾詞,只有在搭配PAGE_NOACCESS以外的其中一個頁面保護旗標使用時才有效。 當存取嘗試導致系統關閉防護頁面狀態時,基礎頁面保護會接管。 如果在系統服務期間發生防護頁面例外狀況,服務通常會傳回失敗狀態指示器。
PAGE_NOCACHE 頁面的區域應該配置為不可快取。 區段不允許PAGE_NOCACHE。
PAGE_WRITECOMBINE 啟用寫入結合,也就是將寫入從快取聯合到主要記憶體,其中硬體支援它。 此旗標主要用於框架緩衝區內存,因此在寫入裝置之前,會盡可能合併相同的快取行。 這可大幅減少整個總線的寫入,例如 () 視訊記憶體。 如果硬體不支持合併寫入,則會忽略 旗標。 此旗標是頁面保護修飾詞,只有在搭配PAGE_NOACCESS以外的其中一個頁面保護旗標使用時才有效。

傳回值

ZwAllocateVirtualMemory 會傳回STATUS_SUCCESS或錯誤狀態代碼。 可能的錯誤狀態代碼包括:

備註

ZwAllocateVirtualMemory 可以執行下列作業:

  • 認可先前呼叫 ZwAllocateVirtualMemory 所保留的頁面區域。

  • 保留免費頁面的區域。

  • 保留並認可免費頁面的區域。

核心模式驅動程式可以使用 ZwAllocateVirtualMemory ,在指定的程式中保留一系列可存取的應用程式虛擬位址,然後對 ZwAllocateVirtualMemory 進行其他呼叫,以認可保留範圍中的個別頁面。 這可讓程式保留其虛擬位址空間的範圍,而不需要耗用實體記憶體,直到需要為止。

進程虛擬位址空間中的每個頁面都位於下表所述的三種狀態之一。

狀態 意義
FREE 頁面未認可或保留,而且無法供進程存取。 ZwAllocateVirtualMemory 可以保留或同時保留並認可免費頁面。
已保留 其他配置函式無法使用位址範圍,但無法供進程存取,而且沒有與其相關聯的實體記憶體。 ZwAllocateVirtualMemory 可以認可保留的頁面,但無法再次保留。 ZwFreeVirtualMemory 可以釋放保留的頁面,使其成為免費頁面。
承諾 實體記憶體會配置給頁面,且存取權是由保護程式碼所控制。 系統只會在第一次嘗試讀取或寫入該頁面時,初始化並載入每個認可的頁面。 當進程終止時,系統會釋放已認可頁面的記憶體。 ZwAllocateVirtualMemory 可以認可已認可的頁面。 這表示不論頁面是否已認可,您都可以認可一系列頁面,而且函式不會失敗。 ZwFreeVirtualMemory 可以取消認可頁面、釋放頁面的記憶體,也可以同時取消認可並釋放認可的頁面。

呼叫 ZwAllocateVirtualMemory 所配置的記憶體,必須藉由呼叫 ZwFreeVirtualMemory 釋放。

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

注意

如果對 ZwAllocateVirtualMemory 函式的呼叫發生在使用者模式中,您應該使用名稱 “NtAllocateVirtualMemory”,而不是 “ZwAllocateVirtualMemory”。

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

規格需求

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

另請參閱

使用原生系統服務例程的 Nt 和 Zw 版本

ZwFreeVirtualMemory