Fungsi VirtualAllocFromApp (memoryapi.h)

Mencadangkan, menerapkan, atau mengubah status wilayah halaman di ruang alamat virtual proses panggilan. Memori yang dialokasikan oleh fungsi ini secara otomatis diinisialisasi ke nol.

Sintaks

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

Parameter

[in, optional] BaseAddress

Alamat awal wilayah yang akan dialokasikan. Jika memori sedang dicadangkan, alamat yang ditentukan dibulatkan ke kelipatan terdekat dari granularitas alokasi. Jika memori sudah dicadangkan dan sedang dilakukan, alamat dibulatkan ke bawah ke batas halaman berikutnya. Untuk menentukan ukuran halaman dan granularitas alokasi pada komputer host, gunakan fungsi GetSystemInfo . Jika parameter ini ADALAH NULL, sistem menentukan tempat untuk mengalokasikan wilayah.

[in] Size

Ukuran wilayah, dalam byte. Jika parameter BaseAddress adalah NULL, nilai ini dibulatkan ke atas ke batas halaman berikutnya. Jika tidak, halaman yang dialokasikan mencakup semua halaman yang berisi satu atau beberapa byte dalam rentang dari BaseAddress hingga Ukuran BaseAddress+. Ini berarti bahwa rentang 2-byte yang terdampar pada batas halaman menyebabkan kedua halaman disertakan dalam wilayah yang dialokasikan.

[in] AllocationType

Jenis alokasi memori. Parameter ini harus berisi salah satu nilai berikut.

Nilai Makna
MEM_COMMIT
0x00001000
Mengalokasikan biaya memori (dari ukuran keseluruhan memori dan file halaman pada disk) untuk halaman memori yang dipesan yang ditentukan. Fungsi ini juga menjamin bahwa ketika penelepon awalnya mengakses memori, kontennya akan menjadi nol. Halaman fisik aktual tidak dialokasikan kecuali/sampai alamat virtual benar-benar diakses.

Untuk memesan dan menerapkan halaman dalam satu langkah, panggil VirtualAllocFromApp dengan MEM_COMMIT | MEM_RESERVE.

Mencoba menerapkan rentang alamat tertentu dengan menentukan MEM_COMMIT tanpa MEM_RESERVE dan BaseAddressnon-NULL gagal kecuali seluruh rentang telah dicadangkan. Kode kesalahan yang dihasilkan ERROR_INVALID_ADDRESS.

Upaya untuk menerapkan halaman yang sudah diterapkan tidak menyebabkan fungsi gagal. Ini berarti Anda dapat menerapkan halaman tanpa terlebih dahulu menentukan status komitmen saat ini dari setiap halaman.

MEM_RESERVE
0x00002000
Mencadangkan berbagai ruang alamat virtual proses tanpa mengalokasikan penyimpanan fisik aktual dalam memori atau dalam file halaman pada disk.

Anda dapat menerapkan halaman yang dipesan dalam panggilan berikutnya ke fungsi VirtualAllocFromApp . Untuk memesan dan menerapkan halaman dalam satu langkah, panggil VirtualAllocFromApp dengan MEM_RESERVE MEM_COMMIT | .

Fungsi alokasi memori lainnya, seperti malloc dan LocalAlloc, tidak dapat menggunakan rentang memori yang dipesan hingga dilepaskan.

MEM_RESET
0x00080000
Menunjukkan bahwa data dalam rentang memori yang ditentukan oleh BaseAddress dan Ukuran tidak lagi menarik. Halaman tidak boleh dibaca dari atau ditulis ke file halaman. Namun, blok memori akan digunakan lagi nanti, sehingga tidak boleh dinonaktifkan. Nilai ini tidak dapat digunakan dengan nilai lain.

Menggunakan nilai ini tidak menjamin bahwa rentang yang dioperasikan dengan MEM_RESET akan berisi nol. Jika Anda ingin rentang berisi nol, nonaktifkan memori lalu lakukan recommit.

Saat Anda menentukan MEM_RESET, fungsi VirtualAllocFromApp mengabaikan nilai Perlindungan. Namun, Anda masih harus mengatur Perlindungan ke nilai perlindungan yang valid, seperti PAGE_NOACCESS.

VirtualAllocFromApp mengembalikan kesalahan jika Anda menggunakan MEM_RESET dan rentang memori dipetakan ke file. Tampilan bersama hanya dapat diterima jika dipetakan ke file halaman.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO hanya boleh dipanggil pada rentang alamat yang MEM_RESET berhasil diterapkan sebelumnya. Ini menunjukkan bahwa data dalam rentang memori yang ditentukan oleh BaseAddress dan Ukuran menarik bagi pemanggil dan mencoba membalikkan efek MEM_RESET. Jika fungsi berhasil, itu berarti semua data dalam rentang alamat yang ditentukan utuh. Jika fungsi gagal, setidaknya beberapa data dalam rentang alamat telah diganti dengan nol.

Nilai ini tidak dapat digunakan dengan nilai lain. Jika MEM_RESET_UNDO dipanggil pada rentang alamat yang tidak MEM_RESET sebelumnya, perilaku tersebut tidak ditentukan. Saat Anda menentukan MEM_RESET, fungsi VirtualAllocFromApp mengabaikan nilai Perlindungan. Namun, Anda masih harus mengatur Perlindungan ke nilai perlindungan yang valid, seperti PAGE_NOACCESS.

 

Parameter ini juga dapat menentukan nilai berikut seperti yang ditunjukkan.

