物件管理
本節涵蓋正確使用 Windows 篩選平台 () API 物件類型。
工作階段
其為會話導向 API,而且大部分的函式呼叫都是在會話的內容中進行。 呼叫 FwpmEngineOpen0會建立新的用戶端會話。 當用戶端呼叫 FwpmEngineClose0 或用戶端進程終止時,會話就會結束。 當會話遭到終結時,不論是基於目的還是 RPC 取消,基底篩選引擎 (BFE) 會先中止任何現有的交易。
建立新的會話時,呼叫端可以將 FWPM_SESSION_FLAG_DYNAMIC 旗標傳遞至 FwpmEngineOpen0來建立動態會話。 在動態會話期間新增的任何物件都會在會話結束時自動刪除。
交易
其為交易式 API,而且大部分的函式呼叫都是在交易的內容中進行。 呼叫端可以使用 FwpmTransactionBegin0、 FwpmTransactionCommit0和 FwpmTransactionAbort0 明確控制交易。 不過,如果在明確交易之外進行函式呼叫,則會在隱含交易內執行。 如果交易正在進行中,當會話終止時,它會自動中止。 隱含交易永遠不會強制中止。
交易是唯讀或讀取/寫入,並強制執行嚴格的不可部分完成一致隔離長期 (ACID) 語意。
每個用戶端會話一次只能有一個進行中的交易。 如果呼叫端嘗試在認可或中止第一個交易之前開始第二筆交易,BFE 會傳回錯誤。
如果在交易過程中作業失敗,則不會影響交易的整體狀態。 例如,假設用戶端開始交易,並在第四次呼叫失敗之前成功呼叫 FwpmFilterAdd0 三次。 用戶端現在有下列選項:
- 中止交易,在此情況下不會新增任何篩選。
- 認可交易,在此情況下會新增前三個篩選。
- 繼續進行更多作業,包括可能重試失敗的 FwpmFilterAdd0。
開始交易時,BFE 會等到會話的 txnWaitTimeoutInMSec 到期以取得鎖定為止。 如果未在此時間內取得鎖定,鎖定擷取 (且 FwpmTransactionBegin0 呼叫) 將會失敗。 這可防止用戶端無限期地無法回應。 如果用戶端未指定鎖定逾時,則預設為 15 秒。
每個交易也有鎖定逾時。 這是可以擁有鎖定的最大時間量。 如果擁有者在此時間內未釋放鎖定,交易會強制中止,導致鎖定釋放。 鎖定逾時無法設定。 對於核心模式來電者而言是無限的,而使用者模式來電者則為一小時。 如果交易被強制中止,在該交易內進行的下一次呼叫將會失敗,並 FWP_E_TXN_ABORTED。
物件存留期
物件可以有四個可能的存留期之一:
- 動態 — 只有在使用動態會話控制碼新增物件時,物件才會是動態的。 動態物件會存留,直到刪除或擁有的會話終止為止。
- Static — 物件預設為靜態。 靜態物件會即時存在,直到刪除、BFE 停止或系統關閉為止。
- 永續性 — 持續性物件是藉由將適當的 FWPM_*_FLAG_PERSISTENT 旗標傳遞至 Fwpm*Add0 函式 來建立。 永續性物件會存續,直到刪除為止。
- 內建 - 內建物件是由 BFE 預先定義,無法新增或刪除。 它們會永遠生存。
核心模式層中的篩選可以透過將適當的旗標傳遞至 FwpmFilterAdd0來標示為開機時間篩選。 啟動 TCP/IP 驅動程式時,會將開機時間篩選新增至系統,並在 BFE 完成初始化時移除。 BFE 啟動時會新增持續性物件。
在許多情況下,如果提供者已停用,原則提供者可能不會想要強制執行其永續性原則。 新增提供者時,呼叫端可以指定選擇性的 Windows 服務名稱。 新增持續性物件時,呼叫端可以選擇性地指定「擁有」該物件的提供者。 在服務啟動時,BFE 只會在未與提供者相關聯,或相關聯的提供者沒有 Windows 服務名稱,或相關聯的 Windows 服務設定為自動啟動時,才會將永續性物件新增至系統。
物件關聯
某些物件具有其他物件的參考。 例如,篩選一律會參考圖層,而且可能會參考圖說文字和提供者內容。 物件無法參考可能存留期較短的物件。 因此,動態物件無法從不同的會話參考動態物件。 靜態物件無法參考動態物件。 持續性物件無法參考不同提供者所擁有的動態物件、靜態物件或永續性物件。
必須先刪除參考物件的所有物件,才能刪除物件。
LUID 和 GUID
(FWPM) 所有使用者模式的 (GUID) 會以全域唯一識別碼來識別,並依其 GUID參考其他物件。 GUID只需要在物件類型內是唯一的。 例如,篩選和提供者內容可以有相同的 GUID,但兩個篩選無法。 新增物件時,呼叫端可以指派物件的 GUID ,或將它保留為零初始化,並讓 BFE 指派 GUID。
(FWPS) 的所有核心模式) 都會以本機唯一識別碼 (LUID) 來識別,並依 LUID 參考其他物件。 從 GUID 切換至 LUID 可讓其節省非分頁集區,並將執行時間處理優化。 LUID的寬度取決於物件類型,範圍從UINT16到UINT64。 LUID一律由 BFE 指派。