Compartir a través de


Uso de una llamada para inspección profunda

Cuando una llamada realiza una inspección profunda, su función de llamada classifyFn puede inspeccionar cualquier combinación de los campos de datos fijos, los campos de metadatos y los datos de paquetes sin procesar que se le pasan y los datos pertinentes que se han almacenado en un contexto asociado al filtro o al flujo de datos.

Por ejemplo:

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

  ...
}

El valor de filter-action.type> determina qué acciones debe devolver la función de llamada classifyFn de la llamada en el miembro actionType de la estructura a la que apunta el parámetro classifyOut. Para obtener más información sobre estas acciones, consulte la estructura FWPS_ACTION0 .

Si una llamada debe realizar un procesamiento adicional de los datos de paquetes fuera de su función de llamada classifyFn antes de poder determinar si los datos deben permitirse o bloquearse, debe lápiz los datos del paquete hasta que se complete el procesamiento de los datos. Para obtener información sobre cómo crear datos de paquetes en lápiz, vea Tipos de llamadas y FwpsPendOperation0.

En algunas capas de filtrado, el parámetro layerData que pasa el motor de filtros a la función de llamada classifyFn de una llamada es NULL.

Para obtener información sobre cómo realizar una inspección profunda de los datos de flujo, consulte Uso de una llamada para la inspección profunda de datos de flujo.