Registro de llamadas con el motor de filtro
Una vez que un controlador de llamada ha creado un objeto de dispositivo, puede registrar sus llamadas con el motor de filtro. Un controlador de llamada puede registrar sus llamadas con el motor de filtro en cualquier momento, incluso si el motor de filtro no se está ejecutando actualmente. Para registrar una llamada con el motor de filtro, un controlador de llamada llama a la función FwpsCalloutRegister0 . Por ejemplo:
// 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 la llamada a la función FwpsCalloutRegister0 se realiza correctamente, la variable a la que apunta el último parámetro contiene el identificador en tiempo de ejecución de la llamada. Este identificador en tiempo de ejecución corresponde al GUID especificado para la clave de llamada.
Un único controlador de llamada puede implementar más de una llamada. Si un controlador de llamada implementa más de una llamada, llama a la función FwpsCalloutRegister0 una vez por cada llamada que admite para registrar cada llamada con el motor de filtro.