Condividi tramite


Uso di un callout per l'ispezione approfondita

Quando un callout esegue un'ispezione approfondita, la relativa funzione di callout classifyFn può esaminare qualsiasi combinazione dei campi dati fissi, dei campi dei metadati e dei dati dei pacchetti non elaborati passati e di tutti i dati rilevanti archiviati in un contesto associato al filtro o al flusso di dati.

Ad esempio:

// 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;
  }

  ...
}

Il valore in filter-action.type> determina le azioni a cui deve restituire la funzione callout classifyFn del callout nel membro actionType della struttura a cui punta il parametro classifyOut. Per altre informazioni su queste azioni, vedere la struttura FWPS_ACTION0 .

Se un callout deve eseguire un'ulteriore elaborazione dei dati del pacchetto al di fuori della funzione callout classifyFn prima di poter determinare se i dati devono essere consentiti o bloccati, è necessario inserire i dati del pacchetto fino al completamento dell'elaborazione dei dati. Per informazioni su come creare una penna dei dati dei pacchetti, vedere Tipi di callout e FwpsPendOperation0.

In alcuni livelli di filtro, il parametro layerData passato dal motore di filtro alla funzione di callout classifyFn di un callout è NULL.

Per informazioni su come eseguire un'ispezione approfondita dei dati di flusso, vedere Uso di un callout per l'ispezione approfondita dei dati di flusso.