VirtualBox

Ignore:
Timestamp:
Mar 20, 2019 8:05:37 AM (6 years ago)
Author:
vboxsync
Message:

NetAdp/Win: (bugref:9409) Store host-only adapter configuration in extra data. Create missing adapters when listing/creating/removing adapters.

File:
1 edited

Legend:

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

    r76553 r77804  
    25802580}
    25812581
     2582static bool vboxNetCfgWinDetectStaleConnection(PCWSTR pName)
     2583{
     2584    HKEY hkeyConnection, hkeyAdapter, hkeyAdapters;
     2585    WCHAR wszAdaptersKeyName[] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}";
     2586    WCHAR wszAdapterSubKeyName[MAX_PATH];
     2587    LSTATUS status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, wszAdaptersKeyName, 0, KEY_ALL_ACCESS, &hkeyAdapters);
     2588    if (status != ERROR_SUCCESS)
     2589        return false;
     2590
     2591    bool fFailureImminent = false;
     2592    for (DWORD i = 0; !fFailureImminent; ++i)
     2593    {
     2594        DWORD cbName = MAX_PATH;
     2595        status = RegEnumKeyEx(hkeyAdapters, i, wszAdapterSubKeyName, &cbName, NULL, NULL, NULL, NULL);
     2596        // if (status == ERROR_NO_MORE_ITEMS)
     2597        //     break;
     2598        if (status != ERROR_SUCCESS)
     2599            break;
     2600
     2601        status = RegOpenKeyEx(hkeyAdapters, wszAdapterSubKeyName, 0, KEY_ALL_ACCESS, &hkeyAdapter);
     2602        if (status == ERROR_SUCCESS)
     2603        {
     2604            status = RegOpenKeyEx(hkeyAdapter, L"Connection", 0, KEY_ALL_ACCESS, &hkeyConnection);
     2605            if (status == ERROR_SUCCESS)
     2606            {
     2607                WCHAR wszName[MAX_PATH];
     2608                cbName = MAX_PATH;
     2609                status = RegQueryValueEx(hkeyConnection, L"Name", NULL, NULL, (LPBYTE)wszName, &cbName);
     2610                if (status == ERROR_SUCCESS)
     2611                    if (wcsicmp(wszName, pName) == 0)
     2612                        fFailureImminent = true;
     2613                RegCloseKey(hkeyConnection);
     2614            }
     2615            RegCloseKey(hkeyAdapter);
     2616        }
     2617    }
     2618    RegCloseKey(hkeyAdapters);
     2619
     2620    return fFailureImminent;
     2621}
     2622
    25822623VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameConnection (LPWSTR pGuid, PCWSTR NewName)
    25832624{
     
    25862627    HRESULT status;
    25872628
     2629    /*
     2630     * Before attempting to rename the connection, check if there is a stale
     2631     * connection with the same name. We must return ok, so the rest of
     2632     * configuration process proceeds normally.
     2633     */
     2634    if (vboxNetCfgWinDetectStaleConnection(NewName))
     2635        return S_OK;
    25882636    /* First try the IShellFolder interface, which was unimplemented
    25892637     * for the network connections folder before XP. */
     
    28812929}
    28822930
    2883 static HRESULT vboxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile,
     2931typedef struct {
     2932    BSTR bstrName;
     2933    GUID *pGuid;
     2934    HRESULT hr;
     2935} RENAMING_CONTEXT;
     2936
     2937static BOOL vboxNetCfgWinRenameHostOnlyNetworkInterface(IN INetCfg *pNc, IN INetCfgComponent *pNcc, PVOID pContext)
     2938{
     2939    RT_NOREF1(pNc);
     2940    RENAMING_CONTEXT *pParams = (RENAMING_CONTEXT *)pContext;
     2941
     2942    GUID guid;
     2943    pParams->hr = pNcc->GetInstanceGuid(&guid);
     2944    if ( pParams->hr == S_OK && guid == *pParams->pGuid)
     2945    {
     2946        /* Located our component, rename it */
     2947        pParams->hr = pNcc->SetDisplayName(pParams->bstrName);
     2948        return FALSE;
     2949    }
     2950    return TRUE;
     2951}
     2952
     2953static HRESULT vboxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile, IN BSTR bstrDesiredName,
    28842954                                                           OUT GUID *pGuid, OUT BSTR *lppszName, OUT BSTR *pErrMsg)
    28852955{
     
    33263396        INetCfg *pNetCfg = NULL;
    33273397        LPWSTR lpszApp = NULL;
     3398
     3399        RENAMING_CONTEXT context;
     3400        context.hr = E_FAIL;
     3401
     3402        if (pGuid)
     3403        {
     3404            hrc = CLSIDFromString(pWCfgGuidString, (LPCLSID)pGuid);
     3405            if (FAILED(hrc))
     3406                NonStandardLogFlow(("CLSIDFromString failed, hrc (0x%x)\n", hrc));
     3407        }
     3408
     3409        hr = VBoxNetCfgWinQueryINetCfg(&pNetCfg, TRUE, L"VirtualBox Host-Only Creation",
     3410                                       30 * 1000, /* on Vista we often get 6to4svc.dll holding the lock, wait for 30 sec.  */
     3411                                       /** @todo special handling for 6to4svc.dll ???, i.e. several retrieves */
     3412                                       &lpszApp);
     3413        if (hr == S_OK)
     3414        {
     3415            if (SysStringLen(bstrDesiredName) != 0)
     3416            {
     3417                /* Rename only if the desired name has been provided */
     3418                context.bstrName = bstrDesiredName;
     3419                context.pGuid = pGuid;
     3420                hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
     3421                                                       &GUID_DEVCLASS_NET,
     3422                                                       vboxNetCfgWinRenameHostOnlyNetworkInterface,
     3423                                                       &context);
     3424            }
     3425            if (SUCCEEDED(hr))
     3426                hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
     3427                                                       &GUID_DEVCLASS_NETSERVICE,
     3428                                                       vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
     3429                                                       pGuid);
     3430            if (SUCCEEDED(hr))
     3431                hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
     3432                                                       &GUID_DEVCLASS_NETTRANS,
     3433                                                       vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
     3434                                                       pGuid);
     3435            if (SUCCEEDED(hr))
     3436                hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
     3437                                                       &GUID_DEVCLASS_NETCLIENT,
     3438                                                       vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
     3439                                                       pGuid);
     3440            if (SUCCEEDED(hr))
     3441            {
     3442                hr = pNetCfg->Apply();
     3443            }
     3444            else
     3445                NonStandardLogFlow(("Enumeration failed, hr 0x%x\n", hr));
     3446            VBoxNetCfgWinReleaseINetCfg(pNetCfg, TRUE);
     3447        }
     3448        else if (hr == NETCFG_E_NO_WRITE_LOCK && lpszApp)
     3449        {
     3450            NonStandardLogFlow(("Application %ws is holding the lock, failed\n", lpszApp));
     3451            CoTaskMemFree(lpszApp);
     3452        }
     3453        else
     3454            NonStandardLogFlow(("VBoxNetCfgWinQueryINetCfg failed, hr 0x%x\n", hr));
     3455
    33283456#ifndef VBOXNETCFG_DELAYEDRENAME
     3457        if (SUCCEEDED(hr) && SUCCEEDED(context.hr))
     3458        {
     3459            /* The device has been successfully renamed, replace the name now. */
     3460            wcscpy_s(DevName, RT_ELEMENTS(DevName), bstrDesiredName);
     3461        }
     3462
    33293463        WCHAR ConnectionName[128];
    33303464        ULONG cbName = sizeof(ConnectionName);
     
    33433477            }
    33443478        }
    3345 
    3346         if (pGuid)
    3347         {
    3348             hrc = CLSIDFromString(pWCfgGuidString, (LPCLSID)pGuid);
    3349             if (FAILED(hrc))
    3350                 NonStandardLogFlow(("CLSIDFromString failed, hrc (0x%x)\n", hrc));
    3351         }
    3352 
    3353         hr = VBoxNetCfgWinQueryINetCfg(&pNetCfg, TRUE, L"VirtualBox Host-Only Creation",
    3354                                        30 * 1000, /* on Vista we often get 6to4svc.dll holding the lock, wait for 30 sec.  */
    3355                                        /** @todo special handling for 6to4svc.dll ???, i.e. several retrieves */
    3356                                        &lpszApp);
    3357         if (hr == S_OK)
    3358         {
    3359             hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3360                                                    &GUID_DEVCLASS_NETSERVICE,
    3361                                                    vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
    3362                                                    pGuid);
    3363             if (SUCCEEDED(hr))
    3364             {
    3365                 hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3366                                                        &GUID_DEVCLASS_NETTRANS,
    3367                                                        vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
    3368                                                        pGuid);
    3369                 if (SUCCEEDED(hr))
    3370                     hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3371                                                            &GUID_DEVCLASS_NETCLIENT,
    3372                                                            vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
    3373                                                            pGuid);
    3374             }
    3375 
    3376             if (SUCCEEDED(hr))
    3377             {
    3378                 hr = pNetCfg->Apply();
    3379             }
    3380             else
    3381                 NonStandardLogFlow(("Enumeration failed, hr 0x%x\n", hr));
    3382             VBoxNetCfgWinReleaseINetCfg(pNetCfg, TRUE);
    3383         }
    3384         else if (hr == NETCFG_E_NO_WRITE_LOCK && lpszApp)
    3385         {
    3386             NonStandardLogFlow(("Application %ws is holding the lock, failed\n", lpszApp));
    3387             CoTaskMemFree(lpszApp);
    3388         }
    3389         else
    3390             NonStandardLogFlow(("VBoxNetCfgWinQueryINetCfg failed, hr 0x%x\n", hr));
    33913479    }
    33923480
     
    33973485}
    33983486
    3399 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile,
     3487VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile, IN BSTR pwsDesiredName,
    34003488                                                                        OUT GUID *pGuid, OUT BSTR *lppszName, OUT BSTR *pErrMsg)
    34013489{
    3402     HRESULT hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pGuid, lppszName, pErrMsg);
     3490    HRESULT hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pwsDesiredName, pGuid, lppszName, pErrMsg);
    34033491    if (hrc == E_ABORT)
    34043492    {
     
    34123500         * See @bugref{7973} for details.
    34133501         */
    3414         hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pGuid, lppszName, pErrMsg);
     3502        hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pwsDesiredName, pGuid, lppszName, pErrMsg);
    34153503        if (hrc == E_ABORT)
    34163504        {
     
    34353523                        Sleep(1000);
    34363524                    CloseServiceHandle(hService);
    3437                     hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pGuid, lppszName, pErrMsg);
     3525                    hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pwsDesiredName, pGuid, lppszName, pErrMsg);
    34383526                }
    34393527                else
Note: See TracChangeset for help on using the changeset viewer.

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