Registro de datos

Para determinar qué datos se deben registrar, la función callout classifyFn puede inspeccionar cualquier combinación de los campos de datos, los campos de metadatos y los datos en bruto que se le pasen, así como los datos pertinentes que se hayan almacenado en un contexto asociado con el filtro o el flujo de datos.

Por ejemplo, si un indicador realiza un seguimiento del número de paquetes IPv4 entrantes descartados por un filtro en la capa de red, el indicador se agrega al motor de filtro en la capa FWPM_LAYER_INBOUND_IPPACKET_V4_DISCARD. En esta situación, la función callout classifyFn podría parecerse al siguiente ejemplo:

ULONG TotalDiscardCount = 0;
ULONG FilterDiscardCount = 0;

// 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
    )
{
  // Increment the total count of discarded packets
 InterlockedIncrement(&TotalDiscardCount);


  // Check whether a discard reason metadata field is present
 if (FWPS_IS_METADATA_FIELD_PRESENT(
 inMetaValues,
        FWPS_METADATA_FIELD_DISCARD_REASON))
  {
    // Check whether it is a general discard reason
 if (inMetaValues->discardMetadata.discardModule ==
        FWPS_DISCARD_MODULE_GENERAL)
    {
      // Check whether discarded by a filter
 if (inMetaValues->discardMetadata.discardReason ==
          FWPS_DISCARD_FIREWALL_POLICY)
      {
        // Increment the count of packets discarded by a filter
 InterlockedIncrement(&FilterDiscardCount);
      }
    }
  }

  // Take no action on the data
 classifyOut->actionType = FWP_ACTION_CONTINUE;
}

clasificarFn