Registro de datos
Para determinar qué datos se deben registrar, la función de llamada classifyFn de una llamada puede inspeccionar cualquier combinación de los campos de datos, los campos de metadatos y los datos sin procesar que se le pasen, así como los datos relevantes que se han almacenado en un contexto asociado al filtro o al flujo de datos.
Por ejemplo, si una llamada realiza un seguimiento del número de paquetes IPv4 entrantes (entrantes) descartados por un filtro en la capa de red, la llamada se agrega al motor de filtros en la capa de FWPM_LAYER_INBOUND_IPPACKET_V4_DISCARD. En esta situación, la función de llamada classifyFn de la llamada podría parecerse al ejemplo siguiente:
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;
}