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 的初始值會指定區域的大小,以位元組為單位,並四捨五入至下一個主機頁面大小界限。 Input 上的 RegionSize 不能為零。
[in] AllocationType
位掩碼,包含旗標,指定要針對指定頁面區域執行的配置類型。 下表描述最常見的旗標。 如需可能旗標和描述的完整清單,請參閱 VirtualAlloc 。
注意
必須設定MEM_COMMIT、MEM_RESET或MEM_RESERVE。
旗標 | 意義 |
---|---|
MEM_COMMIT | 要認可頁面的指定區域。 |
MEM_RESERVE | 要保留頁面的指定區域。 |
MEM_RESET | 重設指定區域的狀態,使頁面位於分頁檔案中,則會捨棄它們,並將零頁帶入。 如果頁面位於記憶體中並修改,則會標示為未修改,因此不會寫出到分頁檔案。 內容 不會 為零。 未使用 Protect 參數,但必須設定為有效的值。 如果已設定MEM_RESET,則無法設定其他旗標。 |
其他MEM_XXX 旗標 | 請參閱 VirtualAlloc。 |
[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 進行其他呼叫,以認可保留範圍中的個別頁面。 這可讓進程保留其虛擬位址空間的範圍,而不需要耗用實體記憶體,直到需要為止。
進程虛擬位址空間中的每個頁面都處於下表所述的三種狀態之一。
狀態 | 意義 |
---|---|
FREE | 頁面未認可或保留,而且無法供進程存取。 NtAllocateVirtualMemory 可以保留或同時保留並認可免費頁面。 |
已保留 | 其他配置函式無法使用位址範圍,但無法供進程存取,而且沒有與其相關聯的實體記憶體。 NtAllocateVirtualMemory 可以認可保留的頁面,但無法再次保留。 NtFreeVirtualMemory 可以釋放保留的頁面,使其成為免費頁面。 |
承諾 | 實體記憶體會配置給頁面,且存取權是由保護程式碼所控制。 系統只會在第一次嘗試讀取或寫入該頁面時,初始化並載入每個認可的頁面。 當進程終止時,系統會釋放已認可頁面的記憶體。 NtAllocateVirtualMemory 可以認可已認可的頁面。 這表示不論頁面是否已認可,您都可以認可一系列頁面,而且函式不會失敗。 NtFreeVirtualMemory 可以取消認可頁面、釋放頁面的記憶體,也可以同時取消認可並釋放認可的頁面。 |
呼叫 NtAllocateVirtualMemory 所配置的記憶體,必須藉由呼叫 NtFreeVirtualMemory 釋放。
如需記憶體管理的詳細資訊,請參閱 Windows 驅動程式的記憶體管理。
注意如果呼叫 NtAllocateVirtualMemory 函式發生在使用者模式中,您應該使用名稱 “NtAllocateVirtualMemory”,而不是 “ZwAllocateVirtualMemory”。
對於核心模式驅動程式的呼叫,Windows 原生系統服務例程的 NtXxx 和 ZwXxx 版本在處理和解譯輸入參數的方式可能會有不同的行為。 如需例程 NtXxx 和 ZwXxx 版本之間的關聯性詳細資訊,請參閱 使用 Nt 和 Zw 版本的原生系統服務例程。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 |
目標平台 | Universal |
標頭 | ntifs.h (包含 Ntifs.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDDIs、PowerIrpDDis、SpNoWait、StorPortStartIo |