Fungsi ZwFreeVirtualMemory (ntifs.h)

ZwFreeVirtualMemory merilis rutin, menonaktifkan, atau keduanya, wilayah halaman dalam ruang alamat virtual dari proses yang ditentukan.

Sintaks

NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
  [in]      HANDLE  ProcessHandle,
  [in, out] PVOID   *BaseAddress,
  [in, out] PSIZE_T RegionSize,
  [in]      ULONG   FreeType
);

Parameter

[in] ProcessHandle

Handel untuk proses dalam konteks halaman yang akan dikosongkan berada. Gunakan makro NtCurrentProcess , yang ditentukan dalam Ntddk.h, untuk menentukan proses saat ini.

[in, out] BaseAddress

Penunjuk ke variabel yang akan menerima alamat virtual wilayah halaman yang dibebaskan.

Jika bendera MEM_RELEASE diatur dalam parameter FreeType , BaseAddress harus menjadi alamat dasar yang dikembalikan oleh ZwAllocateVirtualMemory saat wilayah tersebut dicadangkan.

[in, out] RegionSize

Pointer ke variabel yang akan menerima ukuran aktual, dalam byte, dari wilayah halaman yang dikosongkan. Rutinitas membulatkan nilai awal variabel ini hingga batas ukuran halaman host berikutnya dan menulis nilai yang dibulatkan kembali ke variabel ini.

Jika bendera MEM_RELEASE diatur dalam parameter FreeType , variabel yang ditujukkan oleh RegionSize harus nol. ZwFreeVirtualMemory membebaskan seluruh wilayah yang dicadangkan dalam panggilan alokasi awal ke ZwAllocateVirtualMemory.

Jika bendera MEM_DECOMMIT diatur dalam parameter FreeType , ZwFreeVirtualMemory menonaktifkan semua halaman memori yang berisi satu atau beberapa byte dalam rentang dari parameter BaseAddress ke (BaseAddress + RegionSize). Ini berarti, misalnya, bahwa jika wilayah memori dua byte menyimpan batas halaman, kedua halaman akan dinonaktifkan.

ZwFreeVirtualMemory menonaktifkan seluruh wilayah yang dicadangkan oleh ZwAllocateVirtualMemory. Jika tiga kondisi berikut terpenuhi, seluruh wilayah memasuki status dipesan:

  • Bendera MEM_DECOMMIT diatur.
  • BaseAddress adalah alamat dasar yang dikembalikan oleh ZwAllocateVirtualMemory ketika wilayah tersebut dicadangkan.
  • <Ukuran Wilayah adalah nol.

[in] FreeType

Bitmask yang berisi bendera yang menjelaskan jenis operasi gratis yang akan dilakukan ZwFreeVirtualMemory untuk wilayah halaman yang ditentukan. Nilai yang mungkin adalah sebagai berikut:

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory akan menonaktifkan wilayah halaman yang ditentukan. Halaman memasuki status terpesan.

    • ZwFreeVirtualMemory tidak gagal jika Anda mencoba menonaktifkan halaman yang tidak dikomit. Ini berarti Anda dapat menonaktifkan rentang halaman tanpa terlebih dahulu menentukan status komitmennya saat ini.

  • MEM_RELEASE

    ZwFreeVirtualMemory akan merilis wilayah halaman yang ditentukan. Halaman memasuki status bebas.

    Jika Anda menentukan bendera ini, variabel yang titik RegionSize harus nol, dan BaseAddress harus menunjuk ke alamat dasar yang dikembalikan oleh ZwAllocateVirtualMemory saat wilayah dicadangkan. ZwFreeVirtualMemory gagal jika salah satu kondisi ini tidak terpenuhi.

    Jika ada halaman di wilayah yang saat ini diterapkan, ZwFreeVirtualMemory terlebih dahulu menonaktifkan lalu merilisnya.

ZwFreeVirtualMemory tidak gagal jika Anda mencoba merilis halaman yang berada di status yang berbeda, beberapa dicadangkan dan beberapa berkomitmen. Ini berarti Anda dapat merilis berbagai halaman tanpa terlebih dahulu menentukan status komitmennya saat ini.

Nilai kembali

ZwFreeVirtualMemory mengembalikan kode status STATUS_SUCCESS atau kesalahan. Kemungkinan kode status kesalahan termasuk yang berikut ini.

Menampilkan kode Deskripsi
STATUS_ACCESS_DENIED Sebuah proses telah meminta akses ke objek, tetapi belum diberikan hak akses tersebut.
STATUS_INVALID_HANDLE Nilai ProcessHandle yang tidak valid ditentukan.
STATUS_OBJECT_TYPE_MISMATCH Ada ketidakcocokan antara jenis objek yang diperlukan oleh operasi yang diminta dan jenis objek yang ditentukan dalam permintaan.

