Utilisation d’une légende pour l’inspection approfondie
Lorsqu’une légende effectue une inspection approfondie, sa fonction de légende classifyFn peut inspecter n’importe quelle combinaison des champs de données fixes, des champs de métadonnées et des données de paquet brutes qui lui sont passées, ainsi que toutes les données pertinentes stockées dans un contexte associé au filtre ou au flux de données.
Par exemple :
// classifyFn callout function
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_OUT *classifyOut
)
{
PNET_BUFFER_LIST rawData;
...
// Test for the FWPS_RIGHT_ACTION_WRITE flag to check the rights
// for this callout to return an action. If this flag is not set,
// a callout can still return a BLOCK action in order to VETO a
// PERMIT action that was returned by a previous filter. In this
// example the function just exits if the flag is not set.
if (!(classifyOut->rights & FWPS_RIGHT_ACTION_WRITE))
{
// Return without specifying an action
return;
}
// Get the data fields from inFixedValues
...
// Get any metadata fields from inMetaValues
...
// Get the pointer to the raw data
rawData = (PNET_BUFFER_LIST)layerData;
// Get any filter context data from filter->context
...
// Get any flow context data from flowContext
...
// Inspect the various data sources to determine
// the action to be taken on the data
...
// If the data should be permitted...
if (...) {
// Set the action to permit the data
classifyOut->actionType = FWP_ACTION_PERMIT;
// Check whether the FWPS_RIGHT_ACTION_WRITE flag should be cleared
if (filter->flags & FWPS_FILTER_FLAG_CLEAR_ACTION_RIGHT)
{
// Clear the FWPS_RIGHT_ACTION_WRITE flag
classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
}
return;
}
...
// If the data should be blocked...
if (...) {
// Set the action to block the data
classifyOut->actionType = FWP_ACTION_BLOCK;
// Clear the FWPS_RIGHT_ACTION_WRITE flag
classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
return;
}
...
// If the decision to permit or block should be passed
// to the next filter in the filter engine...
if (...) {
// Set the action to continue with the next filter
classifyOut->actionType = FWP_ACTION_CONTINUE;
return;
}
...
}
La valeur dans filter-action.type> détermine les actions que la fonction de légende classifyFn de la légende doit retourner dans le membre actionType de la structure vers laquelle pointe le paramètre classifyOut. Pour plus d’informations sur ces actions, consultez la structure FWPS_ACTION0 .
Si une légende doit effectuer un traitement supplémentaire des données de paquets en dehors de sa fonction de légende classifyFn avant de pouvoir déterminer si les données doivent être autorisées ou bloquées, elle doit mettre en attente les données de paquet jusqu’à ce que le traitement des données soit terminé. Pour plus d’informations sur la suspension des données de paquets, consultez Types de légendes et FwpsPendOperation0.
Dans certaines couches de filtrage, le paramètre layerData qui est passé par le moteur de filtre à la fonction de légende classifyFn d’une légende est NULL.
Pour plus d’informations sur l’inspection approfondie des données de flux, consultez Utilisation d’une légende pour l’inspection approfondie des données de flux.