Manajemen Objek
Bagian ini mencakup penggunaan jenis objek API Windows Filtering Platform (WFP) yang benar.
Sesi
API WFP berorientasi sesi, dan sebagian besar panggilan fungsi dilakukan dalam konteks sesi. Sesi klien baru dibuat dengan memanggil FwpmEngineOpen0. Sesi berakhir baik ketika klien memanggil FwpmEngineClose0 atau proses klien berakhir. Ketika sesi dihancurkan, baik dengan sengaja atau oleh rundown RPC, Mesin Pemfilteran Dasar (BFE) terlebih dahulu membatalkan transaksi yang ada.
Saat membuat sesi baru, pemanggil dapat membuat sesi dinamis dengan meneruskan bendera FWPM_SESSION_FLAG_DYNAMIC ke FwpmEngineOpen0. Setiap objek yang ditambahkan selama sesi dinamis akan dihapus secara otomatis saat sesi berakhir.
Transaksi
API WFP bersifat transaksi, dan sebagian besar panggilan fungsi dilakukan dalam konteks transaksi. Penelepon dapat menggunakan FwpmTransactionBegin0, FwpmTransactionCommit0, dan FwpmTransactionAbort0 untuk mengontrol transaksi secara eksplisit. Namun, jika panggilan fungsi dilakukan di luar transaksi eksplisit, itu akan dijalankan dalam transaksi implisit. Jika transaksi sedang berlangsung, ketika sesi berakhir, transaksi akan dibatalkan secara otomatis. Transaksi implisit tidak pernah dibatalkan secara paksa.
Transaksi bersifat baca-saja atau baca/tulis dan memberlakukan semantik Atomic Consistent Isolated Durable (ACID) yang ketat.
Setiap sesi klien hanya dapat memiliki satu transaksi yang sedang berlangsung pada satu waktu. Jika pemanggil mencoba memulai transaksi kedua sebelum melakukan atau membatalkan yang pertama, BFE mengembalikan kesalahan.
Jika operasi gagal selama transaksi, operasi tersebut tidak memengaruhi status transaksi secara keseluruhan. Misalnya, klien memulai transaksi dan berhasil memanggil FwpmFilterAdd0 tiga kali sebelum panggilan keempat gagal. Klien sekarang memiliki opsi:
- Membatalkan transaksi, dalam hal ini tidak ada filter yang akan ditambahkan.
- Melakukan transaksi, dalam hal ini tiga filter pertama akan ditambahkan.
- Melanjutkan dengan lebih banyak operasi termasuk berpotensi mencoba kembali FwpmFilterAdd0yang gagal.
Saat memulai transaksi, BFE akan menunggu hingga sesi txnWaitTimeoutInMSec kedaluwarsa untuk memperoleh kunci. Jika kunci tidak diperoleh dalam waktu ini, akuisisi kunci (dan panggilan FwpmTransactionBegin0) akan gagal. Ini mencegah klien gagal merespons tanpa batas waktu. Jika klien tidak menentukan batas waktu penguncian, maka defaultnya adalah 15 detik.
Setiap transaksi juga memiliki batas waktu penguncian. Ini adalah jumlah waktu maksimum yang dapat dimiliki kunci. Jika pemilik tidak melepaskan kunci dalam waktu ini, transaksi dibatalkan secara paksa, menyebabkan kunci dilepaskan. Batas waktu penguncian tidak dapat dikonfigurasi. Ini tak terbatas untuk pemanggil mode kernel dan satu jam untuk pemanggil mode pengguna. Jika transaksi dibatalkan secara paksa, panggilan berikutnya yang dilakukan dalam transaksi tersebut akan gagal dengan FWP_E_TXN_ABORTED.
Masa Pakai Objek
Objek dapat memiliki salah satu dari empat kemungkinan masa pakai:
- Dinamis — Objek bersifat dinamis hanya jika ditambahkan menggunakan handel sesi dinamis. Objek dinamis hidup sampai dihapus atau sesi pemilik berakhir.
- Statis — Objek statis secara default. Objek statis hidup sampai dihapus, BFE berhenti, atau sistem dimatikan.
- Persisten — Objek persisten dibuat dengan meneruskan bendera FWPM_*_FLAG_PERSISTENT yang sesuai ke fungsi Fwpm*Add0. Objek persisten hidup hingga dihapus.
- Bawaan — Objek bawaan telah ditentukan oleh BFE dan tidak dapat ditambahkan atau dihapus. Mereka hidup selamanya.
Filter dalam lapisan mode kernel dapat ditandai sebagai filter waktu boot dengan meneruskan bendera yang sesuai ke FwpmFilterAdd0. Filter waktu boot ditambahkan ke sistem ketika driver TCP/IP dimulai, dan dihapus ketika BFE menyelesaikan inisialisasi. Objek persisten ditambahkan saat BFE dimulai.
Dalam banyak kasus, penyedia kebijakan mungkin tidak ingin kebijakan persistennya diberlakukan jika penyedia telah dinonaktifkan. Saat menambahkan penyedia, pemanggil dapat menentukan nama layanan Windows opsional. Saat menambahkan objek persisten, pemanggil dapat secara opsional menentukan penyedia yang "memiliki" objek tersebut. Pada awal layanan, BFE hanya menambahkan objek persisten ke sistem jika tidak terkait dengan penyedia, atau penyedia terkait tidak memiliki nama layanan Windows, atau layanan Windows terkait diatur ke mulai otomatis.
Asosiasi Objek
Beberapa objek memiliki referensi ke objek lain. Misalnya, filter selalu mereferensikan lapisan dan dapat mereferensikan callout dan konteks penyedia. Objek tidak dapat merujuk ke objek yang mungkin memiliki masa pakai yang lebih pendek. Dengan demikian, objek dinamis tidak dapat merujuk ke objek dinamis dari sesi yang berbeda. Objek statis tidak dapat merujuk ke objek dinamis. Objek persisten tidak dapat merujuk ke objek dinamis, objek statis, atau objek persisten yang dimiliki oleh penyedia yang berbeda.
Objek tidak dapat dihapus sampai semua objek yang mereferensikannya telah dihapus terlebih dahulu.
LUID dan GUID
Semua objek API WFP mode pengguna (FWPM) diidentifikasi oleh pengidentifikasi unik global (GUID) dan mereferensikan objek lain dengan GUIDmereka. GUID hanya perlu unik dalam jenis objek. Misalnya, filter dan konteks penyedia dapat memiliki GUID yang sama, tetapi dua filter tidak dapat. Saat menambahkan objek baru, penelepon dapat menetapkan GUID objek atau membiarkannya diinisialisasi nol dan membiarkan BFE menetapkan GUID.
Semua objek WFP API mode kernel (FWPS) diidentifikasi oleh pengidentifikasi unik lokal (LUID) dan mereferensikan objek lain oleh LUID mereka. Sakelar dari GUID ke LUID memungkinkan WFP untuk menghemat kumpulan non-halaman dan mengoptimalkan pemrosesan run-time. Lebar LUID tergantung pada jenis objek dan rentang dari UINT16 hingga UINT64. LUID selalu ditetapkan oleh BFE.