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