向篩選引擎註冊批註
在呼叫驅動程式建立裝置對象之後,它就可以向篩選引擎註冊其呼叫程序。 呼叫驅動程式可以隨時向篩選引擎註冊其呼叫,即使篩選引擎當前未運行也可以如此。 若要向篩選引擎註冊呼叫附件,呼叫附件驅動程式會呼叫 FwpsCalloutRegister0 函式。 例如:
// Prototypes for the callout's callout functions
VOID NTAPI
ClassifyFn(
IN const FWPS_INCOMING_VALUES0 *inFixedValues,
IN const FWPS_INCOMING_METADATA_VALUES0 *inMetaValues,
IN OUT VOID *layerData,
IN const FWPS_FILTER0 *filter,
IN UINT64 flowContext,
IN OUT FWPS_CLASSIFY_OUT0 *classifyOut
);
NTSTATUS NTAPI
NotifyFn(
IN FWPS_CALLOUT_NOTIFY_TYPE notifyType,
IN const GUID *filterKey,
IN const FWPS_FILTER0 *filter
);
VOID NTAPI
FlowDeleteFn(
IN UINT16 layerId,
IN UINT32 calloutId,
IN UINT64 flowContext
);
// Callout registration structure
const FWPS_CALLOUT0 Callout =
{
{ ... }, // GUID key identifying the callout
0, // Callout-specific flags (none set here)
ClassifyFn,
NotifyFn,
FlowDeleteFn
};
// Variable for the run-time callout identifier
UINT32 CalloutId;
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
PDEVICE_OBJECT deviceObject;
NTSTATUS status;
...
status =
FwpsCalloutRegister0(
deviceObject,
&Callout,
&CalloutId
);
...
return status;
}
如果呼叫 FwpsCalloutRegister0 函式成功,則最後一個參數所指向的變數會包含該呼叫的執行期間識別碼。 這個執行階段識別碼會對應至為呼叫項鍵指定的 GUID。
單一呼叫驅動程式可以實作多個呼叫。 如果一個圖說驅動程式實作多個呼叫項目,它需要針對每個支援的呼叫項目,分別呼叫 FwpsCalloutRegister0 函式,將每個呼叫項目註冊到篩選引擎。