Fungsi NtAllocateVirtualMemory (ntifs.h)

NtAllocateVirtualMemory rutin mencadangkan, menerapkan, atau keduanya, wilayah halaman dalam ruang alamat virtual mode pengguna dari proses tertentu.

Sintaks

__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
);

Parameter

[in] ProcessHandle

Handel untuk proses di mana pemetaan harus dilakukan. Gunakan makro NtCurrentProcess , yang ditentukan dalam Ntddk.h, untuk menentukan proses saat ini.

[in, out] BaseAddress

Penunjuk ke variabel yang akan menerima alamat dasar wilayah halaman yang dialokasikan. Jika nilai awal BaseAddress bukan NULL, wilayah dialokasikan mulai dari alamat virtual yang ditentukan dibulatkan ke batas alamat ukuran halaman host berikutnya. Jika nilai awal BaseAddress adalah NULL, sistem operasi akan menentukan tempat untuk mengalokasikan wilayah.

[in] ZeroBits

Jumlah bit alamat berurutan tinggi yang harus nol di alamat dasar tampilan bagian. Digunakan hanya ketika sistem operasi menentukan di mana mengalokasikan wilayah, seperti ketika BaseAddress* adalah NULL. Perhatikan bahwa ketika ZeroBits lebih besar dari 32, itu menjadi bitmask.

[in, out] RegionSize

Penunjuk ke variabel yang akan menerima ukuran aktual, dalam byte, dari wilayah halaman yang dialokasikan. Nilai awal RegionSize menentukan ukuran, dalam byte, wilayah dan dibulatkan ke atas ke batas ukuran halaman host berikutnya. RegionSize tidak boleh nol pada input.

[in] AllocationType

Bitmask yang berisi bendera yang menentukan jenis alokasi yang akan dilakukan untuk wilayah halaman yang ditentukan. Tabel berikut ini menjelaskan bendera yang paling umum. Lihat VirtualAlloc untuk daftar lengkap kemungkinan bendera dan deskripsi.

Catatan

Salah satu MEM_COMMIT, MEM_RESET, atau MEM_RESERVE harus diatur.

Bendera Makna
MEM_COMMIT Wilayah halaman yang ditentukan akan diterapkan.
MEM_RESERVE Wilayah halaman yang ditentukan akan dicadangkan.
MEM_RESET Reset status wilayah yang ditentukan sehingga jika halaman berada dalam file halaman, halaman tersebut dibuang dan halaman nol dibawa masuk. Jika halaman dalam memori dan dimodifikasi, halaman ditandai sebagai tidak dimodifikasi sehingga tidak akan ditulis ke file halaman. Isinya tidak di-nol. Parameter Lindungi tidak digunakan, tetapi harus diatur ke nilai yang valid. Jika MEM_RESET diatur, tidak ada bendera lain yang dapat diatur.
Bendera MEM_XXX lainnya Lihat VirtualAlloc.

[in] Protect

Bitmask yang berisi bendera perlindungan halaman yang menentukan perlindungan yang diinginkan untuk wilayah halaman yang diterapkan. Tabel berikut ini menjelaskan bendera ini.

Bendera Makna
PAGE_NOACCESS Tidak ada akses ke wilayah halaman yang diterapkan yang diizinkan. Upaya untuk membaca, menulis, atau menjalankan wilayah yang diterapkan mengakibatkan pengecualian pelanggaran akses, yang disebut kesalahan perlindungan umum (GP).
PAGE_READONLY Akses baca-saja dan jalankan ke wilayah halaman yang diterapkan diizinkan. Upaya untuk menulis wilayah yang diterapkan menghasilkan pelanggaran akses.
PAGE_READWRITE Membaca, menulis, dan menjalankan akses ke wilayah halaman yang diterapkan diizinkan. Jika akses tulis ke bagian yang mendasar diizinkan, maka satu salinan halaman dibagikan. Jika tidak, halaman dibagikan baca saja/salin saat menulis.
PAGE_EXECUTE Jalankan akses ke wilayah halaman yang diterapkan diizinkan. Upaya untuk membaca atau menulis ke wilayah yang diterapkan menghasilkan pelanggaran akses.
PAGE_EXECUTE_READ Jalankan dan baca akses ke wilayah halaman yang diterapkan diizinkan. Upaya untuk menulis ke wilayah yang diterapkan menghasilkan pelanggaran akses.
PAGE_GUARD Halaman di wilayah menjadi halaman penjaga. Setiap upaya untuk membaca dari atau menulis ke halaman penjaga menyebabkan sistem menaikkan pengecualian STATUS_GUARD_PAGE. Halaman penjaga dengan demikian bertindak sebagai alarm akses satu bidikan. Bendera ini adalah pengubah perlindungan halaman, hanya valid saat digunakan dengan salah satu bendera perlindungan halaman selain PAGE_NOACCESS. Ketika upaya akses mengarahkan sistem untuk menonaktifkan status halaman penjaga, perlindungan halaman yang mendasar mengambil alih. Jika pengecualian halaman penjaga terjadi selama layanan sistem, layanan biasanya mengembalikan indikator status kegagalan.
PAGE_NOCACHE Wilayah halaman harus dialokasikan sebagai tidak dapat di-cache. PAGE_NOCACHE tidak diperbolehkan untuk bagian.
PAGE_WRITECOMBINE Memungkinkan penggabungan tulis, yaitu menyangga penulisan dari cache ke memori utama, di mana perangkat keras mendukungnya. Bendera ini digunakan terutama untuk memori buffer bingkai sehingga menulis ke baris cache yang sama digabungkan jika memungkinkan sebelum ditulis ke perangkat. Ini dapat sangat mengurangi penulisan di seluruh bus ke (misalnya) memori video. Jika perangkat keras tidak mendukung penggandaan tulis, bendera akan diabaikan. Bendera ini adalah pengubah perlindungan halaman, hanya valid saat digunakan dengan salah satu bendera perlindungan halaman selain PAGE_NOACCESS.

