處理通知圖說文字
篩選引擎會呼叫圖說文字的 notifyFn 圖說文字函式,以通知圖說文字驅動程式有關與圖說文字相關聯的事件。
篩選加法
將指定篩選動作的圖說文字篩選新增至篩選引擎時,篩選引擎會呼叫圖說文字的 notifyFn 圖說文字函式,並在 notifyType 參數中傳遞FWPS_CALLOUT_NOTIFY_ADD_FILTER。
圖說文字驅動程式可以在篩選引擎註冊圖說文字,這些篩選準則指定篩選動作的圖說文字已經新增至篩選引擎。 在此情況下,篩選引擎不會呼叫圖說文字的 notifyFn 圖說文字函式,以通知圖說文字是否有任何現有的篩選準則。
篩選引擎只會呼叫圖說文字的 notifyFn 圖說文字函式,以在新的篩選準則指定篩選動作的圖說文字新增至篩選引擎時通知圖說文字。 在此情況下,圖說文字的 notifyFn 圖說文字函式可能不會針對篩選引擎中的每個篩選呼叫,該篩選引擎會指定篩選動作的圖說文字。
如果圖說文字驅動程式在啟動篩選引擎之後註冊圖說文字,而且圖說文字必須接收篩選引擎中每個篩選的相關資訊,以指定篩選動作的圖說文字,圖說文字驅動程式必須呼叫適當的管理功能,以列舉篩選引擎中的所有篩選。 圖說文字驅動程式必須排序所有篩選的結果清單,才能尋找這些篩選準則,以指定篩選動作的圖說文字。 如需呼叫這些函式的詳細資訊,請參閱 呼叫其他 Windows 篩選平台函 式。
篩選刪除
從篩選引擎中刪除指定篩選動作的圖說文字時,篩選引擎會呼叫圖說文字的notifyFn圖說文字函式,並在filterKey參數中傳遞FWPS_CALLOUT_NOTIFY_DELETE_FILTER,並在filterKey 參數中傳遞FWPS_CALLOUT_NOTIFY_DELETE_FILTER。 篩選引擎會針對篩選引擎中每個已刪除的篩選準則呼叫圖說文字的 notifyFn 圖說文字函式,以指定篩選動作的圖說文字。 這包括在圖說文字驅動程式向篩選引擎註冊圖說文字之前新增至篩選引擎的任何篩選。 因此,圖說文字可能會針對未收到篩選新增通知的篩選,接收篩選刪除通知。
如果圖說文字的 notifyFn 圖說文字函式無法辨識在 notifyType 參數中傳遞的通知類型,它應該忽略通知並傳回STATUS_SUCCESS。
圖說文字驅動程式可以在將篩選新增至篩選引擎時指定與篩選相關聯的內容。 這類內容對篩選引擎而言不透明。 圖說文字的 classifyFn 圖說文字函式可以使用此內容,在下一次由篩選引擎呼叫時儲存狀態資訊。 從篩選引擎中刪除篩選時,圖說文字驅動程式會執行內容的任何必要清除。
例如:
// Context structure to be associated with the filters
typedef struct FILTER_CONTEXT_ {
.
. // Driver-specific content
.
} FILTER_CONTEXT, *PFILTER_CONTEXT;
// Memory pool tag for filter context structures
#define FILTER_CONTEXT_POOL_TAG 'fcpt'
// notifyFn callout function
NTSTATUS NTAPI
NotifyFn(
IN FWPS_CALLOUT_NOTIFY_TYPE notifyType,
IN const GUID *filterKey,
IN const FWPS_FILTER0 *filter
)
{
PFILTER_CONTEXT context;
ASSERT(filter != NULL);
// Switch on the type of notification
switch(notifyType) {
// A filter is being added to the filter engine
case FWPS_CALLOUT_NOTIFY_ADD_FILTER:
// Allocate the filter context structure
context =
(PFILTER_CONTEXT)ExAllocatePoolWithTag(
NonPagedPool,
sizeof(FILTER_CONTEXT),
FILTER_CONTEXT_POOL_TAG
);
// Check the result of the memory allocation
if (context == NULL) {
// Return error
return STATUS_INSUFFICIENT_RESOURCES;
}
// Initialize the filter context structure
...
// Associate the filter context structure with the filter
filter->context = (UINT64)context;
break;
// A filter is being removed from the filter engine
case FWPS_CALLOUT_NOTIFY_DELETE_FILTER:
// Get the filter context structure from the filter
context = (PFILTER_CONTEXT)filter->context;
// Check whether the filter has a context
if (context) {
// Cleanup the filter context structure
...
// Free the memory for the filter context structure
ExFreePoolWithTag(
context,
FILTER_CONTEXT_POOL_TAG
);
}
break;
// Unknown notification
default:
// Do nothing
break;
}
return STATUS_SUCCESS;
}