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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk