Поделиться через


Использование выноски для глубокой проверки

Когда выноска выполняет глубокую проверку, ее функция выноски 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.

Сведения о выполнении глубокой проверки потоковых данных см. в статье Использование выноски для глубокой проверки потоковых данных.