VirtualBox

Changeset 60620 in vbox for trunk/src/VBox/HostDrivers


Ignore:
Timestamp:
Apr 21, 2016 12:12:08 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
106768
Message:

hostdrivers/VBoxNetFlt/cfg: fix for ​bugref:8335: added dynamic resolving of Net Win API functions to be able to run on WinXP. It will not add default metric value on WinXP.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp

    r60318 r60620  
    6161#define VBOX_NETCFG_LOCK_TIME_OUT     5000  /** @todo r=bird: What does this do? */
    6262
     63
     64/*
     65* Wrappers for HelpAPI functions
     66*/
     67typedef void FNINITIALIZEIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
     68typedef FNINITIALIZEIPINTERFACEENTRY *PFNINITIALIZEIPINTERFACEENTRY;
     69
     70typedef NETIOAPI_API FNGETIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
     71typedef FNGETIPINTERFACEENTRY *PFNGETIPINTERFACEENTRY;
     72
     73typedef NETIOAPI_API FNSETIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
     74typedef FNSETIPINTERFACEENTRY *PFNSETIPINTERFACEENTRY;
     75
     76static  PFNINITIALIZEIPINTERFACEENTRY   g_pfnInitializeIpInterfaceEntry = NULL;
     77static  PFNGETIPINTERFACEENTRY          g_pfnGetIpInterfaceEntry        = NULL;
     78static  PFNSETIPINTERFACEENTRY          g_pfnSetIpInterfaceEntry        = NULL;
     79
     80
    6381/*
    6482* Forward declaration for using vboxNetCfgWinSetupMetric()
     
    6684HRESULT vboxNetCfgWinSetupMetric(IN HKEY hKey);
    6785HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID* pLUID);
     86
    6887
    6988/*
     
    298317        {
    299318            HKEY hkey;
    300             NET_LUID luid;
    301319            HRESULT res;
    302320
     
    33573375
    33583376
     3377HRESULT vboxLoadIpHelpFunctions(HINSTANCE& pIpHlpInstance)
     3378{
     3379    Assert(pIpHlpInstance != NULL);
     3380
     3381    pIpHlpInstance = loadSystemDll("Iphlpapi.dll");
     3382    if (pIpHlpInstance == NULL)
     3383        return E_FAIL;
     3384   
     3385    g_pfnInitializeIpInterfaceEntry =
     3386        (PFNINITIALIZEIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "InitializeIpInterfaceEntry");
     3387    Assert(g_pfnInitializeIpInterfaceEntry);
     3388
     3389    if (g_pfnInitializeIpInterfaceEntry)
     3390    {
     3391        g_pfnGetIpInterfaceEntry =
     3392            (PFNGETIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "GetIpInterfaceEntry");
     3393        Assert(g_pfnGetIpInterfaceEntry);
     3394    }
     3395
     3396    if (g_pfnGetIpInterfaceEntry)
     3397    {
     3398        g_pfnSetIpInterfaceEntry =
     3399            (PFNSETIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "SetIpInterfaceEntry");
     3400        Assert(g_pfnSetIpInterfaceEntry);
     3401    }
     3402
     3403    if (g_pfnInitializeIpInterfaceEntry == NULL)
     3404    {
     3405        FreeLibrary(pIpHlpInstance);
     3406        pIpHlpInstance = NULL;
     3407        return E_FAIL;
     3408    }
     3409
     3410    return S_OK;
     3411}
     3412
     3413
    33593414HRESULT vboxNetCfgWinGetLoopbackMetric(OUT int* Metric)
    33603415{
    3361     HRESULT status = S_OK;
     3416    HRESULT rc = S_OK;
    33623417    MIB_IPINTERFACE_ROW row;
    33633418
    3364     InitializeIpInterfaceEntry(&row);
     3419    Assert(g_pfnInitializeIpInterfaceEntry != NULL);
     3420    Assert(g_pfnGetIpInterfaceEntry != NULL);
     3421
     3422    g_pfnInitializeIpInterfaceEntry(&row);
    33653423    row.Family = AF_INET;
    33663424    row.InterfaceLuid.Info.IfType = IF_TYPE_SOFTWARE_LOOPBACK;
    33673425
    3368     status = GetIpInterfaceEntry(&row);
    3369     if (status != 0)
     3426    rc = g_pfnGetIpInterfaceEntry(&row);
     3427    if (rc != 0)
    33703428        return E_FAIL;
    33713429
    33723430    *Metric = row.Metric;
    33733431
    3374     return status;
     3432    return rc;
    33753433}
    33763434
     
    33813439{
    33823440    MIB_IPINTERFACE_ROW newRow;
    3383     InitializeIpInterfaceEntry(&newRow);
     3441
     3442    Assert(g_pfnInitializeIpInterfaceEntry != NULL);
     3443    Assert(g_pfnSetIpInterfaceEntry != NULL);
     3444
     3445    g_pfnInitializeIpInterfaceEntry(&newRow);
    33843446    // identificate the interface to change
    33853447    newRow.InterfaceLuid = *pInterfaceLuid;
     
    33903452
    33913453    // change settings
    3392     return SetIpInterfaceEntry(&newRow);
     3454    return g_pfnSetIpInterfaceEntry(&newRow);
    33933455}
    33943456
     
    34273489HRESULT vboxNetCfgWinSetupMetric(IN HKEY hKey)
    34283490{
    3429     HRESULT status = S_OK;
     3491    HRESULT rc = S_OK;
     3492    HINSTANCE hModule = NULL;
    34303493    NET_LUID luid;
    34313494    int loopbackMetric;
    3432 
    3433     status = vboxNetCfgWinGetInterfaceLUID(hKey, &luid);
    3434     if (FAILED(status))
    3435         return status;
    3436 
    3437     status = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
    3438     if (FAILED(status))
    3439         return status;
    3440 
    3441     status = vboxNetCfgWinSetInterfaceMetric(&luid, loopbackMetric - 1);
    3442 
    3443     return status;
    3444 }
    3445 
    3446 
     3495   
     3496    rc = vboxLoadIpHelpFunctions(hModule);
     3497
     3498    if(SUCCEEDED(rc))
     3499        rc = vboxNetCfgWinGetInterfaceLUID(hKey, &luid);
     3500
     3501    if(SUCCEEDED(rc))
     3502        rc = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
     3503
     3504    if(SUCCEEDED(rc))
     3505        rc = vboxNetCfgWinSetInterfaceMetric(&luid, loopbackMetric - 1);
     3506
     3507    g_pfnInitializeIpInterfaceEntry = NULL;
     3508    g_pfnSetIpInterfaceEntry = NULL;
     3509    g_pfnGetIpInterfaceEntry = NULL;
     3510
     3511    FreeLibrary(hModule);
     3512    return rc;
     3513}
    34473514#ifdef VBOXNETCFG_DELAYEDRENAME
    34483515VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameHostOnlyConnection(IN const GUID *pGuid, IN LPCWSTR pwszId, OUT BSTR *pDevName)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette