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


Функция FwpmFilterAdd0 (fwpmk.h)

Функция FwpmFilterAdd0 добавляет новый объект фильтра в систему.

Синтаксис

NTSTATUS FwpmFilterAdd0(
  [in]            HANDLE               engineHandle,
  [in]            const FWPM_FILTER0   *filter,
  [in, optional]  PSECURITY_DESCRIPTOR sd,
  [out, optional] UINT64               *id
);

Параметры

[in] engineHandle

Обработка открытого сеанса в обработчике фильтров. Вызовите FwpmEngineOpen0, чтобы открыть сеанс в обработчике фильтров.

[in] filter

Добавляемый объект фильтра.

[in, optional] sd

Сведения о безопасности объекта фильтра.

[out, optional] id

Идентификатор среды выполнения для этого фильтра.

Возвращаемое значение

Возврат кода или значения Описание
ERROR_SUCCESS
0
Фильтр был успешно добавлен.
ERROR_INVALID_SECURITY_DESCR
0x8007053A
Недопустимая структура дескриптора безопасности. Или условие фильтра содержит дескриптор безопасности в абсолютном формате.
FWP_E_CALLOUT_NOTIFICATION_FAILED
0x80320037
Вызывающий объект добавил фильтр выноски, а выноска вернула ошибку из его подпрограммы уведомлений.
код ошибки FWP_E_*
0x80320001 — 0x80320039
Конкретная ошибка платформы фильтрации Windows (МПП). Дополнительные сведения см. в кодов ошибок МПП.
код ошибки RPC_*
0x80010001 — 0x80010122
Не удаляйте связь с подсистемой удаленного или локального брандмауэра.
другие коды NTSTATUS Произошла ошибка.

Замечания

FwpmFilterAdd0 добавляет фильтр к указанному подслою на каждом уровне фильтрации в системе.

Некоторые поля в структуре FWPM_FILTER0 назначаются системой, а не вызывающим, и игнорируются в вызове FwpmFilterAdd0.

Если вызывающий объект предоставляет дескриптор безопасности NULL, система назначит дескриптор безопасности по умолчанию.

Чтобы заблокировать подключения к определенным расположениям, добавьте фильтр FWP_ACTION_BLOCK, указывающий локальный адрес на уровне FWPM_LAYER_ALE_AUTH_CONNECT_V** или добавьте фильтр FWP_ACTION_BLOCK без указания локального адреса на уровне FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V* .

Если локальный адрес указан на уровне назначения ресурсов, неявная привязка будет выполнена успешно, так как адрес, тип адреса и порт могут возвращаться как FWP_EMPTY.

Структура FWPM_FILTER0 может пометить фильтр как загрузочный или постоянный фильтр. Фильтры во время загрузки добавляются в ядро базовой фильтрации (BFE) при запуске драйвера TCP/IP и удаляются после завершения инициализации BFE. Постоянные объекты добавляются при запуске BFE.

Эта функция не может вызываться из транзакции только для чтения, она завершается ошибкой с FWP_E_INCOMPATIBLE_TXN. Дополнительные сведения о транзакциях см. в управления объектами.

Вызывающий объект должен иметь следующие права доступа:

Дополнительные сведения см. в управления доступом.

Чтобы добавить фильтр, ссылающийся на выноску, вызовите функции в следующем порядке.

  • Вызовите FwpsCalloutRegister0 (документировано в комплекте драйверов Windows (WDK)), чтобы зарегистрировать выноску в обработчике фильтров.
  • Вызовите FwpmCalloutAdd0, чтобы добавить выноску в систему.
  • Вызовите FwpmFilterAdd0, чтобы добавить фильтр, ссылающийся на выноску в систему.

По умолчанию фильтры, которые ссылаются на добавленные выноски, но еще не зарегистрированы в обработчике фильтров, рассматриваются как фильтры блоков.

FwpmFilterAdd0 является конкретной реализацией FwpmFilterAdd. Дополнительные сведения см. в статье МПП Version-Independent имен и целевых версий Windows.

Примеры

В следующем примере C++ показано, как инициализировать и добавить фильтр с помощью FwpmFilterAdd0, который специально блокирует трафик на IP-версии 4 для всех приложений.

// Add filter to block traffic on IP V4 for all applications. 
//
FWPM_FILTER0      fwpFilter;
FWPM_SUBLAYER0    fwpFilterSubLayer;  

RtlZeroMemory(&fwpFilter, sizeof(FWPM_FILTER0));

fwpFilter.layerKey = FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4;
fwpFilter.action.type = FWP_ACTION_BLOCK;

if (&fwpFilterSubLayer.subLayerKey != NULL)
    fwpFilter.subLayerKey = fwpFilterSubLayer.subLayerKey;

fwpFilter.weight.type = FWP_EMPTY; // auto-weight.
fwpFilter.numFilterConditions = 0; // this applies to all application traffic
fwpFilter.displayData.name = L"Receive/Accept Layer Block";
fwpFilter.displayData.description = L"Filter to block all inbound connections.";

printf("Adding filter to block all inbound connections.\n");
result = FwpmFilterAdd0(engineHandle, &fwpFilter, NULL, NULL);

if (result != ERROR_SUCCESS)
    printf("FwpmFilterAdd0 failed. Return value: %d.\n", result);
else
    printf("Filter added successfully.\n");

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows Vista.
целевая платформа Всеобщий
заголовка fwpmk.h
библиотеки fwpkclnt.lib
IRQL <= PASSIVE_LEVEL

См. также