Я написал программу для проверки пакетов на уровнях DISCARD WFP. Чтобы узнать причину и отфильтровать идентификатор сброса, я использую следующий код:
if (FWPS_IS_METADATA_FIELD_PRESENT(inMetaValues, FWPS_METADATA_FIELD_DISCARD_REASON))
{
FWPS_DISCARD_METADATA0 discardData = inMetaValues->discardMetadata;
FWPS_DISCARD_MODULE0 discardModule = discardData.discardModule;
UINT32 discardReason = discardData.discardReason;
UINT64 discardFilter = discardData.filterId;
switch (discardModule)
{
case FWPS_DISCARD_MODULE_NETWORK:
PrintNetworkDiscardReason(discardReason);
break;
case FWPS_DISCARD_MODULE_TRANSPORT:
PrintTransportDiscardReason(discardReason);
break;
case FWPS_DISCARD_MODULE_GENERAL:
if (FWPS_DISCARD_FIREWALL_POLICY == discardReason)
{
PRINT_MSG("DISCARD_REASON: FWPS_DISCARD_FIREWALL_POLICY");
}
else if (FWPS_DISCARD_IPSEC == discardReason)
{
PRINT_MSG("DISCARD_REASON: FWPS_DISCARD_IPSEC");
}
break;
}
PRINT_MSG("DISCARD FILTER: %x", discardFilter);
}
Запишите правильно filterId записи, когда пакет сбрасывается брандмауэром Windows (на некотором эль-уровне), но filterId равен нулю, когда антивирус блокирует пакеты (на уровне FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD).
Можно ли получить filterId фильтра, который отбрасывает эти пакеты?