Inscription de légendes auprès du moteur de filtre
Une fois qu’un pilote de légende a créé un objet d’appareil, il peut inscrire ses légendes auprès du moteur de filtre. Un pilote de légende peut inscrire ses légendes auprès du moteur de filtre à tout moment, même si le moteur de filtre n’est pas en cours d’exécution. Pour inscrire une légende auprès du moteur de filtre, un pilote de légende appelle la fonction FwpsCalloutRegister0 . Par exemple :
// 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;
}
Si l’appel à la fonction FwpsCalloutRegister0 réussit, la variable pointée par le dernier paramètre contient l’identificateur d’exécution de la légende. Cet identificateur d’exécution correspond au GUID qui a été spécifié pour la clé de légende.
Un pilote de légende unique peut implémenter plusieurs légendes. Si un pilote de légende implémente plusieurs légendes, il appelle la fonction FwpsCalloutRegister0 une fois pour chaque légende prise en charge pour inscrire chaque légende auprès du moteur de filtre.