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 進行其他呼叫,以認可保留範圍中的個別頁面。 這可讓進程保留其虛擬位址空間的範圍,而不需要取用實體記憶體,直到需要為止。
處理程式虛擬位址空間中的每個頁面都位於下表所述的三種狀態之一。
州 | 意義 |
---|---|
自由 | 頁面未認可或保留,且無法存取進程。 ZwAllocateVirtualMemory 可以保留或同時保留並認可免費頁面。 |
保留 | 其他配置函式無法使用位址範圍,但進程無法存取頁面,而且沒有與其相關聯的實體記憶體。 ZwAllocateVirtualMemory 可以認可保留頁面,但無法第二次保留頁面。 ZwFreeVirtualMemory 可以釋出保留頁面,使其成為免費頁面。 |
承諾 | 實體記憶體會配置給頁面,而存取權是由保護程式碼所控制。 系統只會在第一次嘗試讀取或寫入該頁面時,初始化並載入每個認可的頁面到物理記憶體中。 當進程終止時,系統會釋放已認可頁面的記憶體。 ZwAllocateVirtualMemory 可以認可已認可的頁面。 這表示不論頁面是否已認可,您都可以認可一系列頁面,而且函式不會失敗。 ZwFreeVirtualMemory 可以取消認可頁面、釋放頁面的記憶體,或是同時解除認可和釋放認可的頁面。 |
呼叫 ZwAllocateVirtualMemory 所配置的記憶體,必須藉由 呼叫 ZwFreeVirtualMemory來釋放。
如需記憶體管理的詳細資訊,請參閱 Windows 驅動程式的記憶體管理。
注意
如果在使用者模式中呼叫 ZwAllocateVirtualMemory 函式,您應該使用名稱 “NtAllocateVirtualMemory”,而不是 “ZwAllocateVirtualMemory”。
對於內核模式驅動程式的呼叫,NtXxx 和 ZwXxx 版本的 Windows 原生系統服務例程,在處理和解譯輸入參數的方式上可能會有不同的行為。 如需 nt NtXxx 與 ZwXxx 例程之間關聯性的詳細資訊,請參閱 使用 Nt 和 Zw 版本的原生系統服務例程。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 |
目標平臺 | 普遍 |
標頭 | ntifs.h (include Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIS(storport)、PowerIrpDDis(wdm)、SpNoWait(storport)、StorPortStartIo(storport) |