Разрабатываю сетевой фильтр использующий Windows Filtering Platform. Компилирую в Visual Studio 2010. Запускается в системе Windows 7 x32. Проблема — не удается заблокировать доступ в сеть для определенного приложения. При удалении условия фильтрации в котором указано приложение — программа фильтрует запросы в сеть для всех приложениях. Тут следует отметить следующий момент: вместо Filter.layerKey=FWPM_LAYER_ALE_AUTH_CONNECT_V4 приходится установить Filter.layerKey=FWPM_LAYER_ALE_AUTH_CONNECT_V4, иначе будет ошибка при добавлении фильтра. Заранее благодарен за ответы!
Код программы:
void main(){
cout << "Test firewall\n";
HANDLE hEngine=NULL;
DWORD dwFwAPiRetCode = ERROR_BAD_COMMAND;
//Initialization Engine
cout << "Create engine\n";
dwFwAPiRetCode=FwpmEngineOpen0(NULL, RPC_C_AUTHN_WINNT,NULL,NULL,&hEngine);
if (dwFwAPiRetCode==ERROR_SUCCESS) cout << "ERROR_SUCCESS\n";
FWPM_SUBLAYER0 SubLayer = {0};
SubLayer.subLayerKey=subLayer_GUID;
SubLayer.displayData.name=SubLayer_name;
SubLayer.displayData.description=SubLayer_name;
SubLayer.flags=FWPM_SUBLAYER_FLAG_PERSISTENT;
SubLayer.weight=0x01;
cout << "Sublayer Add\n";
dwFwAPiRetCode=FwpmSubLayerAdd0(hEngine,&SubLayer,NULL);
if (dwFwAPiRetCode==ERROR_SUCCESS) cout << "ERROR_SUCCESS\n";
else {
cout << " Error\n";
}
FWPM_FILTER0 Filter = {0};
FWPM_FILTER_CONDITION0 Condition[3];
memset(&Filter,0,sizeof(Filter));
Filter.action.type = FWP_ACTION_BLOCK;
Filter.subLayerKey = subLayer_GUID;
Filter.displayData.name = L"Test Sublayer";
Filter.weight.type = FWP_EMPTY;
Filter.layerKey=FWPM_LAYER_ALE_AUTH_CONNECT_V4 ;//FWPM_LAYER_INBOUND_TRANSPORT_V4
Filter.numFilterConditions=3; ///
Filter.filterCondition=Condition;
FWP_V4_ADDR_AND_MASK AddrMask;
//IP 192.168.2.1
AddrMask.addr=0xC0A80201;
AddrMask.mask=0xffffffff;
Condition[0].fieldKey=FWPM_CONDITION_IP_REMOTE_ADDRESS;
Condition[0].matchType=FWP_MATCH_EQUAL;
Condition[0].conditionValue.type=FWP_V4_ADDR_MASK;
Condition[0].conditionValue.v4AddrMask=&AddrMask;
UINT16 port_block;
port_block = 80;
Condition[1].fieldKey=FWPM_CONDITION_IP_REMOTE_PORT;
Condition[1].matchType=FWP_MATCH_EQUAL;
Condition[1].conditionValue.type=FWP_UINT16;
Condition[1].conditionValue.uint16=port_block;
FWP_BYTE_BLOB *applicationID=NULL;
dwFwAPiRetCode=FwpmGetAppIdFromFileName0(L"C:\\Program File\\Mozilla Firefox\\firefox.exe",&applicationID);
cout << "RETCODE FwpmGetAppIdFromFileName0: " << dwFwAPiRetCode << endl;
Condition[2].fieldKey=FWPM_CONDITION_ALE_APP_ID;
Condition[2].matchType=FWP_MATCH_EQUAL;
Condition[2].conditionValue.type=FWP_BYTE_BLOB_TYPE;
Condition[2].conditionValue.byteBlob=applicationID;
UINT64 filterId;
cout << "Add filter\n";
dwFwAPiRetCode = FwpmFilterAdd0(hEngine,&Filter,NULL,&filterId);
if (dwFwAPiRetCode==ERROR_SUCCESS) cout << "ERROR_SUCCESS\n";
else printf("Error code: %x \n",dwFwAPiRetCode);
cin.get();
cout << "Deleting filter\n";
FwpmFilterDeleteById0(hEngine,filterId);
cout << "Deleting Sublayer\n";
FwpmSubLayerDeleteByKey0(hEngine,&subLayer_GUID);
cout << "Close engine\n";
FwpmEngineClose0(hEngine);
cin.get();
}
Разобрался! проблема была в том, что параллельно был запущен KIS 2011. Он использует локальный прокси сервер, на который перенаправляет все соединения на USER MODE.