Я взял этот код из Интернета, чтобы добавить исключение брандмауэра для своего приложения:

STDAPI AddApplicationToExceptionListW( const WCHAR* strGameExeFullPath, const WCHAR* strFriendlyAppName )
{
    HRESULT hr = E_FAIL;
    bool bCleanupCOM = false;
    BSTR bstrFriendlyAppName = NULL;
    BSTR bstrGameExeFullPath = NULL;
    INetFwAuthorizedApplication* pFwApp = NULL;
    INetFwAuthorizedApplications* pFwApps = NULL;
    INetFwProfile* pFwProfile = NULL;

#ifdef SHOW_DEBUG_MSGBOXES
        WCHAR sz[1024];
        StringCchPrintf( sz, 1024, L"strFriendlyAppName='%s' strGameExeFullPath='%s'", strFriendlyAppName, strGameExeFullPath );
        MessageBox( NULL, sz, L"AddApplicationToExceptionListW", MB_OK );
#endif

    if( strGameExeFullPath == NULL || strFriendlyAppName == NULL )
    {
        assert( false );
        return E_INVALIDARG;
    }

    bstrGameExeFullPath = SysAllocString( strGameExeFullPath );
    bstrFriendlyAppName = SysAllocString( strFriendlyAppName );
    if( bstrGameExeFullPath == NULL || bstrFriendlyAppName == NULL )
    {
        hr = E_OUTOFMEMORY;
        goto LCleanup;
    }

    hr = CoInitialize( 0 );
    bCleanupCOM = SUCCEEDED( hr );

    pFwProfile = GetFirewallProfile();
    if( pFwProfile == NULL )
    {
        hr = E_FAIL;
        goto LCleanup;
    }

    hr = pFwProfile->get_AuthorizedApplications( &pFwApps );
    if( FAILED( hr ) )
        goto LCleanup;

    // Create an instance of an authorized application.
    hr = CoCreateInstance( __uuidof( NetFwAuthorizedApplication ), NULL,
                           CLSCTX_INPROC_SERVER, __uuidof( INetFwAuthorizedApplication ), ( void** )&pFwApp );
    if( FAILED( hr ) )
        goto LCleanup;

    // Set the process image file name.
    hr = pFwApp->put_ProcessImageFileName( bstrGameExeFullPath );
    if( FAILED( hr ) )
        goto LCleanup;

    // Set the application friendly name.
    hr = pFwApp->put_Name( bstrFriendlyAppName );
    if( FAILED( hr ) )
        goto LCleanup;

    // Add the application to the collection.
    hr = pFwApps->Add( pFwApp );

LCleanup:
    if( bstrFriendlyAppName ) SysFreeString( bstrFriendlyAppName );
    if( bstrGameExeFullPath ) SysFreeString( bstrGameExeFullPath );
    if( pFwApp ) pFwApp->Release();
    if( pFwApps ) pFwApps->Release();
    if( pFwProfile ) pFwProfile->Release();
    if( bCleanupCOM ) CoUninitialize();

    return hr;
}

Все отлично работает, когда я пытаюсь отправить данные через брандмауэр Windows, но входящие соединения по-прежнему блокируются. Поэтому мне нужно отключить брандмауэр, чтобы получать данные. Я думал, что это исключение разрешит все соединения (исходящие и входящие) ... Кто-нибудь знает, что я должен добавить в этот код, чтобы я мог получать входящие данные?

1
Thunder Storm 19 Дек 2013 в 23:52

2 ответа

Лучший ответ

В моем случае решением было удаление правил брандмауэра, которые блокировали мое приложение . Не знаю, откуда взялись эти правила, но теперь они наконец-то работают.

0
Thunder Storm 23 Дек 2013 в 16:25

Недостаточно просто добавить приложение само по себе. Брандмауэр не может определить, какой порт (а) приложение прослушивает для входящих подключений. Вы должны указать брандмауэру, какой порт (а) использует приложение. Это можно сделать с помощью INetFwProfile::GloballyOpenPorts, например:

INetFwOpenPorts *pFwPorts = NULL;
INetFwOpenPort *pFWPort = NULL;

...

hr = pFwProfile->get_GloballyOpenPorts( &pFwPorts );
if( FAILED( hr ) )
    goto LCleanup;

// Create an instance of an open port.
hr = CoCreateInstance( __uuidof( NetFwOpenPort ), NULL, CLSCTX_INPROC_SERVER, __uuidof( INetFwOpenPort ), ( void** )&pFwPort );
if( FAILED( hr ) )
    goto LCleanup;

// Set the port number.
hr = pFWPort->put_Port( ... );
if( FAILED( hr ) )
    goto LCleanup;

// Add the port to the collection.
hr = pFwPorts->Add( pFwPort );

...

if( pFwPort ) pFwPort->Release();
if( pFwPorts ) pFwPorts->Release();
2
Remy Lebeau 19 Дек 2013 в 20:25