다음을 통해 공유


데이터 로깅

기록할 데이터를 결정하기 위해 호출부의 classifyFn 호출 함수는 데이터 필드, 메타데이터 필드, 전달된 원시 데이터와 필터 또는 데이터 흐름에 연관된 컨텍스트에 저장된 모든 관련 데이터의 조합을 검사할 수 있습니다.

예를 들어, 콜아웃이 네트워크 계층의 필터에 의해 삭제되는 들어오는(인바운드) IPv4 패킷 수를 추적하는 경우, 이 콜아웃은 FWPM_LAYER_INBOUND_IPPACKET_V4_DISCARD 계층의 필터 엔진에 추가됩니다. 이 경우 콜아웃의 classifyFn 콜아웃 함수는 다음 예제와 유사할 수 있습니다.

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

classifyFn