VirtualAllocFromApp 函式 (memoryapi.h)

在呼叫程式的虛擬位址空間中保留、認可或變更頁面區域的狀態。 此函式配置的記憶體會自動初始化為零。

語法

PVOID VirtualAllocFromApp(
  [in, optional] PVOID  BaseAddress,
  [in]           SIZE_T Size,
  [in]           ULONG  AllocationType,
  [in]           ULONG  Protection
);

參數

[in, optional] BaseAddress

要配置之區域的起始位址。 如果保留記憶體,則指定的位址會四捨五入到最接近的配置資料細微性倍數。 如果記憶體已保留且正在認可,則位址會進位至下一個頁面界限。 若要判斷頁面的大小和主機電腦上的配置細微性,請使用 GetSystemInfo 函式。 如果此參數為 Null,系統會決定配置區域的位置。

[in] Size

區域的大小,以位元組為單位。 如果 BaseAddress 參數為 Null,這個值會進位到下一個頁面界限。 否則,配置的頁面會包含範圍中包含一或多個位元組的所有頁面,範圍從BaseAddress 到 BaseAddress+Size 這表示跨頁面界限的 2 位元組範圍會導致這兩個頁面都包含在配置的區域中。

[in] AllocationType

記憶體配置的類型。 此參數必須包含下列其中一個值。

意義
MEM_COMMIT
0x00001000
針對指定的保留記憶體頁面,配置記憶體費用 (磁片上的整體大小和分頁檔案) 。 函式也保證當呼叫端稍後存取記憶體時,內容會是零。 除非實際存取虛擬位址,否則不會配置實際實體頁面。

若要在一個步驟中保留和認可頁面,請使用 呼叫 VirtualAllocFromAppMEM_COMMIT | MEM_RESERVE

除非已保留整個範圍,否則嘗試指定沒有MEM_RESERVE的MEM_COMMIT,且NullBaseAddress會失敗,以認可特定位址範圍。 產生的錯誤碼 ERROR_INVALID_ADDRESS

嘗試認可已認可的頁面並不會讓函式失敗。 這表示您可以認可頁面,而不需要先判斷每個頁面的目前承諾用量狀態。

MEM_RESERVE
0x00002000
保留進程虛擬位址空間的範圍,而不需在記憶體或磁片上的分頁檔案中配置任何實際實體儲存體。

您可以在 對 VirtualAllocFromApp 函式的後續呼叫中認可保留的頁面。 若要在一個步驟中保留和認可頁面,請使用MEM_COMMIT | MEM_RESERVE 呼叫VirtualAllocFromApp

其他記憶體配置函式,例如 mallocLocalAlloc,在釋放記憶體之前,無法使用保留的記憶體範圍。

MEM_RESET
0x00080000
表示 BaseAddressSize 所指定的記憶體範圍中的資料不再感興趣。 頁面不應該讀取或寫入至分頁檔案。 不過,稍後會再次使用記憶體區塊,因此不應予以認可。 此值不能與任何其他值搭配使用。

使用此值不保證以 MEM_RESET 運作的範圍會包含零。 如果您想要範圍包含零,請取消認可記憶體,然後重新認可它。

當您指定 MEM_RESET時VirtualAllocFromApp 函式會忽略 Protection的值。 不過,您仍必須將 Protection 設定為有效的保護值,例如 PAGE_NOACCESS

如果您使用MEM_RESET,且記憶體範圍對應至檔案,VirtualAllocFromApp會傳回錯誤。 只有在共用檢視對應至分頁檔案時才可接受。

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO 應該只在先前成功套用 MEM_RESET 的位址範圍上呼叫。 它表示 BaseAddress 所指定的記憶體範圍和 Size 中的資料對呼叫端感興趣,並嘗試反轉 MEM_RESET的效果。 如果函式成功,這表示指定位址範圍中的所有資料都保持不變。 如果函式失敗,則位址範圍中至少有一些資料已取代為零。

此值不能與任何其他值搭配使用。 如果在先前未MEM_RESET的位址範圍上呼叫MEM_RESET_UNDO,則行為未定義。 當您指定 MEM_RESET時VirtualAllocFromApp 函式會忽略 Protection的值。 不過,您仍必須將 Protection 設定為有效的保護值,例如 PAGE_NOACCESS

 

