Функция 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. Дополнительные сведения о транзакциях см. в
Вызывающий объект должен иметь следующие права доступа:
- FWPM_ACTRL_ADD доступ к контейнеру фильтра
- FWPM_ACTRL_ADD_LINK доступ к поставщику (при наличии)
- FWPM_ACTRL_ADD_LINK доступ к применимому уровню
- FWPM_ACTRL_ADD_LINK доступ к применимому подслою
- FWPM_ACTRL_ADD_LINK доступ к выноске (при наличии)
- FWPM_ACTRL_ADD_LINK доступ к контексту поставщика (при наличии).
Дополнительные сведения см. в
Чтобы добавить фильтр, ссылающийся на выноску, вызовите функции в следующем порядке.
- Вызовите 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 |