NtAllocateVirtualMemory 函式 (ntifs.h)
NtAllocateVirtualMemory 例程會保留、認可或兩者,指定進程的使用者模式虛擬位址空間內的頁面區域。
語法
__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
[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
將接收頁面所配置區域基位址之變數的指標。 如果 BaseAddress 的初始值非NULL,則會從向下捨入到下一個主機頁面大小位址界限的指定虛擬位址開始配置區域。 如果 BaseAddress 的初始值 NULL,則作系統會決定配置區域的位置。
[in] ZeroBits
區段檢視基地址中必須為零的高序位址位數目。 只有在作系統決定要配置區域的位置時使用,如同 當baseAddress* NULL時。 請注意,當 ZeroBits 大於 32 時,它就會變成位掩碼。
[in, out] RegionSize
變數的指標,將接收頁面所配置區域的實際大小,以位元組為單位。 RegionSize 的初始值 會指定區域的大小,並以位元組為單位,並四捨五入至下一個主機頁面大小界限。 RegionSize 在輸入上不能為零。
[in] AllocationType
位掩碼,包含指定要針對頁面指定區域執行之配置類型的旗標。 下表描述最常見的旗標。 如需可能旗標和描述的完整清單,請參閱 VirtualAlloc。
注意
必須設定MEM_COMMIT、MEM_RESET或MEM_RESERVE之一。
[in] Protect
位掩碼,包含頁面保護旗標,指定頁面認可區域所需的保護。 下表描述這些旗標。
旗 | 意義 |
---|---|
PAGE_NOACCESS | 不允許存取已認可的頁面區域。 嘗試讀取、寫入或執行認可的區域會導致存取違規例外狀況,稱為一般保護 (GP) 錯誤。 |
PAGE_READONLY | 允許唯讀並執行頁面認可區域的存取權。 嘗試寫入認可的區域會導致存取違規。 |
PAGE_READWRITE | 允許讀取、寫入和執行頁面認可區域的存取權。 如果允許基礎區段的寫入存取權,則會共用頁面的單一複本。 否則,頁面會在寫入時共用唯讀/複製。 |
PAGE_EXECUTE | 允許對已認可的頁面區域執行存取。 嘗試讀取或寫入認可的區域會導致存取違規。 |
PAGE_EXECUTE_READ | 允許執行和讀取已認可頁面區域的存取權。 嘗試寫入認可的區域會導致存取違規。 |
PAGE_GUARD | 區域中的頁面會變成防護頁面。 任何讀取或寫入防護頁面的嘗試都會讓系統引發STATUS_GUARD_PAGE例外狀況。 因此,防護頁面可作為單次訪問警報。 此旗標是頁面保護修飾詞,只有在搭配PAGE_NOACCESS以外的其中一個頁面保護旗標使用時才有效。 當存取嘗試導致系統關閉防護頁面狀態時,基礎頁面保護會接管。 如果在系統服務期間發生防護頁面例外狀況,服務通常會傳回失敗狀態指示器。 |
PAGE_NOCACHE | 頁面的區域應該配置為不可快取。 區段不允許PAGE_NOCACHE。 |
PAGE_WRITECOMBINE | 啟用寫入結合,也就是將寫入從快取合併到主要記憶體,其中硬體支援它。 此旗標主要用於框架緩衝區內存,以便在寫入裝置之前,盡可能合併寫入相同的快取行。 這可大幅減少跨總線寫入到 (例如) 視訊記憶體。 如果硬體不支持合併寫入,則會忽略 旗標。 此旗標是頁面保護修飾詞,只有在搭配PAGE_NOACCESS以外的其中一個頁面保護旗標使用時才有效。 |
傳回值
NtAllocateVirtualMemory 會傳回STATUS_SUCCESS或錯誤狀態代碼。 可能的錯誤狀態代碼包括下列專案:
- STATUS_ACCESS_DENIED
- STATUS_ALREADY_COMMITTED
- STATUS_COMMITMENT_LIMIT
- STATUS_CONFLICTING_ADDRESSES
- STATUS_INSUFFICIENT_RESOURCES
- STATUS_INVALID_HANDLE
- STATUS_INVALID_PAGE_PROTECTION
- STATUS_NO_MEMORY
- STATUS_OBJECT_TYPE_MISMATCH
- STATUS_PROCESS_IS_TERMINATING
言論
NtAllocateVirtualMemory 可以執行下列作業:
- 認可先前呼叫 NtAllocateVirtualMemory所保留的頁面區域。
- 保留免費頁面的區域。
- 保留並認可免費頁面的區域。
內核模式驅動程式可以使用 NtAllocateVirtualMemory,在指定的程式中保留一系列應用程式可存取的虛擬位址,然後對 ntAllocateVirtualMemory 進行其他呼叫,以認可保留範圍中的個別頁面。 這可讓進程保留其虛擬位址空間的範圍,而不需要取用實體記憶體,直到需要為止。
處理程式虛擬位址空間中的每個頁面都位於下表所述的三種狀態之一。
州 | 意義 |
---|---|
自由 | 頁面未認可或保留,且無法存取進程。 NtAllocateVirtualMemory 可以保留或同時保留並認可免費頁面。 |
保留 | 其他配置函式無法使用位址範圍,但進程無法存取頁面,而且沒有與其相關聯的實體記憶體。 NtAllocateVirtualMemory 可以認可保留頁面,但無法第二次保留頁面。 NtFreeVirtualMemory 可以釋出保留頁面,使其成為免費頁面。 |
承諾 | 實體記憶體會配置給頁面,而存取權是由保護程式碼所控制。 系統只會在第一次嘗試讀取或寫入該頁面時,初始化並載入每個認可的頁面到物理記憶體中。 當進程終止時,系統會釋放已認可頁面的記憶體。 NtAllocateVirtualMemory 可以認可已認可的頁面。 這表示不論頁面是否已認可,您都可以認可一系列頁面,而且函式不會失敗。 NtFreeVirtualMemory 可以取消認可頁面、釋放頁面的記憶體,或同時取消認可和釋放認可的頁面。 |
呼叫 NtAllocateVirtualMemory 所配置的記憶體,必須藉由 呼叫 ntFreeVirtualMemory來釋放。
如需記憶體管理的詳細資訊,請參閱 Windows 驅動程式的記憶體管理。
注意 如果在使用者模式中呼叫 NtAllocateVirtuateVirtualMemory 函式,您應該使用名稱 “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 合規性規則 | HwStorPortProhibitedDDIs、PowerIrpDDis、SpNoWait、StorPortStartIo |