此參數也可以依指示指定下列值。

意義
MEM_LARGE_PAGES
0x20000000
使用 大型頁面支援來配置記憶體。

大小和對齊方式必須是大頁最小值的倍數。 若要取得此值,請使用 GetLargePageMinimum 函式。

如果您指定此值,您也必須指定 MEM_RESERVEMEM_COMMIT

MEM_PHYSICAL
0x00400000
保留可用來對應 位址視窗延伸 模組的位址範圍, (AWE) 頁面。

此值必須與 MEM_RESERVE 搭配使用,且沒有其他值。

MEM_TOP_DOWN
0x00100000
以最高可能位址配置記憶體。 這比一般配置慢,特別是在有許多配置時。
MEM_WRITE_WATCH
0x00200000
讓系統追蹤已配置區域中寫入的頁面。 如果您指定這個值,您也必須指定 MEM_RESERVE

若要擷取自配置區域或重設寫入追蹤狀態以來已寫入的頁面位址,請呼叫 GetWriteWatch 函式。 若要重設寫入追蹤狀態,請呼叫 GetWriteWatchResetWriteWatch。 寫入追蹤功能仍會針對記憶體區域啟用,直到釋放區域為止。

[in] Protection

要配置之頁面區域的記憶體保護。 如果認可頁面,您可以指定其中一個 記憶體保護常數。 下列常數會產生錯誤:

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

傳回值

如果函式成功,則傳回值是頁面配置區域的基底位址。

如果函式失敗,則傳回值為 Null。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

備註

您可以從具有 Just-In-Time (JIT) 功能的 Windows 市集應用程式呼叫 VirtualAllocFromApp ,以使用 JIT 功能。 應用程式必須在應用程式資訊清單檔案中包含 codeGeneration 功能,才能使用 JIT 功能。

每個頁面都有相關聯的 頁面狀態VirtualAllocFromApp函式可以執行下列作業:

  • 認可保留頁面的區域
  • 保留免費頁面的區域
  • 同時保留並認可免費頁面的區域
VirtualAllocFromApp 無法保留保留的頁面。 它可以認可已經認可的頁面。 這表示不論頁面是否已認可,您都可以認可一系列頁面,而且函式不會失敗。

您可以使用 VirtualAllocFromApp 來保留頁面區塊,然後對 VirtualAllocFromApp 進行其他呼叫,以認可保留區塊中的個別頁面。 這可讓程式保留其虛擬位址空間的範圍,而不需要耗用實體儲存體,直到需要為止。

如果 BaseAddress 參數不是 Null,函式會使用 BaseAddressSize 參數來計算要配置的頁面區域。 整個頁面範圍的目前狀態必須與 AllocationType 參數所指定的配置類型相容。 否則,函式會失敗,而且不會配置任何頁面。 此相容性需求不會排除認可已認可的頁面,如先前所述。

VirtualAllocFromApp 不允許建立可執行檔頁面。

VirtualAllocFromApp函式可用來在指定進程的虛擬位址空間內保留 AWE (AWE) 記憶體區域的位址視窗延伸模組。 然後,您可以使用此記憶體區域,將實體頁面對應至應用程式所需的虛擬記憶體和移出。 MEM_PHYSICAL和MEM_RESERVE值必須在AllocationType參數中設定。 不得設定 MEM_COMMIT 值。 頁面保護必須設定為 PAGE_READWRITE

VirtualFree函式可以取消認可頁面、釋放頁面的儲存體,也可以同時取消認可並釋放認可的頁面。 它也可以釋放保留的頁面,使其成為免費頁面。

建立將可執行檔區域時,呼叫程式會負責在程式碼設定完成後,透過對 FlushInstructionCache 的適當呼叫確保快取共通。 否則,嘗試從新執行的區域執行程式碼可能會產生無法預測的結果。

需求

   
最低支援的用戶端 Windows 10 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2016 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 memoryapi.h (包括 Windows.h)
程式庫 WindowsApp.lib
DLL Kernel32.dll

另請參閱

記憶體管理功能

虛擬記憶體函式

VirtualAlloc

VirtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

VirtualQuery