将标注注册到筛选器引擎
标注驱动程序创建设备对象后,即可向筛选器引擎注册其标注。 标注驱动程序可以随时向筛选器引擎注册其标注,即使筛选器引擎当前未运行也是如此。 若要向筛选器引擎注册标注,标注驱动程序将调用 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 函数,以便向筛选器引擎注册每个标注。