Mengatur Konteks
Setelah membuat konteks baru, driver minifilter dapat melampirkannya ke objek dengan memanggil salah satu rutinitas set berikut:
- FltSetFileContext
- FltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
Rutinitas yang ditetapkan melakukan hal berikut, tergantung pada nilai parameter Operasi :
Jika Operasi == FLT_SET_CONTEXT_KEEP_IF_EXISTS:
- Jika minifilter belum mengatur konteks jenis yang sama untuk objek, set rutinitas:
- Melampirkan konteks yang baru dialokasikan ke objek.
- Menaikkan jumlah referensi.
- Jika tidak, jika minifilter telah mengatur konteks, tetapkan rutinitas:
- Mengembalikan STATUS_FLT_CONTEXT_ALREADY_DEFINED (kode kesalahan NTSTATUS).
- Tidak mengganti konteks yang ada.
- Tidak menaikkan jumlah referensi.
- Menyimpan penunjuk ke konteks yang ada dalam parameter OldContext jika bukan NULL. Ketika pointer ini tidak lagi diperlukan, driver minifilter harus melepaskannya dengan memanggil FltReleaseContext.
- Jika minifilter belum mengatur konteks jenis yang sama untuk objek, set rutinitas:
Jika Operasi == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:
- Rutinitas set selalu melampirkan konteks baru ke objek.
- Jika driver minifilter telah mengatur konteks, rutinitas yang ditetapkan:
- Menghapus konteks yang ada, mengatur konteks baru, dan meningkatkan jumlah referensi pada konteks baru.
- Jika parameter OldContext bukan NULL, parameter tersebut menerima penunjuk ke konteks yang dihapus. Ketika pointer ini tidak lagi diperlukan, driver minifilter harus melepaskannya dengan memanggil FltReleaseContext.
Setelah jenis konteks ditetapkan, minifilter bisa mendapatkan konteks selama operasi I/O berikutnya untuk menentukan apakah perlu mengambil tindakan apa pun.
Setiap kumpulan konteks yang berhasil pada akhirnya harus dihapus.
Dalam contoh kode berikut, diambil dari minifilter sampel CTX, rutinitas CtxInstanceSetup membuat dan mengatur konteks instans:
status = FltAllocateContext(
FltObjects->Filter, //in: Filter
FLT_INSTANCE_CONTEXT, //in: ContextType
CTX_INSTANCE_CONTEXT_SIZE, //in: ContextSize
NonPagedPool, //in: PoolType
&instanceContext); //out: ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //in: Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //in: Operation
instanceContext, //in: NewContext
NULL); //out: OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
Perhatikan bahwa setelah panggilan ke FltSetInstanceContext, ada panggilan ke FltReleaseContext untuk merilis jumlah referensi yang ditetapkan oleh FltAllocateContext (bukan FltSetInstanceContext). Ini dijelaskan dalam Merilis Konteks.