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.