Регистрация выносок с помощью обработчика фильтров
После того как драйвер выноски создаст объект устройства, он может зарегистрировать свои выноски в подсистеме фильтрации. Драйвер выноски может зарегистрировать выноски в подсистеме фильтрации в любое время, даже если подсистема фильтров в настоящее время не работает. Чтобы зарегистрировать выноску в обработчике фильтров, драйвер выноски вызывает функцию 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 один раз для каждой выноски, которая поддерживается для регистрации каждой выноски в подсистеме фильтрации.