Konteks Referensi
Manajer Filter menggunakan penghitungan referensi untuk mengelola masa pakai konteks minifilter. Jumlah referensi adalah angka yang menunjukkan status konteks.
Setiap kali konteks berhasil dibuat, FltMgr menginisialisasi jumlah referensi konteks menjadi satu. Ini disebut referensi awal ke konteks.
Setiap kali konteks direferensikan, misalnya dengan kumpulan konteks yang berhasil atau dapatkan, FltMgr menaikkan jumlah referensi konteks satu per satu.
Ketika konteks tidak lagi diperlukan, jumlah referensinya harus direkrementasi. Jumlah referensi positif berarti bahwa konteksnya dapat digunakan. Ketika jumlah referensi menjadi nol, konteksnya tidak dapat digunakan, dan FltMgr akhirnya membebaskannya.
FltMgr merilis referensi awal ke konteks (mengurangi jumlah referensi menjadi nol) saat objek ditumbangkan, lalu memanggil panggilan balik pembersihan konteks opsional filter. Meskipun ini jarang terjadi, jika minifilter harus menghapus konteks dari objek sebelum sobek, minifilter harus dengan aman melepaskan referensi awal tersebut ke konteks dengan memanggil FltDeleteContext.
Minifilter dapat menambahkan referensinya sendiri ke konteks dengan memanggil FltReferenceContext untuk menambah jumlah referensi konteks. Minifilter akhirnya harus menghapus referensi tambahan ini dengan memanggil FltReleaseContext.
Berikut ini adalah contoh singkat riwayat jumlah referensi untuk objek umum. Asumsikan semua panggilan API Flt berhasil.
Memfilter panggilan balik | Flt API disebut | Jumlah referensi konteks | Deskripsi |
---|---|---|---|
Buat Sebelumnya | FltAllocateContext | 1 | Filter sedang memproses pra-buat dan memutuskan mungkin ingin melacak file. Ini mengalokasikan konteks aliran, yang menyebabkan FltMgr menginisialisasi jumlah referensi menjadi 1. Filter meneruskan konteks ke panggilan balik PostCreate melalui parameter CompletionContext . |
PostCreate | FltSetStreamContext | 2 | Filter meneruskan konteks yang dialokasikan selama PraBuat ke panggilan balik PostCreate-nya . Pembuatan berhasil, sehingga filter melampirkan konteks, yang menyebabkan FltMgr menaikkan jumlah referensi. |
PostCreate | FltReleaseContext | 1 | Karena FltSetStreamContext menambah jumlah referensi, filter perlu menghapus jumlah tambahan. Jumlah referensi adalah 1 setelah filter merilis konteks, sehingga konteksnya tetap hidup. Jika filter telah memutuskan tidak peduli tentang file ini setelah semua, itu bisa melompati panggilan FltSetStreamContext dan hanya disebut FltReleaseContext. Dalam hal ini jumlahnya akan menjadi 0, dan konteksnya akan dibatalkan alokasinya. |
Prabaca | FltGetStreamContext | 2 | Filter melihat I/O baca dan ingin tahu apakah ia melacak file ini. Ini meminta konteks alirannya dan mendapatkannya, sehingga tahu bahwa ia ingin melacak file ini. FltMgr menaikkan jumlah referensi. |
Prabaca | FltReleaseContext | 1 | Filter dilakukan menggunakan konteksnya, sehingga melepaskannya, menyebabkan jumlah referensi dikurangi. Setiap FltGet*Context harus diseimbangkan dengan FltReleaseContext. |
PreCleanup | FltGetStreamContext | 2 | Filter meminta dan mendapatkan konteksnya, yang menaikkan jumlah referensi. |
PreCleanup | FltReleaseContext | 1 | Filter dilakukan menggunakan konteks sehingga merilisnya, yang mengurangi jumlah referensi. |
Panggilan balik pembersihan konteks | 0 | Sistem file merobek objek aliran yang mendasar. (Dalam kasus spesifik objek aliran, sobek dipicu oleh IRP_MJ_CLOSE). FltMgr mengurangi jumlah referensi ke 0 lalu memanggil panggilan balik pembersihan konteks filter. Filter sekarang memiliki kesempatan untuk membersihkan konteksnya. |