Использование выноски для глубокой проверки
Когда выноска выполняет глубокую проверку, ее функция выноски classifyFn может проверять любое сочетание фиксированных полей данных, полей метаданных и всех передаваемых ей необработанных данных пакета, а также все соответствующие данные, сохраненные в контексте, связанном с фильтром или потоком данных.
Пример:
// 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
)
{
PNET_BUFFER_LIST rawData;
...
// Test for the FWPS_RIGHT_ACTION_WRITE flag to check the rights
// for this callout to return an action. If this flag is not set,
// a callout can still return a BLOCK action in order to VETO a
// PERMIT action that was returned by a previous filter. In this
// example the function just exits if the flag is not set.
if (!(classifyOut->rights & FWPS_RIGHT_ACTION_WRITE))
{
// Return without specifying an action
return;
}
// Get the data fields from inFixedValues
...
// Get any metadata fields from inMetaValues
...
// Get the pointer to the raw data
rawData = (PNET_BUFFER_LIST)layerData;
// Get any filter context data from filter->context
...
// Get any flow context data from flowContext
...
// Inspect the various data sources to determine
// the action to be taken on the data
...
// If the data should be permitted...
if (...) {
// Set the action to permit the data
classifyOut->actionType = FWP_ACTION_PERMIT;
// Check whether the FWPS_RIGHT_ACTION_WRITE flag should be cleared
if (filter->flags & FWPS_FILTER_FLAG_CLEAR_ACTION_RIGHT)
{
// Clear the FWPS_RIGHT_ACTION_WRITE flag
classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
}
return;
}
...
// If the data should be blocked...
if (...) {
// Set the action to block the data
classifyOut->actionType = FWP_ACTION_BLOCK;
// Clear the FWPS_RIGHT_ACTION_WRITE flag
classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
return;
}
...
// If the decision to permit or block should be passed
// to the next filter in the filter engine...
if (...) {
// Set the action to continue with the next filter
classifyOut->actionType = FWP_ACTION_CONTINUE;
return;
}
...
}
Значение в filter-action.type> определяет, какие действия должна возвращать функция выноски classifyFn в элементе actionType структуры, на которую указывает параметр classifyOut. Дополнительные сведения об этих действиях см. в разделе структура FWPS_ACTION0 .
Если выноска должна выполнить дополнительную обработку данных пакета за пределами функции выноски classifyFn , прежде чем она сможет определить, следует ли разрешить или заблокировать данные, она должна выполнять передачу данных пакета до завершения обработки данных. Сведения о том, как выполнять данные пакета, см. в разделах Типы выносок и FwpsPendOperation0.
На некоторых уровнях фильтрации параметр layerData , передаваемый подсистемой фильтрации в функцию выноски classifyFn , имеет значение NULL.
Сведения о выполнении глубокой проверки потоковых данных см. в статье Использование выноски для глубокой проверки потоковых данных.