알림 설명선 처리

필터 엔진은 콜아웃의 notifyFn 콜아웃 함수를 호출하여 콜아웃 드라이버에 콜아웃과 연결된 이벤트에 대해 알립니다.

필터 추가

필터 작업에 대한 콜아웃을 지정하는 필터가 필터 엔진에 추가되면 필터 엔진은 callout의 notifyFn callout 함수를 호출하여 notifyType 매개 변수의 FWPS_CALLOUT_NOTIFY_ADD_FILTER 전달합니다.

필터 작업에 대한 설명선이 필터 엔진에 이미 추가된 후 설명선 드라이버는 필터 엔진에 설명선이 추가된 후 필터 엔진에 설명선 등록을 할 수 있습니다. 이 경우 필터 엔진은 설명선의 notifyFn 설명선 함수를 호출하여 기존 필터에 대해 설명선에 알리지 않습니다.

필터 엔진은 필터 작업에 대한 설명선이 필터 엔진에 추가되면 설명선의 notifyFn 설명선 함수만 호출하여 설명선에 알립니다. 이 경우 필터 작업에 대한 콜아웃을 지정하는 필터 엔진의 모든 필터에 대해 callout의 notifyFn callout 함수가 호출되지 않을 수 있습니다.

필터 엔진이 시작된 후 설명선 드라이버가 설명선에 등록하고 설명선이 필터 동작에 대한 설명선 을 지정하는 필터 엔진의 모든 필터에 대한 정보를 수신해야 하는 경우 설명선 드라이버는 적절한 관리 함수를 호출하여 필터 엔진의 모든 필터를 열거해야 합니다. 설명선 드라이버는 모든 필터의 결과 목록을 정렬하여 필터 작업에 대한 설명선이 지정된 필터를 찾아야 합니다. 이러한 함수를 호출하는 방법에 대한 자세한 내용은 다른 Windows 필터링 플랫폼 함수 호출을 참조하세요.

필터 삭제

필터 작업에 대한 설명선이 필터 엔진에서 삭제되면 필터 엔진은 설명선의 notifyFn 설명선 함수를 호출하고 notifyType 매개 변수의 FWPS_CALLOUT_NOTIFY_DELETE_FILTER 전달하고 filterKey 매개 변수의 NULL을 전달합니다. 필터 엔진은 필터 작업에 대한 콜아웃을 지정하는 필터 엔진의 삭제된 모든 필터에 대해 callout의 notifyFn 콜아웃 함수를 호출합니다. 여기에는 설명선 드라이버가 필터 엔진에 설명선이 등록되기 전에 필터 엔진에 추가된 필터가 포함됩니다. 따라서 설명선은 필터 추가 알림을 받지 못한 필터에 대한 필터 삭제 알림을 받을 수 있습니다.

callout의 notifyFn callout 함수가 notifyType 매개 변수에 전달된 알림 종류를 인식하지 못하는 경우 알림을 무시하고 STATUS_SUCCESS 반환해야 합니다.

설명선 드라이버는 필터 엔진에 필터를 추가할 때 필터와 연결할 컨텍스트를 지정할 수 있습니다. 이러한 컨텍스트는 필터 엔진에 불투명합니다. 설명선의 classifyFn 설명선 함수는 이 컨텍스트를 사용하여 다음에 필터 엔진에서 호출할 때 상태 정보를 저장할 수 있습니다. 필터 엔진에서 필터가 삭제되면 설명선 드라이버는 컨텍스트에 필요한 정리를 수행합니다.

예:

// Context structure to be associated with the filters
typedef struct FILTER_CONTEXT_ {
  .
  .  // Driver-specific content
  .
} FILTER_CONTEXT, *PFILTER_CONTEXT;

// Memory pool tag for filter context structures
#define FILTER_CONTEXT_POOL_TAG 'fcpt'

// notifyFn callout function
NTSTATUS NTAPI
 NotifyFn(
    IN FWPS_CALLOUT_NOTIFY_TYPE  notifyType,
    IN const GUID  *filterKey,
    IN const FWPS_FILTER0  *filter
    )
{
  PFILTER_CONTEXT context;

 ASSERT(filter != NULL);

  // Switch on the type of notification
 switch(notifyType) {

    // A filter is being added to the filter engine
 case FWPS_CALLOUT_NOTIFY_ADD_FILTER:

      // Allocate the filter context structure
 context =
        (PFILTER_CONTEXT)ExAllocatePoolWithTag(
 NonPagedPool,
 sizeof(FILTER_CONTEXT),
          FILTER_CONTEXT_POOL_TAG
          );

      // Check the result of the memory allocation
 if (context == NULL) {

        // Return error
 return STATUS_INSUFFICIENT_RESOURCES;
      }

      // Initialize the filter context structure
      ...

      // Associate the filter context structure with the filter
 filter->context = (UINT64)context;

 break;

    // A filter is being removed from the filter engine
 case FWPS_CALLOUT_NOTIFY_DELETE_FILTER:

      // Get the filter context structure from the filter
 context = (PFILTER_CONTEXT)filter->context;

 // Check whether the filter has a context
 if (context) {

        // Cleanup the filter context structure
        ...

        // Free the memory for the filter context structure
 ExFreePoolWithTag(
 context,
          FILTER_CONTEXT_POOL_TAG
          );

      }
 break;

    // Unknown notification
 default:

      // Do nothing
 break;
  }

 return STATUS_SUCCESS;
}