Поделиться через


Журналирование данных

Чтобы определить, какие данные следует регистрировать, функция выносного вызова classifyFn может проверять любое сочетание полей данных, полей метаданных и любых необработанных данных, передаваемых в нее, а также любые соответствующие данные, которые были сохранены в контексте, связанном с фильтром или потоком данных.

Например, если вызов отслеживает количество входящих пакетов IPv4, отбрасываемых фильтром на сетевом уровне, вызов добавляется в подсистему фильтрации на уровне FWPM_LAYER_INBOUND_IPPACKET_V4_DISCARD. В этой ситуации функция выноски классифицироватьFn может выглядеть следующим образом:

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

классифицироватьFn