필터 엔진에 설명선 등록

설명선 드라이버가 디바이스 개체를 만든 후 해당 설명선이 필터 엔진에 등록할 수 있습니다. 설명선 드라이버는 필터 엔진이 현재 실행되고 있지 않더라도 언제든지 해당 설명선에 필터 엔진을 등록할 수 있습니다. 콜아웃을 필터 엔진에 등록하기 위해 설명선 드라이버는 FwpsCalloutRegister0 함수를 호출합니다. 예:

// Prototypes for the callout's callout functions
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_OUT0  *classifyOut
    );

NTSTATUS NTAPI
 NotifyFn(
 IN FWPS_CALLOUT_NOTIFY_TYPE notifyType,
    IN const GUID  *filterKey,
    IN const FWPS_FILTER0  *filter
    );

VOID NTAPI
 FlowDeleteFn(
    IN UINT16  layerId,
    IN UINT32  calloutId,
    IN UINT64  flowContext
    );

// Callout registration structure
const FWPS_CALLOUT0 Callout =
{
 { ... }, // GUID key identifying the callout
  0,       // Callout-specific flags (none set here)
 ClassifyFn,
 NotifyFn,
 FlowDeleteFn
};

// Variable for the run-time callout identifier
UINT32 CalloutId;

NTSTATUS
 DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
  PDEVICE_OBJECT deviceObject;
  NTSTATUS status;

  ...

 status =
 FwpsCalloutRegister0(
 deviceObject,
      &Callout,
      &CalloutId
      );

  ...

 return status;
}

FwpsCalloutRegister0 함수에 대한 호출이 성공하면 마지막 매개 변수가 가리키는 변수에 설명선에 대한 런타임 식별자가 포함됩니다. 이 런타임 식별자는 설명선 키에 대해 지정된 GUID에 해당합니다.

단일 콜아웃 드라이버는 둘 이상의 콜아웃을 구현할 수 있습니다. 설명선 드라이버가 둘 이상의 설명선이 구현되는 경우 각 설명선이 필터 엔진에 각 설명선 등록을 지원하는 각 설명선에 대해 FwpsCalloutRegister0 함수를 한 번 호출합니다.

classifyFn