Registrieren von Legenden bei der Filter-Engine
Nachdem ein Legendentreiber ein Geräteobjekt erstellt hat, kann er seine Legenden beim Filtermodul registrieren. Ein Legendentreiber kann seine Legenden jederzeit bei der Filter-Engine registrieren, auch wenn das Filtermodul derzeit nicht ausgeführt wird. Um eine Legende bei der Filter-Engine zu registrieren, ruft ein Legendentreiber die Funktion FwpsCalloutRegister0 auf. Beispiel:
// 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;
}
Wenn der Aufruf der Funktion FwpsCalloutRegister0 erfolgreich ist, enthält die Variable, auf die der letzte Parameter verweist, den Laufzeitbezeichner für die Legende. Dieser Laufzeitbezeichner entspricht der GUID, die für den Legendenschlüssel angegeben wurde.
Ein einzelner Legendentreiber kann mehrere Legenden implementieren. Wenn ein Legendentreiber mehrere Legenden implementiert, ruft er die Funktion FwpsCalloutRegister0 einmal für jede Legende auf, die er unterstützt, um jede Legende bei der Filter-Engine zu registrieren.