Bagikan melalui


Mengatur Konteks

Setelah membuat konteks baru, driver minifilter dapat melampirkannya ke objek dengan memanggil salah satu rutinitas set berikut:

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 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.