Mengembalikan nilai

NtAllocateVirtualMemory mengembalikan kode status STATUS_SUCCESS atau kesalahan. Kemungkinan kode status kesalahan meliputi yang berikut ini:

  • 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

Keterangan

NtAllocateVirtualMemory dapat melakukan operasi berikut:

  • Terapkan wilayah halaman yang dicadangkan oleh panggilan sebelumnya ke NtAllocateVirtualMemory.
  • Pesan wilayah halaman gratis.
  • Pesan dan terapkan wilayah halaman gratis.

Driver mode kernel dapat menggunakan NtAllocateVirtualMemory untuk memesan berbagai alamat virtual yang dapat diakses aplikasi dalam proses yang ditentukan dan kemudian melakukan panggilan tambahan ke NtAllocateVirtualMemory untuk menerapkan halaman individual dari rentang yang dipesan. Ini memungkinkan proses untuk memesan berbagai ruang alamat virtualnya tanpa mengkonsumsi penyimpanan fisik sampai diperlukan.

Setiap halaman dalam ruang alamat virtual proses berada di salah satu dari tiga status yang dijelaskan dalam tabel berikut.

Provinsi Makna
GRATIS Halaman tidak diterapkan atau dicadangkan dan tidak dapat diakses oleh proses. NtAllocateVirtualMemory dapat memesan, atau secara bersamaan memesan dan menerapkan, halaman gratis.
DIPESAN Rentang alamat tidak dapat digunakan oleh fungsi alokasi lain, tetapi halaman tidak dapat diakses oleh proses dan tidak memiliki penyimpanan fisik yang terkait dengannya. NtAllocateVirtualMemory dapat menerapkan halaman yang dipesan, tetapi tidak dapat memesannya untuk kedua kalinya. NtFreeVirtualMemory dapat merilis halaman yang dipesan, menjadikannya halaman gratis.
BERKOMITMEN Penyimpanan fisik dialokasikan untuk halaman, dan akses dikendalikan oleh kode perlindungan. Sistem menginisialisasi dan memuat setiap halaman yang diterapkan ke dalam memori fisik hanya pada upaya pertama untuk membaca atau menulis ke halaman tersebut. Ketika proses berakhir, sistem merilis penyimpanan untuk halaman yang diterapkan. NtAllocateVirtualMemory dapat menerapkan halaman yang sudah dilakukan. Ini berarti Anda dapat melakukan rentang halaman, terlepas dari apakah halaman tersebut telah diterapkan, dan fungsinya tidak akan gagal. NtFreeVirtualMemory dapat menonaktifkan halaman yang diterapkan, merilis penyimpanan halaman, atau secara bersamaan dapat menonaktifkan dan merilis halaman yang diterapkan.

Memori yang dialokasikan dengan memanggil NtAllocateVirtualMemory harus dibebaskan dengan memanggil NtFreeVirtualMemory.

Untuk informasi selengkapnya tentang manajemen memori, lihat Manajemen Memori untuk Driver Windows.

Catatan Jika panggilan ke fungsi NtAllocateVirtualMemory terjadi dalam mode pengguna, Anda harus menggunakan nama "NtAllocateVirtualMemory" alih-alih "ZwAllocateVirtualMemory".

Untuk panggilan dari driver mode kernel, versi NtXxx dan ZwXxx dari rutinitas Windows Native System Services dapat berperilaku berbeda dalam cara mereka menangani dan menafsirkan parameter input. Untuk informasi selengkapnya tentang hubungan antara versi NtXxx dan ZwXxx dari rutinitas, lihat Menggunakan Versi Nt dan Zw dari Rutinitas Layanan Sistem Asli.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 2000
Target Platform Universal
Header ntifs.h (termasuk Ntifs.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Aturan kepatuhan DDI HwStorPortProhibitedDDIs, PowerIrpDDis, SpNoWait, StorPortStartIo

Lihat juga

NtFreeVirtualMemory