Bagikan melalui


Fungsi VirtualAllocEx (memoryapi.h)

Mencadangkan, menerapkan, atau mengubah status wilayah memori dalam ruang alamat virtual dari proses yang ditentukan. Fungsi ini menginisialisasi memori yang dialokasikan ke nol.

Untuk menentukan simpul NUMA untuk memori fisik, lihat VirtualAllocExNuma.

Sintaksis

LPVOID VirtualAllocEx(
  [in]           HANDLE hProcess,
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect
);

Parameter

[in] hProcess

Handel ke proses. Fungsi ini mengalokasikan memori dalam ruang alamat virtual proses ini.

Handel harus memiliki akses PROCESS_VM_OPERATION yang tepat. Untuk informasi selengkapnya, lihat Keamanan Proses dan Hak Akses.

[in, optional] lpAddress

Penunjuk yang menentukan alamat awal yang diinginkan untuk wilayah halaman yang ingin Anda alokasikan.

Jika Anda menyimpan memori, fungsi membulatkan alamat ini ke kelipatan granularitas alokasi terdekat.

Jika Anda menerapkan memori yang sudah dicadangkan, fungsi membulatkan alamat ini ke bawah ke batas halaman terdekat. Untuk menentukan ukuran halaman dan granularitas alokasi pada komputer host, gunakan fungsi GetSystemInfo.

Jika lpAddressNULL, fungsi menentukan tempat untuk mengalokasikan wilayah.

Jika alamat ini berada dalam enklave yang belum Anda inisialisasi dengan memanggil InitializeEnclave, VirtualAllocEx mengalokasikan halaman nol untuk enklave di alamat tersebut. Halaman sebelumnya harus tidak dikomit, dan tidak akan diukur dengan instruksi EEXTEND dari model pemrograman Intel Software Guard Extensions.

Jika alamat dalam enklave yang Anda inisialisasi, maka operasi alokasi gagal dengan kesalahan ERROR_INVALID_ADDRESS. Itu berlaku untuk enklave yang tidak mendukung manajemen memori dinamis (yaitu SGX1). Enklave SGX2 akan mengizinkan alokasi, dan halaman harus diterima oleh enklave setelah dialokasikan.

[in] dwSize

Ukuran wilayah memori yang akan dialokasikan, dalam byte.

Jika lpAddress null, fungsi membulatkan dwSize hingga batas halaman berikutnya.

Jika lpAddress tidak null, fungsi mengalokasikan semua halaman yang berisi satu atau beberapa byte dalam rentang dari lpAddress hingga lpAddressdwSize. Ini berarti, misalnya, bahwa rentang 2 byte yang melekat pada batas halaman menyebabkan fungsi mengalokasikan kedua halaman.

[in] flAllocationType

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

Nilai Arti
MEM_COMMIT
0x00001000
Mengalokasikan biaya memori (dari ukuran keseluruhan memori dan file halaman pada disk) untuk halaman memori cadangan 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 VirtualAllocEx dengan MEM_COMMIT | MEM_RESERVE.

Mencoba menerapkan rentang alamat tertentu dengan menentukan MEM_COMMIT tanpa MEM_RESERVE dan NULL non-lpAddress 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.

Jika lpAddress menentukan alamat dalam enklave, flAllocationType harus MEM_COMMIT.

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

Anda menerapkan halaman yang dipesan dengan memanggil VirtualAllocEx lagi dengan MEM_COMMIT. Untuk memesan dan menerapkan halaman dalam satu langkah, panggil VirtualAllocEx dengan MEM_COMMIT | MEM_RESERVE.

Fungsi alokasi memori lainnya, seperti malloc dan LocalAlloc, tidak dapat menggunakan memori cadangan sampai dirilis.

MEM_RESET
0x00080000
Menunjukkan bahwa data dalam rentang memori yang ditentukan oleh lpAddress dan dwSize 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 kirim ulang.

Saat Anda menggunakan MEM_RESET, fungsi VirtualAllocEx mengabaikan nilai fProtect. Namun, Anda masih harus mengatur fProtect ke nilai perlindungan yang valid, seperti PAGE_NOACCESS.

VirtualAllocEx 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 lpAddress dan dwSize 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 VirtualAllocEx mengabaikan nilai flProtect. Namun, Anda masih harus mengatur flProtect ke nilai perlindungan yang valid, seperti PAGE_NOACCESS.

Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 dan Windows XP: Bendera MEM_RESET_UNDO tidak didukung hingga Windows 8 dan Windows Server 2012.

 

Parameter ini juga dapat menentukan nilai berikut seperti yang ditunjukkan.

Nilai Arti
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.

[in] flProtect

Perlindungan memori untuk wilayah halaman yang akan dialokasikan. Jika halaman diterapkan, Anda dapat menentukan salah satu konstanta perlindungan memori .

Jika lpAddress menentukan alamat dalam enklave, flProtect tidak boleh salah satu dari nilai berikut:

  • PAGE_NOACCESS
  • PAGE_GUARD
  • PAGE_NOCACHE
  • PAGE_WRITECOMBINE

Saat mengalokasikan memori dinamis untuk enklave, parameter flProtect harus PAGE_READWRITE atau PAGE_EXECUTE_READWRITE.

Mengembalikan nilai

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

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

Komentar

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

  • Menerapkan wilayah halaman yang dipesan
  • Memesan wilayah halaman gratis
  • Secara bersamaan memesan dan menerapkan wilayah halaman gratis
VirtualAllocEx tidak dapat memesan halaman yang dipesan. Ini dapat menerapkan halaman yang sudah diterapkan. Ini berarti Anda dapat menerapkan rentang halaman, terlepas dari apakah halaman tersebut telah diterapkan, dan fungsi tidak akan gagal.

Anda dapat menggunakan VirtualAllocEx untuk memesan blok halaman dan kemudian melakukan panggilan tambahan ke VirtualAllocEx 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 lpAddress tidak null, fungsi menggunakan lpAddress dan parameter dwSize untuk menghitung wilayah halaman yang akan dialokasikan. Status seluruh rentang halaman saat ini harus kompatibel dengan jenis alokasi yang ditentukan oleh parameter flAllocationType. Jika tidak, fungsi gagal dan tidak ada halaman yang dialokasikan. Persyaratan kompatibilitas ini tidak menghalangi penerapan halaman yang sudah dilakukan; lihat daftar sebelumnya.

Untuk menjalankan kode yang dihasilkan secara dinamis, gunakan VirtualAllocEx untuk mengalokasikan memori dan fungsi VirtualProtectEx untuk memberikan akses PAGE_EXECUTE.

Fungsi VirtualAllocEx dapat digunakan untuk memesan wilayah memori Ekstensi Jendela Alamat (AWE) dalam ruang alamat virtual dari proses tertentu. 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 VirtualFreeEx 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 untuk FlushInstructionCache setelah kode ditetapkan di tempatnya. Jika tidak, upaya untuk mengeksekusi kode keluar dari wilayah yang baru dapat dieksekusi dapat menghasilkan hasil yang tidak dapat diprediksi.

Persyaratan

Syarat Nilai
klien minimum yang didukung Windows XP [aplikasi desktop | Aplikasi UWP]
server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Platform Target Windows
Header memoryapi.h (termasuk Windows.h, Memoryapi.h)
Pustaka onecore.lib
DLL Kernel32.dll

Lihat juga

Fungsi Manajemen Memori

ReadProcessMemory

Virtual Memory Functions

VirtualAllocExNuma

VirtualFreeEx

VirtualLock

VirtualProtect

VirtualQuery

writeProcessMemory