Nilai Makna
MEM_LARGE_PAGES
0x20000000
Mengalokasikan memori menggunakan dukungan halaman besar.

Ukuran dan perataan harus kelipatan minimum halaman besar. Untuk mendapatkan nilai ini, gunakan fungsi GetLargePageMinimum .

Jika Anda menentukan nilai ini, Anda juga harus menentukan MEM_RESERVE dan MEM_COMMIT.

MEM_PHYSICAL
0x00400000
Mencadangkan rentang alamat yang dapat digunakan untuk memetakan halaman Address Windowing Extensions (AWE).

Nilai ini harus digunakan dengan MEM_RESERVE dan tidak ada nilai lain.

MEM_TOP_DOWN
0x00100000
Mengalokasikan memori pada alamat setinggi mungkin. Ini bisa lebih lambat daripada alokasi biasa, terutama ketika ada banyak alokasi.
MEM_WRITE_WATCH
0x00200000
Menyebabkan sistem melacak halaman yang ditulis di wilayah yang dialokasikan. Jika Anda menentukan nilai ini, Anda juga harus menentukan MEM_RESERVE.

Untuk mengambil alamat halaman yang telah ditulis sejak wilayah dialokasikan atau status pelacakan tulis direset, panggil fungsi GetWriteWatch . Untuk mengatur ulang status pelacakan tulis, panggil GetWriteWatch atau ResetWriteWatch. Fitur pelacakan tulis tetap diaktifkan untuk wilayah memori hingga wilayah dibebaskan.

[in] Protection

Perlindungan memori untuk wilayah halaman yang akan dialokasikan. Jika halaman sedang diterapkan, Anda dapat menentukan salah satu konstanta perlindungan memori. Konstanta berikut menghasilkan kesalahan:

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

Nilai kembali

Jika fungsi berhasil, nilai yang dikembalikan adalah alamat dasar dari wilayah halaman yang dialokasikan.

Jika fungsi gagal, nilai yang dikembalikan adalah NULL. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Anda dapat memanggil VirtualAllocFromApp dari aplikasi Windows Store dengan kemampuan just-in-time (JIT) untuk menggunakan fungsionalitas JIT. Aplikasi harus menyertakan kemampuan codeGeneration dalam file manifes aplikasi untuk menggunakan kemampuan JIT.

Setiap halaman memiliki status halaman terkait. Fungsi VirtualAllocFromApp dapat melakukan operasi berikut:

  • Menerapkan wilayah halaman yang dipesan
  • Pesan wilayah halaman gratis
  • Cadangkan dan terapkan wilayah halaman gratis secara bersamaan
VirtualAllocFromApp tidak dapat memesan halaman yang dipesan. Ini dapat menerapkan halaman yang sudah diterapkan. Ini berarti Anda dapat melakukan rentang halaman, terlepas dari apakah halaman tersebut telah diterapkan, dan fungsinya tidak akan gagal.

Anda dapat menggunakan VirtualAllocFromApp untuk memesan blok halaman lalu melakukan panggilan tambahan ke VirtualAllocFromApp untuk menerapkan halaman individual dari blok yang dipesan. Ini memungkinkan proses untuk memesan berbagai ruang alamat virtualnya tanpa mengkonsumsi penyimpanan fisik sampai diperlukan.

Jika parameter BaseAddress bukan NULL, fungsi menggunakan parameter BaseAddress dan Ukuran untuk menghitung wilayah halaman yang akan dialokasikan. Status saat ini dari seluruh rentang halaman harus kompatibel dengan jenis alokasi yang ditentukan oleh parameter AllocationType . Jika tidak, fungsi gagal dan tidak ada halaman yang dialokasikan. Persyaratan kompatibilitas ini tidak menghalangi penerapan halaman yang sudah diterapkan, seperti yang disebutkan sebelumnya.

VirtualAllocFromApp tidak mengizinkan pembuatan halaman yang dapat dieksekusi.

Fungsi VirtualAllocFromApp dapat digunakan untuk memesan wilayah memori Address Windowing Extensions (AWE) dalam ruang alamat virtual dari proses yang ditentukan. Wilayah memori ini kemudian dapat digunakan untuk memetakan halaman fisik ke dalam dan kehabisan memori virtual seperti yang diperlukan oleh aplikasi. Nilai MEM_PHYSICAL dan MEM_RESERVE harus diatur dalam parameter AllocationType . Nilai MEM_COMMIT tidak boleh diatur. Perlindungan halaman harus diatur ke PAGE_READWRITE.

Fungsi VirtualFree dapat menonaktifkan halaman yang diterapkan, merilis penyimpanan halaman, atau secara bersamaan dapat menonaktifkan dan merilis halaman yang diterapkan. Ini juga dapat merilis halaman yang dipesan, menjadikannya halaman gratis.

Saat membuat wilayah yang akan dapat dieksekusi, program panggilan bertanggung jawab untuk memastikan koherensi cache melalui panggilan yang sesuai ke FlushInstructionCache setelah kode ditetapkan. Jika tidak, upaya untuk mengeksekusi kode dari wilayah yang baru dieksekusi dapat menghasilkan hasil yang tidak dapat diprediksi.

Persyaratan

   
Klien minimum yang didukung Windows 10 [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2016 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header memoryapi.h (termasuk Windows.h)
Pustaka WindowsApp.lib
DLL Kernel32.dll

Lihat juga

Fungsi Manajemen Memori

Fungsi Memori Virtual

VirtualAlloc

VirtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

VirtualQuery