Keterangan

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

  • Status GRATIS

    Halaman tidak diterapkan atau dicadangkan. Halaman tidak dapat diakses oleh proses. Mencoba membaca dari atau menulis ke halaman gratis menghasilkan pengecualian pelanggaran akses.

    Anda dapat menggunakan ZwFreeVirtualMemory untuk menempatkan halaman yang dipesan atau diterapkan ke dalam status bebas.

  • Status DICADANGKAN

    Halaman dicadangkan. Rentang alamat tidak dapat digunakan oleh fungsi alokasi lainnya. Halaman tidak dapat diakses oleh proses dan tidak memiliki penyimpanan fisik yang terkait dengannya. Mencoba membaca dari atau menulis ke halaman yang dipesan menghasilkan pengecualian pelanggaran akses.

    Anda dapat menggunakan ZwFreeVirtualMemory untuk menempatkan halaman memori yang diterapkan ke dalam status cadangan, dan untuk menempatkan halaman memori yang dipesan ke dalam status bebas.

  • Status BERKOMITMEN

    Halaman diterapkan. Penyimpanan fisik dalam memori atau dalam file halaman pada disk dialokasikan untuk halaman, dan akses dikontrol oleh kode perlindungan.

    Sistem menginisialisasi dan memuat setiap halaman yang diterapkan ke dalam memori fisik hanya pada upaya pertama untuk membaca dari atau menulis ke halaman tersebut.

    Ketika proses berakhir, sistem merilis semua penyimpanan untuk halaman yang diterapkan.

    Anda dapat menggunakan ZwAllocateVirtualMemory untuk menempatkan halaman memori yang diterapkan ke dalam status dicadangkan atau gratis.

ZwFreeVirtualMemory dapat melakukan operasi berikut:

  • Nonaktifkan wilayah halaman yang diterapkan atau tidak dikomit. Setelah operasi ini, halaman berada dalam status dicadangkan.
  • Merilis wilayah halaman yang dipesan. Setelah operasi ini, halaman berada dalam status bebas.
  • Nonaktifkan dan rilis wilayah halaman yang diterapkan atau tidak dikomit. Setelah operasi ini, halaman berada dalam status bebas.

ZwFreeVirtualMemory dapat menonaktifkan rentang halaman yang berada di status yang berbeda, beberapa berkomitmen, dan beberapa yang tidak dikomit. Ini berarti Anda dapat menonaktifkan rentang halaman tanpa terlebih dahulu menentukan status komitmen saat ini dari setiap halaman. Menonaktifkan halaman akan merilis penyimpanan fisiknya, baik dalam memori atau di file halaman pada disk.

Jika halaman dinonaktifkan tetapi tidak dirilis, statusnya berubah menjadi dicadangkan. Anda kemudian dapat memanggil ZwFreeVirtualMemory untuk menerapkannya, atau ZwFreeVirtualMemory untuk merilisnya. Mencoba membaca dari atau menulis ke halaman yang dipesan menghasilkan pengecualian pelanggaran akses.

ZwFreeVirtualMemory dapat merilis berbagai halaman yang berada di berbagai status, beberapa dicadangkan dan beberapa berkomitmen. Ini berarti Anda dapat merilis rentang halaman tanpa terlebih dahulu menentukan status komitmen saat ini dari setiap halaman. Seluruh rentang halaman yang awalnya dicadangkan oleh ZwAllocateVirtualMemory harus dirilis pada saat yang sama.

Jika halaman dirilis, statusnya berubah menjadi gratis, dan tersedia untuk operasi alokasi berikutnya. Setelah memori dirilis atau dinonaktifkan, Anda tidak akan pernah dapat merujuk ke memori lagi. Setiap informasi yang mungkin ada dalam memori itu hilang selamanya. Mencoba membaca dari atau menulis ke halaman gratis menghasilkan pengecualian pelanggaran akses. Jika Anda memerlukan informasi, jangan nonaktifkan atau kosongkan memori yang berisi informasi tersebut.

Untuk informasi selengkapnya tentang dukungan manajemen memori untuk driver mode kernel, lihat Manajemen Memori untuk Driver Windows.

Catatan

Jika panggilan ke fungsi ZwFreeVirtualMemory terjadi dalam mode pengguna, Anda harus menggunakan nama "NtFreeVirtualMemory" alih-alih "ZwFreeVirtualMemory".

Untuk panggilan dari driver mode kernel, versi NtXxx dan ZwXxx dari rutinItas Windows Native System Services dapat berperilaku berbeda dalam cara mereka menangani dan menginterpretasikan 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, Fltkernel.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Aturan kepatuhan DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

Lihat juga

ZwAllocateVirtualMemory