Partager via


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.