VirtualBox

Ignore:
Timestamp:
Sep 1, 2022 8:36:22 PM (2 years ago)
Author:
vboxsync
Message:

HostDrives,Installer/win: Reworked the windows installer related code for no-CRT mode, where applicable, and changed the XxxxInstall.exe/XxxxUninstall.exe utilities to link against VBoxRT.dll instead of being statically linked. Lot's of cleanup. The change is uncomfortably large, but difficult to detangle these things. bugref:10261

Location:
trunk/src/VBox/HostDrivers/VBoxNetFlt
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk

    r96407 r96572  
    243243 # WinNetConfig - static library with host network interface config API (for the installer)
    244244 #
    245  LIBRARIES.win += WinNetConfig
    246  WinNetConfig_TEMPLATE = VBoxR3StaticDllNoAsan
    247  WinNetConfig_SDKS     = ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK)
    248  WinNetConfig_DEFS     = _WIN32_WINNT=0x0501 _UNICODE UNICODE
    249  WinNetConfig_INCS.win = $(PATH_TOOL_$(VBOX_VCC_TOOL)_INC)
    250  WinNetConfig_SOURCES  = win/cfg/VBoxNetCfg.cpp
    251 
    252  #
    253  # WinNetConfigNonStatic - static library with host network interface config API
    254  #
    255  LIBRARIES.win += WinNetConfigNonStatic
    256  WinNetConfigNonStatic_TEMPLATE = VBoxR3Dll
    257  WinNetConfigNonStatic_SDKS     = ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK)
    258  WinNetConfigNonStatic_DEFS     = _WIN32_WINNT=0x0501 _UNICODE UNICODE
    259  WinNetConfigNonStatic_INCS.win = $(PATH_TOOL_$(VBOX_VCC_TOOL)_INC)
    260  WinNetConfigNonStatic_SOURCES  = win/cfg/VBoxNetCfg.cpp
     245 LIBRARIES.win += WinNetConfigSharedStatic
     246 WinNetConfigSharedStatic_TEMPLATE = VBoxR3StaticDllNoAsan
     247 WinNetConfigSharedStatic_SDKS     = ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK)
     248 WinNetConfigSharedStatic_DEFS     = _UNICODE UNICODE
     249 WinNetConfigSharedStatic_SOURCES  = \
     250        win/cfg/VBoxNetCfg.cpp \
     251       ../../Main/glue/string.cpp
     252
     253 # Version for DLLs:
     254 LIBRARIES.win += WinNetConfigDll
     255 WinNetConfigDll_TEMPLATE = VBoxR3Dll
     256 WinNetConfigDll_EXTENDS  = WinNetConfigSharedStatic
     257
     258 # Version for EXEs:
     259 LIBRARIES.win += WinNetConfigExe
     260 WinNetConfigExe_TEMPLATE = VBOXR3EXE
     261 WinNetConfigExe_EXTENDS  = WinNetConfigSharedStatic
    261262
    262263
     
    265266 #
    266267 TEMPLATE_VBoxNetFltR3 = Template for NetFltInstall, NetFltUninstall, NetAdpInstall, NetAdpUninstall, ++
    267  TEMPLATE_VBoxNetFltR3_EXTENDS  = VBOXR3STATIC
    268  TEMPLATE_VBoxNetFltR3_SDKS     = $(TEMPLATE_VBOXR3STATIC_SDKS) ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK) VBOX_NTDLL VBOX_WIN_NEWDEV
    269  TEMPLATE_VBoxNetFltR3_CXXFLAGS = $(TEMPLATE_VBOXR3STATIC_CXXFLAGS) -Gz
    270  TEMPLATE_VBoxNetFltR3_CFLAGS   = $(TEMPLATE_VBOXR3STATIC_CFLAGS) -Gz
    271  TEMPLATE_VBoxNetFltR3_LIBS     = $(TEMPLATE_VBOXR3STATIC_LIBS) \
    272         $(WinNetConfig_1_TARGET) \
    273         $(PATH_STAGE_LIB)/VBoxDrvCfg$(VBOX_SUFF_LIB) \
     268 TEMPLATE_VBoxNetFltR3_EXTENDS  = VBOXR3EXE
     269 TEMPLATE_VBoxNetFltR3_SDKS     = $(TEMPLATE_VBOXR3EXE_SDKS) ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK) VBOX_NTDLL VBOX_WIN_NEWDEV
     270 TEMPLATE_VBoxNetFltR3_LIBS     = $(TEMPLATE_VBOXR3EXE_LIBS) \
     271        $(WinNetConfigExe_1_TARGET) \
     272        $(PATH_STAGE_LIB)/VBoxDrvCfgExe$(VBOX_SUFF_LIB) \
     273       $(LIB_RUNTIME) \
    274274        $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
    275275        $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/WbemUuid.Lib
     
    343343 endif
    344344 VBoxNetFltNobj_SDKS       = ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK)
    345  VBoxNetFltNobj_DEFS       = _WIN32_WINNT=0x0500 WIN32 _ATL_STATIC_REGISTRY
     345 VBoxNetFltNobj_DEFS       = WIN32 _ATL_STATIC_REGISTRY
    346346 VBoxNetFltNobj_INCS       = \
    347347        $(VBoxNetFltNobj_0_OUTDIR)
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp

    r96407 r96572  
    33 * VBoxNetCfg.cpp - Network Configuration API.
    44 */
     5
    56/*
    67 * Copyright (C) 2011-2022 Oracle and/or its affiliates.
     
    3334 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
    3435 */
     36
     37
     38/*********************************************************************************************************************************
     39*   Header Files                                                                                                                 *
     40*********************************************************************************************************************************/
     41#define _WIN32_DCOM
     42
    3543#include "VBox/VBoxNetCfg-win.h"
    3644#include "VBox/VBoxDrvCfg-win.h"
    3745
    38 #define _WIN32_DCOM
    39 
    4046#include <devguid.h>
    41 #include <stdio.h>
    4247#include <regstr.h>
    4348#include <iprt/win/shlobj.h>
    4449#include <cfgmgr32.h>
    45 #include <tchar.h>
    4650#include <iprt/win/objbase.h>
    4751
    48 #include <crtdbg.h>
    49 #include <stdlib.h>
    50 #include <string.h>
    51 
    5252#include <Wbemidl.h>
    53 #include <comutil.h>
    5453
    5554#include <iprt/win/winsock2.h>
     
    5958#include <iprt/win/iphlpapi.h>
    6059
    61 #include <set>
    62 
     60#include <iprt/asm.h>
     61#include <iprt/assertcompile.h>
     62#include <iprt/mem.h>
     63#include <iprt/list.h>
     64#include <iprt/rand.h>
     65#include <iprt/string.h>
     66#include <iprt/utf16.h>
     67#include <VBox/com/string.h>
     68
     69
     70/*********************************************************************************************************************************
     71*   Defined Constants And Macros                                                                                                 *
     72*********************************************************************************************************************************/
    6373#ifndef Assert   /** @todo r=bird: where would this be defined? */
    6474//# ifdef DEBUG
     
    7080# define AssertMsg(expr, msg) do{}while (0)
    7181#endif
     82
     83#define NonStandardLog              DoLogging
     84#define NonStandardLogFlow(x)       DoLogging x
     85
     86#define SetErrBreak(strAndArgs) \
     87    if (1) { \
     88        hrc = E_FAIL; \
     89        NonStandardLog strAndArgs; \
     90        bstrError.printfNoThrow strAndArgs; \
     91        break; \
     92    } else do {} while (0)
     93
     94
     95#define VBOXNETCFGWIN_NETADP_ID_SZ  "sun_VBoxNetAdp"
     96#define VBOXNETCFGWIN_NETADP_ID_WSZ RT_CONCAT(L,VBOXNETCFGWIN_NETADP_ID_SZ)
     97#define DRIVERHWID                  VBOXNETCFGWIN_NETADP_ID_WSZ
     98
     99/* We assume the following name matches the device description in vboxnetadp6.inf */
     100#define HOSTONLY_ADAPTER_NAME_SZ    "VirtualBox Host-Only Ethernet Adapter"
     101#define HOSTONLY_ADAPTER_NAME_WSZ   RT_CONCAT(L,HOSTONLY_ADAPTER_NAME_SZ)
     102
     103#define VBOX_CONNECTION_NAME_SZ     "VirtualBox Host-Only Network"
     104#define VBOX_CONNECTION_NAME_WSZ    RT_CONCAT(L,VBOX_CONNECTION_NAME_SZ)
     105
     106#define VBOXNETCFGWIN_NETLWF_ID     L"oracle_VBoxNetLwf"
     107
     108
     109
     110/*********************************************************************************************************************************
     111*   Global Variables                                                                                                             *
     112*********************************************************************************************************************************/
    72113static PFNVBOXNETCFGLOGGER volatile g_pfnLogger = NULL;
    73114
    74 static void DoLogging(const char *pszString, ...);
    75 #define NonStandardLog DoLogging
    76 #define NonStandardLogFlow(x) DoLogging x
    77 
    78 #define DbgLog                              /** @todo r=bird: What does this do? */
    79 
    80 #define VBOX_NETCFG_LOCK_TIME_OUT     5000  /** @todo r=bird: What does this do? */
    81 
    82 #define VBOXNETCFGWIN_NETADP_ID L"sun_VBoxNetAdp"
    83 
    84115/*
    85 * Wrappers for HelpAPI functions
    86 */
     116 * Wrappers for HelpAPI functions
     117 */
    87118typedef void FNINITIALIZEIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
    88119typedef FNINITIALIZEIPINTERFACEENTRY *PFNINITIALIZEIPINTERFACEENTRY;
     
    94125typedef FNSETIPINTERFACEENTRY *PFNSETIPINTERFACEENTRY;
    95126
    96 static  PFNINITIALIZEIPINTERFACEENTRY   g_pfnInitializeIpInterfaceEntry = NULL;
    97 static  PFNGETIPINTERFACEENTRY          g_pfnGetIpInterfaceEntry        = NULL;
    98 static  PFNSETIPINTERFACEENTRY          g_pfnSetIpInterfaceEntry        = NULL;
    99 
     127
     128/*********************************************************************************************************************************
     129*   Internal Functions                                                                                                           *
     130*********************************************************************************************************************************/
     131static PFNINITIALIZEIPINTERFACEENTRY    g_pfnInitializeIpInterfaceEntry = NULL;
     132static PFNGETIPINTERFACEENTRY           g_pfnGetIpInterfaceEntry        = NULL;
     133static PFNSETIPINTERFACEENTRY           g_pfnSetIpInterfaceEntry        = NULL;
     134
     135static void DoLogging(const char *pszString, ...);
    100136
    101137/*
    102 * Forward declaration for using vboxNetCfgWinSetupMetric()
    103 */
    104 HRESULT vboxNetCfgWinSetupMetric(IN NET_LUID* pLuid);
    105 HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID* pLUID);
    106 
    107 
    108 /*
    109  * For some weird reason we do not want to use IPRT here, hence the following
    110  * function provides a replacement for BstrFmt.
     138 * Forward declaration for using vboxNetCfgWinSetupMetric()
    111139 */
    112 static bstr_t bstr_printf(const char *cszFmt, ...)
    113 {
    114     char szBuffer[4096];
    115     szBuffer[sizeof(szBuffer) - 1] = 0; /* Make sure the string will be null-terminated */
    116     va_list va;
    117     va_start(va, cszFmt);
    118     _vsnprintf(szBuffer, sizeof(szBuffer) - 1, cszFmt, va);
    119     va_end(va);
    120     return bstr_t(szBuffer);
    121 }
     140static HRESULT vboxNetCfgWinSetupMetric(IN NET_LUID *pLuid);
     141static HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID *pLUID);
     142
     143
    122144
    123145static HRESULT vboxNetCfgWinINetCfgLock(IN INetCfg *pNetCfg,
     
    127149{
    128150    INetCfgLock *pLock;
    129     HRESULT hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pLock);
     151    HRESULT hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID *)&pLock);
    130152    if (FAILED(hr))
    131153    {
    132         NonStandardLogFlow(("QueryInterface failed, hr (0x%x)\n", hr));
     154        NonStandardLogFlow(("QueryInterface failed: %Rhrc\n", hr));
    133155        return hr;
    134156    }
     
    136158    hr = pLock->AcquireWriteLock(cmsTimeout, pszwClientDescription, ppszwClientDescription);
    137159    if (hr == S_FALSE)
    138     {
    139160        NonStandardLogFlow(("Write lock busy\n"));
    140     }
    141161    else if (FAILED(hr))
    142     {
    143         NonStandardLogFlow(("AcquireWriteLock failed, hr (0x%x)\n", hr));
    144     }
     162        NonStandardLogFlow(("AcquireWriteLock failed: %Rhrc\n", hr));
    145163
    146164    pLock->Release();
     
    151169{
    152170    INetCfgLock *pLock;
    153     HRESULT hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pLock);
     171    HRESULT hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID *)&pLock);
    154172    if (FAILED(hr))
    155173    {
    156         NonStandardLogFlow(("QueryInterface failed, hr (0x%x)\n", hr));
     174        NonStandardLogFlow(("QueryInterface failed: %Rhrc\n", hr));
    157175        return hr;
    158176    }
     
    160178    hr = pLock->ReleaseWriteLock();
    161179    if (FAILED(hr))
    162         NonStandardLogFlow(("ReleaseWriteLock failed, hr (0x%x)\n", hr));
     180        NonStandardLogFlow(("ReleaseWriteLock failed: %Rhrc\n", hr));
    163181
    164182    pLock->Release();
     
    172190                                                      OUT LPWSTR *ppszwClientDescription)
    173191{
    174     INetCfg *pNetCfg;
    175     HRESULT hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (PVOID*)&pNetCfg);
     192    INetCfg *pNetCfg = NULL;
     193    HRESULT hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (PVOID *)&pNetCfg);
    176194    if (FAILED(hr))
    177195    {
    178         NonStandardLogFlow(("CoCreateInstance failed, hr (0x%x)\n", hr));
     196        NonStandardLogFlow(("CoCreateInstance failed: %Rhrc\n", hr));
    179197        return hr;
    180198    }
     
    198216            return S_OK;
    199217        }
    200         else
    201             NonStandardLogFlow(("Initialize failed, hr (0x%x)\n", hr));
     218        NonStandardLogFlow(("Initialize failed: %Rhrc\n", hr));
    202219    }
    203220
     
    217234    if (FAILED(hr))
    218235    {
    219         NonStandardLogFlow(("Uninitialize failed, hr (0x%x)\n", hr));
     236        NonStandardLogFlow(("Uninitialize failed: %Rhrc\n", hr));
    220237        /* Try to release the write lock below. */
    221238    }
     
    225242        HRESULT hr2 = vboxNetCfgWinINetCfgUnlock(pNetCfg);
    226243        if (FAILED(hr2))
    227             NonStandardLogFlow(("vboxNetCfgWinINetCfgUnlock failed, hr (0x%x)\n", hr2));
     244            NonStandardLogFlow(("vboxNetCfgWinINetCfgUnlock failed: %Rhrc\n", hr2));
    228245        if (SUCCEEDED(hr))
    229246            hr = hr2;
     
    241258    if (FAILED(hr))
    242259    {
    243         NonStandardLogFlow(("Reset failed, hr (0x%x)\n", hr));
     260        NonStandardLogFlow(("Reset failed: %Rhrc\n", hr));
    244261        return hr;
    245262    }
    246263
    247     INetCfgComponent *pNcc;
     264    INetCfgComponent *pNcc = NULL;
    248265    while ((hr = pEnumNcc->Next(1, &pNcc, NULL)) == S_OK)
    249266    {
    250         ULONG uComponentStatus;
     267        ULONG uComponentStatus = 0;
    251268        hr = pNcc->GetDeviceStatus(&uComponentStatus);
    252269        if (SUCCEEDED(hr))
     
    267284                }
    268285                else
    269                     NonStandardLogFlow(("GetInstanceGuid failed, hr (0x%x)\n", hr));
     286                    NonStandardLogFlow(("GetInstanceGuid failed: %Rhrc\n", hr));
    270287            }
    271288        }
     
    281298                                                            OUT INetCfgComponent **ppncc)
    282299{
    283     IEnumNetCfgComponent *pEnumNcc;
     300    IEnumNetCfgComponent *pEnumNcc = NULL;
    284301    HRESULT hr = pNc->EnumComponents(pguidClass, &pEnumNcc);
    285 
    286302    if (SUCCEEDED(hr))
    287303    {
    288304        hr = vboxNetCfgWinGetComponentByGuidEnum(pEnumNcc, pComponentGuid, ppncc);
    289305        if (hr == S_FALSE)
    290         {
    291306            NonStandardLogFlow(("Component not found\n"));
    292         }
    293307        else if (FAILED(hr))
    294         {
    295             NonStandardLogFlow(("vboxNetCfgWinGetComponentByGuidEnum failed, hr (0x%x)\n", hr));
    296         }
     308            NonStandardLogFlow(("vboxNetCfgWinGetComponentByGuidEnum failed: %Rhrc\n", hr));
    297309        pEnumNcc->Release();
    298310    }
    299311    else
    300         NonStandardLogFlow(("EnumComponents failed, hr (0x%x)\n", hr));
     312        NonStandardLogFlow(("EnumComponents failed: %Rhrc\n", hr));
    301313    return hr;
    302314}
     
    304316static HRESULT vboxNetCfgWinQueryInstaller(IN INetCfg *pNetCfg, IN const GUID *pguidClass, INetCfgClassSetup **ppSetup)
    305317{
    306     HRESULT hr = pNetCfg->QueryNetCfgClass(pguidClass, IID_INetCfgClassSetup, (void**)ppSetup);
     318    HRESULT hr = pNetCfg->QueryNetCfgClass(pguidClass, IID_INetCfgClassSetup, (void **)ppSetup);
    307319    if (FAILED(hr))
    308         NonStandardLogFlow(("QueryNetCfgClass failed, hr (0x%x)\n", hr));
    309     return hr;
    310 }
    311 
    312 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinInstallComponent(IN INetCfg *pNetCfg, IN LPCWSTR pszwComponentId, IN const GUID *pguidClass,
    313                                                           OUT INetCfgComponent **ppComponent)
     320        NonStandardLogFlow(("QueryNetCfgClass failed: %Rhrc\n", hr));
     321    return hr;
     322}
     323
     324VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinInstallComponent(IN INetCfg *pNetCfg, IN LPCWSTR pszwComponentId,
     325                                                          IN const GUID *pguidClass, OUT INetCfgComponent **ppComponent)
    314326{
    315327    INetCfgClassSetup *pSetup;
     
    317329    if (FAILED(hr))
    318330    {
    319         NonStandardLogFlow(("vboxNetCfgWinQueryInstaller failed, hr (0x%x)\n", hr));
     331        NonStandardLogFlow(("vboxNetCfgWinQueryInstaller failed: %Rhrc\n", hr));
    320332        return hr;
    321333    }
    322334
    323335    OBO_TOKEN Token;
    324     ZeroMemory(&Token, sizeof (Token));
     336    RT_ZERO(Token);
    325337    Token.Type = OBO_USER;
    326     INetCfgComponent* pTempComponent = NULL;
    327 
     338
     339    INetCfgComponent *pTempComponent = NULL;
    328340    hr = pSetup->Install(pszwComponentId, &Token,
    329341                         0,    /* IN DWORD dwSetupFlags */
     
    336348        if (pTempComponent != NULL)
    337349        {
    338             HKEY hkey = (HKEY)INVALID_HANDLE_VALUE;
    339             HRESULT res;
    340 
    341350            /*
    342             *   Set default metric value of interface to fix multicast issue
    343             *   See @bugref{6379} for details.
    344             */
    345             res = pTempComponent->OpenParamKey(&hkey);
     351             *   Set default metric value of interface to fix multicast issue
     352             *   See @bugref{6379} for details.
     353             */
     354            HKEY    hKey = (HKEY)INVALID_HANDLE_VALUE;
     355            HRESULT hrc2 = pTempComponent->OpenParamKey(&hKey);
    346356
    347357            /* Set default metric value for host-only interface only */
    348             if (   SUCCEEDED(res)
    349                 && hkey != INVALID_HANDLE_VALUE
    350                 && wcsnicmp(pszwComponentId, VBOXNETCFGWIN_NETADP_ID, 256) == 0)
     358            if (   SUCCEEDED(hrc2)
     359                && hKey != (HKEY)INVALID_HANDLE_VALUE
     360                /* Original was weird: && wcsnicmp(pszwComponentId, VBOXNETCFGWIN_NETADP_ID_WSZ, 256) == 0) */
     361                && RTUtf16ICmpAscii(pszwComponentId, VBOXNETCFGWIN_NETADP_ID_SZ) == 0)
    351362            {
    352363                NET_LUID luid;
    353                 res = vboxNetCfgWinGetInterfaceLUID(hkey, &luid);
     364                hrc2 = vboxNetCfgWinGetInterfaceLUID(hKey, &luid);
    354365
    355366                /* Close the key as soon as possible. See @bugref{7973}. */
    356                 RegCloseKey (hkey);
    357                 hkey = (HKEY)INVALID_HANDLE_VALUE;
    358 
    359                 if (FAILED(res))
     367                RegCloseKey(hKey);
     368                hKey = (HKEY)INVALID_HANDLE_VALUE;
     369
     370                if (FAILED(hrc2))
    360371                {
    361372                    /*
     
    363374                     *   So we will not break installation process due to this error.
    364375                     */
    365                     NonStandardLogFlow(("VBoxNetCfgWinInstallComponent Warning! "
    366                                         "vboxNetCfgWinGetInterfaceLUID failed, default metric "
    367                                         "for new interface will not be set, hr (0x%x)\n", res));
     376                    NonStandardLogFlow(("VBoxNetCfgWinInstallComponent Warning! vboxNetCfgWinGetInterfaceLUID failed, default metric for new interface will not be set: %Rhrc\n", hrc2));
    368377                }
    369378                else
    370379                {
    371                     res = vboxNetCfgWinSetupMetric(&luid);
    372                     if (FAILED(res))
     380                    hrc2 = vboxNetCfgWinSetupMetric(&luid);
     381                    if (FAILED(hrc2))
    373382                    {
    374383                        /*
     
    376385                         *   So we will not break installation process due to this error.
    377386                         */
    378                         NonStandardLogFlow(("VBoxNetCfgWinInstallComponent Warning! "
    379                                             "vboxNetCfgWinSetupMetric failed, default metric "
    380                                             "for new interface will not be set, hr (0x%x)\n", res));
     387                        NonStandardLogFlow(("VBoxNetCfgWinInstallComponent Warning! vboxNetCfgWinSetupMetric failed, default metric for new interface will not be set: %Rhrc\n", hrc2));
    381388                    }
    382389                }
    383390            }
    384             if (hkey != INVALID_HANDLE_VALUE)
    385             {
    386                 RegCloseKey (hkey);
    387                 hkey = (HKEY)INVALID_HANDLE_VALUE;
    388             }
     391            if (hKey != (HKEY)INVALID_HANDLE_VALUE)
     392                RegCloseKey(hKey);
    389393            if (ppComponent != NULL)
    390394                *ppComponent = pTempComponent;
     
    394398
    395399        /* ignore the apply failure */
    396         HRESULT tmpHr = pNetCfg->Apply();
    397         Assert(tmpHr == S_OK);
    398         if (tmpHr != S_OK)
    399             NonStandardLogFlow(("Apply failed, hr (0x%x)\n", tmpHr));
     400        HRESULT hrc3 = pNetCfg->Apply();
     401        Assert(hrc3 == S_OK);
     402        if (hrc3 != S_OK)
     403            NonStandardLogFlow(("Apply failed: %Rhrc\n", hrc3));
    400404    }
    401405    else
    402         NonStandardLogFlow(("Install failed, hr (0x%x)\n", hr));
     406        NonStandardLogFlow(("Install failed: %Rhrc\n", hr));
    403407
    404408    pSetup->Release();
     
    407411
    408412static HRESULT vboxNetCfgWinInstallInfAndComponent(IN INetCfg *pNetCfg, IN LPCWSTR pszwComponentId, IN const GUID *pguidClass,
    409                                                    IN LPCWSTR const *apInfPaths, IN UINT cInfPaths,
     413                                                   IN LPCWSTR const *apwszInfPaths, IN UINT cInfPaths,
    410414                                                   OUT INetCfgComponent **ppComponent)
    411415{
    412     HRESULT hr = S_OK;
    413     UINT cFilesProcessed = 0;
    414 
    415416    NonStandardLogFlow(("Installing %u INF files ...\n", cInfPaths));
    416417
     418    HRESULT hr              = S_OK;
     419    UINT    cFilesProcessed = 0;
    417420    for (; cFilesProcessed < cInfPaths; cFilesProcessed++)
    418421    {
    419         NonStandardLogFlow(("Installing INF file \"%ws\" ...\n", apInfPaths[cFilesProcessed]));
    420         hr = VBoxDrvCfgInfInstall(apInfPaths[cFilesProcessed]);
     422        NonStandardLogFlow(("Installing INF file \"%ls\" ...\n", apwszInfPaths[cFilesProcessed]));
     423        hr = VBoxDrvCfgInfInstall(apwszInfPaths[cFilesProcessed]);
    421424        if (FAILED(hr))
    422425        {
    423             NonStandardLogFlow(("VBoxNetCfgWinInfInstall failed, hr (0x%x)\n", hr));
     426            NonStandardLogFlow(("VBoxNetCfgWinInfInstall failed: %Rhrc\n", hr));
    424427            break;
    425428        }
     
    430433        hr = VBoxNetCfgWinInstallComponent(pNetCfg, pszwComponentId, pguidClass, ppComponent);
    431434        if (FAILED(hr))
    432             NonStandardLogFlow(("VBoxNetCfgWinInstallComponent failed, hr (0x%x)\n", hr));
     435            NonStandardLogFlow(("VBoxNetCfgWinInstallComponent failed: %Rhrc\n", hr));
    433436    }
    434437
     
    439442        do
    440443        {
    441             HRESULT hr2 = VBoxDrvCfgInfUninstall(apInfPaths[cFilesProcessed], 0);
     444            HRESULT hr2 = VBoxDrvCfgInfUninstall(apwszInfPaths[cFilesProcessed], 0);
    442445            if (FAILED(hr2))
    443                 NonStandardLogFlow(("VBoxDrvCfgInfUninstall failed, hr (0x%x)\n", hr2));
     446                NonStandardLogFlow(("VBoxDrvCfgInfUninstall failed: %Rhrc\n", hr2));
    444447                /* Keep going. */
    445448            if (!cFilesProcessed)
     
    459462    if (FAILED(hr))
    460463    {
    461         NonStandardLogFlow(("GetClassGuid failed, hr (0x%x)\n", hr));
     464        NonStandardLogFlow(("GetClassGuid failed: %Rhrc\n", hr));
    462465        return hr;
    463466    }
     
    467470    if (FAILED(hr))
    468471    {
    469         NonStandardLogFlow(("vboxNetCfgWinQueryInstaller failed, hr (0x%x)\n", hr));
     472        NonStandardLogFlow(("vboxNetCfgWinQueryInstaller failed: %Rhrc\n", hr));
    470473        return hr;
    471474    }
    472475
    473476    OBO_TOKEN Token;
    474     ZeroMemory(&Token, sizeof(Token));
     477    RT_ZERO(Token);
    475478    Token.Type = OBO_USER;
    476479
     
    480483        hr = pNetCfg->Apply();
    481484        if (FAILED(hr))
    482             NonStandardLogFlow(("Apply failed, hr (0x%x)\n", hr));
     485            NonStandardLogFlow(("Apply failed: %Rhrc\n", hr));
    483486    }
    484487    else
    485         NonStandardLogFlow(("DeInstall failed, hr (0x%x)\n", hr));
     488        NonStandardLogFlow(("DeInstall failed: %Rhrc\n", hr));
    486489
    487490    if (pSetup)
     
    490493}
    491494
    492 typedef BOOL (*VBOXNETCFGWIN_NETCFGENUM_CALLBACK) (IN INetCfg *pNetCfg, IN INetCfgComponent *pNetCfgComponent, PVOID pContext);
     495typedef BOOL (*PFN_VBOXNETCFGWIN_NETCFGENUM_CALLBACK_T)(IN INetCfg *pNetCfg, IN INetCfgComponent *pNetCfgComponent,
     496                                                        PVOID pvContext);
    493497
    494498static HRESULT vboxNetCfgWinEnumNetCfgComponents(IN INetCfg *pNetCfg,
    495499                                                 IN const GUID *pguidClass,
    496                                                  VBOXNETCFGWIN_NETCFGENUM_CALLBACK callback,
     500                                                 PFN_VBOXNETCFGWIN_NETCFGENUM_CALLBACK_T pfnCallback,
    497501                                                 PVOID pContext)
    498502{
    499     IEnumNetCfgComponent *pEnumComponent;
     503    IEnumNetCfgComponent *pEnumComponent = NULL;
    500504    HRESULT hr = pNetCfg->EnumComponents(pguidClass, &pEnumComponent);
    501505    if (SUCCEEDED(hr))
     
    503507        INetCfgComponent *pNetCfgComponent;
    504508        hr = pEnumComponent->Reset();
    505         do
     509        for (;;)
    506510        {
    507511            hr = pEnumComponent->Next(1, &pNetCfgComponent, NULL);
     
    514518                if (pNetCfgComponent)
    515519                {
    516                     if (pContext)
    517                         fResult = callback(pNetCfg, pNetCfgComponent, pContext);
     520                    fResult = pfnCallback(pNetCfg, pNetCfgComponent, pContext);
    518521                    pNetCfgComponent->Release();
    519522                }
     
    525528            {
    526529                if (hr == S_FALSE)
    527                 {
    528                     hr = S_OK;
    529                 }
     530                    hr = S_OK; /* no more components */
    530531                else
    531                     NonStandardLogFlow(("Next failed, hr (0x%x)\n", hr));
     532                    NonStandardLogFlow(("Next failed: %Rhrc\n", hr));
    532533                break;
    533534            }
    534         } while (true);
     535        }
    535536        pEnumComponent->Release();
    536537    }
     
    538539}
    539540
    540 /*
    541  * Forward declarations of functions used in vboxNetCfgWinRemoveAllNetDevicesOfIdCallback.
    542  */
    543 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostonlyConnectionName(PCWSTR DevName, WCHAR *pBuf, PULONG pcbBuf);
    544 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameConnection(LPWSTR pGuid, PCWSTR NewName);
    545 
     541/** PFNVBOXNETCFGWINNETENUMCALLBACK */
    546542static BOOL vboxNetCfgWinRemoveAllNetDevicesOfIdCallback(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pvContext)
    547543{
    548544    RT_NOREF1(pvContext);
     545
    549546    SP_REMOVEDEVICE_PARAMS rmdParams;
    550     memset(&rmdParams, 0, sizeof(SP_REMOVEDEVICE_PARAMS));
     547    RT_ZERO(rmdParams);
    551548    rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    552549    rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE;
     
    567564                                             KEY_READ);
    568565            if (hKey == INVALID_HANDLE_VALUE)
    569             {
    570                 NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiOpenDevRegKey failed with error %ld\n",
     566                NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiOpenDevRegKey failed with error %u\n",
    571567                                    GetLastError()));
    572             }
    573568            else
    574569            {
    575570                WCHAR wszCfgGuidString[50] = { L'' };
    576                 DWORD cbSize = sizeof(wszCfgGuidString);
    577                 DWORD dwValueType;
    578                 DWORD ret = RegQueryValueExW(hKey, L"NetCfgInstanceId", NULL,
    579                                              &dwValueType, (LPBYTE)wszCfgGuidString, &cbSize);
    580                 if (ret == ERROR_SUCCESS)
    581                 {
    582                     NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Processing device ID \"%S\"\n",
    583                                         wszCfgGuidString));
    584 
    585                     /* Figure out device name. */
    586                     WCHAR wszDevName[256], wszTempName[256];
    587                     ULONG cbName = sizeof(wszTempName);
    588 
    589                     if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, pDev,
    590                                                           SPDRP_FRIENDLYNAME, /* IN  DWORD Property,*/
    591                                                           NULL,               /* OUT PDWORD PropertyRegDataType, OPTIONAL*/
    592                                                           (PBYTE)wszDevName,  /* OUT PBYTE PropertyBuffer,*/
    593                                                           sizeof(wszDevName), /* IN  DWORD PropertyBufferSize,*/
    594                                                           NULL                /* OUT PDWORD RequiredSize OPTIONAL*/))
     571                DWORD cbSize = sizeof(wszCfgGuidString) - sizeof(WCHAR); /* make sure we get a terminated string back */
     572                DWORD dwValueType = 0;
     573                LSTATUS lrc = RegQueryValueExW(hKey, L"NetCfgInstanceId", NULL, &dwValueType, (LPBYTE)wszCfgGuidString, &cbSize);
     574                if (lrc == ERROR_SUCCESS)
     575                {
     576                    /** @todo r=bird: original didn't check the type here, just assumed it was a
     577                     * valid zero terminated string. (zero term handled by -sizeof(WHCAR) above now). */
     578                    if (dwValueType == REG_SZ || dwValueType == REG_EXPAND_SZ || dwValueType == REG_EXPAND_SZ)
    595579                    {
    596                         /*
    597                          * Rename the connection before removing the device. This will
    598                          * hopefully prevent an error when we will be attempting
    599                          * to rename a newly created connection (see @bugref{6740}).
    600                          */
    601                         HRESULT hr = VBoxNetCfgWinGenHostonlyConnectionName(wszDevName, wszTempName, &cbName);
    602                         wcscat_s(wszTempName, sizeof(wszTempName), L" removed");
    603                         if (SUCCEEDED(hr))
    604                             hr = VBoxNetCfgWinRenameConnection(wszCfgGuidString, wszTempName);
    605                         //NonStandardLogFlow(("VBoxNetCfgWinRenameConnection(%S,%S) => 0x%x\n", pWCfgGuidString, TempName, hr_tmp));
     580                        NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Processing device ID \"%ls\"\n",
     581                                            wszCfgGuidString));
     582
     583                        /* Figure out device name. */
     584                        WCHAR wszDevName[256 + 1] = {0};
     585                        if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, pDev, SPDRP_FRIENDLYNAME, NULL, (PBYTE)wszDevName,
     586                                                              sizeof(wszDevName) - sizeof(WCHAR) /* yes, in bytes */, NULL))
     587                        {
     588                            /*
     589                             * Rename the connection before removing the device. This will
     590                             * hopefully prevent an error when we will be attempting
     591                             * to rename a newly created connection (see @bugref{6740}).
     592                             */
     593                            WCHAR wszNewName[RT_ELEMENTS(wszDevName) + 128 /* ensure sufficient buffer */];
     594                            HRESULT hr = VBoxNetCfgWinGenHostonlyConnectionName(wszDevName, wszNewName,
     595                                                                                RT_ELEMENTS(wszNewName) - 10 /*removed++*/,
     596                                                                                NULL);
     597                            RTUtf16CatAscii(wszNewName, sizeof(wszNewName), " removed");
     598                            if (SUCCEEDED(hr))
     599                                hr = VBoxNetCfgWinRenameConnection(wszCfgGuidString, wszNewName);
     600                            //NonStandardLogFlow(("VBoxNetCfgWinRenameConnection(%S,%S) => 0x%x\n", wszCfgGuidString, TempName, hr_tmp));
     601                        }
     602                        else
     603                            NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Failed to get friendly name for device \"%ls\"\n",
     604                                                wszCfgGuidString));
    606605                    }
    607606                    else
    608                     {
    609                         NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Failed to get friendly name for device \"%S\"\n",
    610                                             wszCfgGuidString));
    611                     }
     607                        NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Friendly name for \"%S\" isn't a string: %d\n",
     608                                            wszCfgGuidString, dwValueType
    612609                }
    613610                else
    614                 {
    615                     NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Querying instance ID failed with %d\n",
    616                                         ret));
    617                 }
     611                    NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Querying instance ID failed with %u (%#x)\n",
     612                                        lrc, lrc));
    618613
    619614                RegCloseKey(hKey);
     
    623618            if (SetupDiCallClassInstaller(DIF_REMOVE, hDevInfo, pDev))
    624619            {
    625                 SP_DEVINSTALL_PARAMS devParams;
    626                 memset(&devParams, 0, sizeof(SP_DEVINSTALL_PARAMS));
    627                 devParams.cbSize = sizeof(devParams);
    628 
    629                 if (SetupDiGetDeviceInstallParams(hDevInfo, pDev, &devParams))
    630                 {
    631                     if (   (devParams.Flags & DI_NEEDRESTART)
    632                         || (devParams.Flags & DI_NEEDREBOOT))
    633                     {
     620                SP_DEVINSTALL_PARAMS_W DevParams = { sizeof(DevParams) };
     621                if (SetupDiGetDeviceInstallParams(hDevInfo, pDev, &DevParams))
     622                {
     623                    if (   (DevParams.Flags & DI_NEEDRESTART)
     624                        || (DevParams.Flags & DI_NEEDREBOOT))
    634625                        NonStandardLog(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: A reboot is required\n"));
    635                     }
    636626                }
    637627                else
    638                     NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiGetDeviceInstallParams failed with %ld\n",
     628                    NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiGetDeviceInstallParams failed with %u\n",
    639629                                        GetLastError()));
    640630            }
    641631            else
    642                 NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiCallClassInstaller failed with %ld\n",
     632                NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiCallClassInstaller failed with %u\n",
    643633                                    GetLastError()));
    644634        }
    645635        else
    646             NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiSetSelectedDevice failed with %ld\n",
     636            NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiSetSelectedDevice failed with %u\n",
    647637                                GetLastError()));
    648638    }
    649639    else
    650         NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiSetClassInstallParams failed with %ld\n",
     640        NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiSetClassInstallParams failed with %u\n",
    651641                            GetLastError()));
    652642
     
    657647typedef struct VBOXNECTFGWINPROPCHANGE
    658648{
    659     VBOXNECTFGWINPROPCHANGE_TYPE enmPcType;
     649    VBOXNECTFGWINPROPCHANGE_TYPE_T enmPcType;
    660650    HRESULT hr;
    661 } VBOXNECTFGWINPROPCHANGE ,*PVBOXNECTFGWINPROPCHANGE;
     651} VBOXNECTFGWINPROPCHANGE, *PVBOXNECTFGWINPROPCHANGE;
    662652
    663653static BOOL vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext)
     
    666656
    667657    SP_PROPCHANGE_PARAMS PcParams;
    668     memset (&PcParams, 0, sizeof (PcParams));
     658    RT_ZERO(PcParams);
    669659    PcParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    670660    PcParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    671661    PcParams.Scope = DICS_FLAG_GLOBAL;
    672662
    673     switch(pPc->enmPcType)
     663    switch (pPc->enmPcType)
    674664    {
    675665        case VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE:
     
    687677    }
    688678
    689     if (SetupDiSetClassInstallParams(hDevInfo, pDev, &PcParams.ClassInstallHeader, sizeof(PcParams)))
     679    if (SetupDiSetClassInstallParamsW(hDevInfo, pDev, &PcParams.ClassInstallHeader, sizeof(PcParams)))
    690680    {
    691681        if (SetupDiSetSelectedDevice(hDevInfo, pDev))
     
    693683            if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, pDev))
    694684            {
    695                 SP_DEVINSTALL_PARAMS devParams;
    696                 devParams.cbSize = sizeof(devParams);
    697                 if (SetupDiGetDeviceInstallParams(hDevInfo,pDev,&devParams))
    698                 {
    699                     if (   (devParams.Flags & DI_NEEDRESTART)
    700                         || (devParams.Flags & DI_NEEDREBOOT))
    701                     {
     685                SP_DEVINSTALL_PARAMS_W DevParams = { sizeof(DevParams) };
     686                if (SetupDiGetDeviceInstallParamsW(hDevInfo, pDev, &DevParams))
     687                {
     688                    if (   (DevParams.Flags & DI_NEEDRESTART)
     689                        || (DevParams.Flags & DI_NEEDREBOOT))
    702690                        NonStandardLog(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: A reboot is required\n"));
    703                     }
    704691                }
    705692                else
    706                     NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: SetupDiGetDeviceInstallParams failed with %ld\n",
     693                    NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: SetupDiGetDeviceInstallParams failed with %u\n",
    707694                                        GetLastError()));
    708695            }
    709696            else
    710                 NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: SetupDiCallClassInstaller failed with %ld\n",
     697                NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: SetupDiCallClassInstaller failed with %u\n",
    711698                                    GetLastError()));
    712699        }
    713700        else
    714             NonStandardLogFlow(("SetupDiSetSelectedDevice failed with %ld\n", GetLastError()));
     701            NonStandardLogFlow(("SetupDiSetSelectedDevice failed with %u\n", GetLastError()));
    715702    }
    716703    else
    717         NonStandardLogFlow(("SetupDiSetClassInstallParams failed with %ld\n", GetLastError()));
     704        NonStandardLogFlow(("SetupDiSetClassInstallParams failed with %u\n", GetLastError()));
    718705
    719706    /* Continue enumeration. */
     
    722709
    723710typedef BOOL (*PFNVBOXNETCFGWINNETENUMCALLBACK)(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext);
    724 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinEnumNetDevices(LPCWSTR pwszPnPId,
    725                                                         PFNVBOXNETCFGWINNETENUMCALLBACK pfnCallback, PVOID pvContext)
    726 {
    727     NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Searching for: %S\n", pwszPnPId));
     711
     712static HRESULT vboxNetCfgWinEnumNetDevices(LPCWSTR pwszPnPId, PFNVBOXNETCFGWINNETENUMCALLBACK pfnCallback, PVOID pvContext)
     713{
     714    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Searching for: %ls\n", pwszPnPId));
    728715
    729716    HRESULT hr;
     
    737724    if (hDevInfo != INVALID_HANDLE_VALUE)
    738725    {
    739         DWORD winEr = NO_ERROR;
    740 
    741         DWORD dwDevId = 0;
    742         size_t cPnPId = wcslen(pwszPnPId);
    743 
    744         PBYTE pBuffer = NULL;
    745 
     726        size_t const cwcPnPId = RTUtf16Len(pwszPnPId);
     727        DWORD        winEr    = NO_ERROR;
     728        DWORD        dwDevId  = 0;
     729        DWORD        cbBuffer = 0;
     730        PBYTE        pbBuffer = NULL;
    746731        for (;;)
    747732        {
     
    754739                winEr = GetLastError();
    755740                if (winEr == ERROR_NO_MORE_ITEMS)
    756                     winEr = ERROR_SUCCESS;
     741                    winEr = NO_ERROR;
    757742                break;
    758743            }
    759744
    760             NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Enumerating device %ld ... \n", dwDevId));
     745            NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Enumerating device %u ... \n", dwDevId));
    761746            dwDevId++;
    762747
    763             if (pBuffer)
    764                 free(pBuffer);
    765             pBuffer = NULL;
    766             DWORD cbBuffer = 0;
    767748            DWORD cbRequired = 0;
    768 
     749            SetLastError(0);
    769750            if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo, &Dev,
    770751                                                   SPDRP_HARDWAREID, /* IN DWORD Property */
    771752                                                   NULL,             /* OUT PDWORD PropertyRegDataType OPTIONAL */
    772                                                    pBuffer,          /* OUT PBYTE PropertyBuffer */
     753                                                   pbBuffer,         /* OUT PBYTE PropertyBuffer */
    773754                                                   cbBuffer,         /* IN DWORD PropertyBufferSize */
    774755                                                   &cbRequired       /* OUT PDWORD RequiredSize OPTIONAL */))
     
    777758                if (winEr != ERROR_INSUFFICIENT_BUFFER)
    778759                {
    779                     NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (1) failed with %ld\n", winEr));
     760                    if (winEr == ERROR_INVALID_DATA)
     761                    {
     762                        NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (1) failed with ERROR_INVALID_DATA - ignoring, skipping to next device\n"));
     763                        continue;
     764                    }
     765                    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (1) failed with %u\n", winEr));
    780766                    break;
    781767                }
    782 
    783                 pBuffer = (PBYTE)malloc(cbRequired);
    784                 if (!pBuffer)
    785                 {
    786                     NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Out of memory allocating %ld bytes\n",
    787                                         cbRequired));
     768                winEr = NO_ERROR;
     769
     770                cbBuffer = RT_ALIGN_32(cbRequired, 64);
     771                void *pvNew = RTMemRealloc(pbBuffer, cbBuffer);
     772                if (pvNew)
     773                    pbBuffer = (PBYTE)pvNew;
     774                else
     775                {
     776                    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Out of memory allocating %u bytes\n", cbBuffer));
    788777                    winEr = ERROR_OUTOFMEMORY;
    789778                    break;
    790779                }
    791780
    792                 cbBuffer = cbRequired;
    793 
    794                 if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo,&Dev,
     781                if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo, &Dev,
    795782                                                       SPDRP_HARDWAREID, /* IN DWORD Property */
    796783                                                       NULL,             /* OUT PDWORD PropertyRegDataType, OPTIONAL */
    797                                                        pBuffer,          /* OUT PBYTE PropertyBuffer */
     784                                                       pbBuffer,         /* OUT PBYTE PropertyBuffer */
    798785                                                       cbBuffer,         /* IN DWORD PropertyBufferSize */
    799786                                                       &cbRequired       /* OUT PDWORD RequiredSize OPTIONAL */))
    800787                {
    801788                    winEr = GetLastError();
    802                     NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (2) failed with %ld\n",
     789                    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (2) failed with %u\n",
    803790                                        winEr));
    804791                    break;
     
    806793            }
    807794
    808             PWSTR pCurId = (PWSTR)pBuffer;
    809             size_t cCurId = wcslen(pCurId);
    810 
    811             NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Device %ld: %S\n", dwDevId, pCurId));
    812 
    813             if (cCurId >= cPnPId)
    814             {
    815                 NonStandardLogFlow(("!wcsnicmp(pCurId = (%S), pwszPnPId = (%S), cPnPId = (%d))\n", pCurId, pwszPnPId, cPnPId));
    816 
    817                 pCurId += cCurId - cPnPId;
    818                 if (!wcsnicmp(pCurId, pwszPnPId, cPnPId))
     795            PWSTR  pwszCurId = (PWSTR)pbBuffer;
     796            size_t cwcCurId  = RTUtf16Len(pwszCurId);
     797
     798            NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Device %u: %ls\n", dwDevId, pwszCurId));
     799
     800            if (cwcCurId >= cwcPnPId)
     801            {
     802                NonStandardLogFlow(("!RTUtf16NICmp(pwszCurId = (%ls), pwszPnPId = (%ls), cwcPnPId = (%d))\n", pwszCurId, pwszPnPId, cwcPnPId));
     803
     804                pwszCurId += cwcCurId - cwcPnPId;
     805                if (!RTUtf16NICmp(pwszCurId, pwszPnPId, cwcPnPId))
    819806                {
    820807                    if (!pfnCallback(hDevInfo, &Dev, pvContext))
     
    824811        }
    825812
    826         NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Found %ld devices total\n", dwDevId));
    827 
    828         if (pBuffer)
    829             free(pBuffer);
     813        NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Found %u devices total\n", dwDevId));
     814
     815        if (pbBuffer)
     816            RTMemFree(pbBuffer);
    830817
    831818        hr = HRESULT_FROM_WIN32(winEr);
     
    836823    {
    837824        DWORD winEr = GetLastError();
    838         NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetClassDevsExW failed with %ld\n", winEr));
     825        NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetClassDevsExW failed with %u\n", winEr));
    839826        hr = HRESULT_FROM_WIN32(winEr);
    840827    }
     
    844831}
    845832
    846 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveAllNetDevicesOfId(IN LPCWSTR lpszPnPId)
    847 {
    848     return VBoxNetCfgWinEnumNetDevices(lpszPnPId, vboxNetCfgWinRemoveAllNetDevicesOfIdCallback, NULL);
    849 }
    850 
    851 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinPropChangeAllNetDevicesOfId(IN LPCWSTR lpszPnPId, VBOXNECTFGWINPROPCHANGE_TYPE enmPcType)
     833VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveAllNetDevicesOfId(IN LPCWSTR pwszPnPId)
     834{
     835    return vboxNetCfgWinEnumNetDevices(pwszPnPId, vboxNetCfgWinRemoveAllNetDevicesOfIdCallback, NULL);
     836}
     837
     838VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinPropChangeAllNetDevicesOfId(IN LPCWSTR pwszPnPId, VBOXNECTFGWINPROPCHANGE_TYPE_T enmPcType)
    852839{
    853840    VBOXNECTFGWINPROPCHANGE Pc;
    854841    Pc.enmPcType = enmPcType;
    855842    Pc.hr = S_OK;
    856     NonStandardLogFlow(("Calling VBoxNetCfgWinEnumNetDevices with lpszPnPId =(%S) and vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback\n", lpszPnPId));
    857 
    858     HRESULT hr = VBoxNetCfgWinEnumNetDevices(lpszPnPId, vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback, &Pc);
     843    NonStandardLogFlow(("Calling VBoxNetCfgWinEnumNetDevices with pwszPnPId (= %ls) and vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback\n", pwszPnPId));
     844
     845    HRESULT hr = vboxNetCfgWinEnumNetDevices(pwszPnPId, vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback, &Pc);
    859846    if (!SUCCEEDED(hr))
    860847    {
     
    872859}
    873860
    874 /*
    875  * logging
    876  */
     861
     862
     863/*********************************************************************************************************************************
     864*   Logging                                                                                                                      *
     865*********************************************************************************************************************************/
     866
    877867static void DoLogging(const char *pszString, ...)
    878868{
     
    880870    if (pfnLogger)
    881871    {
    882         char szBuffer[4096] = {0};
     872        char szBuffer[4096];
    883873        va_list va;
    884874        va_start(va, pszString);
    885         _vsnprintf(szBuffer, RT_ELEMENTS(szBuffer), pszString, va);
     875        RTStrPrintfV(szBuffer, RT_ELEMENTS(szBuffer), pszString, va);
    886876        va_end(va);
    887877
     
    895885}
    896886
    897 /*
    898  * IP configuration API
    899  */
     887
     888
     889/*********************************************************************************************************************************
     890*   IP configuration API                                                                                                         *
     891*********************************************************************************************************************************/
    900892/* network settings config */
     893#if 1 /** @todo r=bird: Can't we replace this with VBox/com/ptr.h? */
    901894/**
    902895 *  Strong referencing operators. Used as a second argument to ComPtr<>/ComObjPtr<>.
    903896 */
    904 template <class C>
     897template<class C>
    905898class ComStrongRef
    906899{
    907900protected:
    908901
    909     static void addref (C *p) { p->AddRef(); }
    910     static void release (C *p) { p->Release(); }
     902    static void addref(C *p) { p->AddRef(); }
     903    static void release(C *p) { p->Release(); }
    911904};
    912905
     
    915908 *  Base template for smart COM pointers. Not intended to be used directly.
    916909 */
    917 template <class C, template <class> class RefOps = ComStrongRef>
    918 class ComPtrBase : protected RefOps <C>
     910template<class C, template<class> class RefOps = ComStrongRef>
     911class ComPtrBase : protected RefOps<C>
    919912{
    920913public:
    921914
    922915    /* special template to disable AddRef()/Release() */
    923     template <class I>
     916    template<class I>
    924917    class NoAddRefRelease : public I
    925918    {
     
    938931protected:
    939932
    940     ComPtrBase () : p (NULL) {}
    941     ComPtrBase (const ComPtrBase &that) : p (that.p) { addref(); }
    942     ComPtrBase (C *that_p) : p (that_p) { addref(); }
     933    ComPtrBase() : p(NULL) {}
     934    ComPtrBase(const ComPtrBase &that) : p(that.p) { addref(); }
     935    ComPtrBase(C *that_p) : p(that_p)              { addref(); }
    943936
    944937    ~ComPtrBase() { release(); }
    945938
    946     ComPtrBase &operator= (const ComPtrBase &that)
    947     {
    948         safe_assign (that.p);
     939    ComPtrBase &operator=(const ComPtrBase &that)
     940    {
     941        safe_assign(that.p);
    949942        return *this;
    950943    }
    951944
    952     ComPtrBase &operator= (C *that_p)
    953     {
    954         safe_assign (that_p);
     945    ComPtrBase &operator=(C *that_p)
     946    {
     947        safe_assign(that_p);
    955948        return *this;
    956949    }
     
    969962    }
    970963
    971     bool operator! () const { return isNull(); }
    972 
    973     bool operator< (C* that_p) const { return p < that_p; }
    974     bool operator== (C* that_p) const { return p == that_p; }
    975 
    976     template <class I>
    977     bool equalsTo (I *aThat) const
    978     {
    979         return ComPtrEquals (p, aThat);
    980     }
    981 
    982     template <class OC>
    983     bool equalsTo (const ComPtrBase <OC> &oc) const
    984     {
    985         return equalsTo ((OC *) oc);
     964    bool operator!() const              { return isNull(); }
     965
     966    bool operator<(C* that_p) const    { return p < that_p; }
     967    bool operator==(C* that_p) const    { return p == that_p; }
     968
     969    template<class I>
     970    bool equalsTo(I *aThat) const
     971    {
     972        return ComPtrEquals(p, aThat);
     973    }
     974
     975    template<class OC>
     976    bool equalsTo(const ComPtrBase<OC> &oc) const
     977    {
     978        return equalsTo((OC *) oc);
    986979    }
    987980
    988981    /** Intended to pass instances as in parameters to interface methods */
    989     operator C* () const { return p; }
     982    operator C *() const { return p; }
    990983
    991984    /**
     
    993986     *  pointer).
    994987     */
    995     NoAddRefRelease <C> *operator-> () const
     988    NoAddRefRelease<C> *operator->() const
    996989    {
    997990        AssertMsg (p, ("Managed pointer must not be null\n"));
     
    999992    }
    1000993
    1001     template <class I>
    1002     HRESULT queryInterfaceTo (I **pp) const
     994    template<class I>
     995    HRESULT queryInterfaceTo(I **pp) const
    1003996    {
    1004997        if (pp)
    1005998        {
    1006999            if (p)
    1007             {
    1008                 return p->QueryInterface (COM_IIDOF (I), (void **) pp);
    1009             }
    1010             else
    1011             {
    1012                 *pp = NULL;
    1013                 return S_OK;
    1014             }
    1015         }
    1016 
     1000                return p->QueryInterface(COM_IIDOF(I), (void **)pp);
     1001            *pp = NULL;
     1002            return S_OK;
     1003        }
    10171004        return E_INVALIDARG;
    10181005    }
     
    10301017    {
    10311018        if (p)
    1032             RefOps <C>::addref (p);
     1019            RefOps<C>::addref(p);
    10331020    }
    10341021
     
    10361023    {
    10371024        if (p)
    1038             RefOps <C>::release (p);
    1039     }
    1040 
    1041     void safe_assign (C *that_p)
     1025            RefOps<C>::release(p);
     1026    }
     1027
     1028    void safe_assign(C *that_p)
    10421029    {
    10431030        /* be aware of self-assignment */
    10441031        if (that_p)
    1045             RefOps <C>::addref (that_p);
     1032            RefOps<C>::addref(that_p);
    10461033        release();
    10471034        p = that_p;
     
    10571044 *  @param I    COM interface class
    10581045 */
    1059 template <class I, template <class> class RefOps = ComStrongRef>
    1060 class ComPtr : public ComPtrBase <I, RefOps>
    1061 {
    1062     typedef ComPtrBase <I, RefOps> Base;
     1046template<class I, template<class> class RefOps = ComStrongRef>
     1047class ComPtr : public ComPtrBase<I, RefOps>
     1048{
     1049    typedef ComPtrBase<I, RefOps> Base;
    10631050
    10641051public:
    10651052
    1066     ComPtr () : Base() {}
    1067     ComPtr (const ComPtr &that) : Base(that) {}
    1068     ComPtr &operator= (const ComPtr &that)
    1069     {
    1070         Base::operator= (that);
     1053    ComPtr() : Base() {}
     1054    ComPtr(const ComPtr &that) : Base(that) {}
     1055    ComPtr&operator= (const ComPtr &that)
     1056    {
     1057        Base::operator=(that);
    10711058        return *this;
    10721059    }
    10731060
    1074     template <class OI>
    1075     ComPtr (OI *that_p) : Base () { operator= (that_p); }
     1061    template<class OI>
     1062    ComPtr(OI *that_p) : Base () { operator=(that_p); }
    10761063
    10771064    /* specialization for I */
    1078     ComPtr (I *that_p) : Base (that_p) {}
     1065    ComPtr(I *that_p) : Base (that_p) {}
    10791066
    10801067    template <class OC>
    1081     ComPtr (const ComPtr <OC, RefOps> &oc) : Base () { operator= ((OC *) oc); }
    1082 
    1083     template <class OI>
    1084     ComPtr &operator= (OI *that_p)
     1068    ComPtr(const ComPtr<OC, RefOps> &oc) : Base() { operator=((OC *) oc); }
     1069
     1070    template<class OI>
     1071    ComPtr &operator=(OI *that_p)
    10851072    {
    10861073        if (that_p)
    1087             that_p->QueryInterface (COM_IIDOF (I), (void **) Base::asOutParam());
     1074            that_p->QueryInterface(COM_IIDOF(I), (void **)Base::asOutParam());
    10881075        else
    10891076            Base::setNull();
     
    10941081    ComPtr &operator=(I *that_p)
    10951082    {
    1096         Base::operator= (that_p);
     1083        Base::operator=(that_p);
    10971084        return *this;
    10981085    }
    10991086
    1100     template <class OC>
    1101     ComPtr &operator= (const ComPtr <OC, RefOps> &oc)
    1102     {
    1103         return operator= ((OC *) oc);
     1087    template<class OC>
     1088    ComPtr &operator=(const ComPtr<OC, RefOps> &oc)
     1089    {
     1090        return operator=((OC *) oc);
    11041091    }
    11051092};
    1106 
    1107 static HRESULT netIfWinFindAdapterClassById(IWbemServices * pSvc, const GUID * pGuid, IWbemClassObject **pAdapterConfig)
     1093#endif
     1094
     1095static HRESULT netIfWinFindAdapterClassById(IWbemServices *pSvc, const GUID *pGuid, IWbemClassObject **pAdapterConfig)
    11081096{
    11091097    HRESULT hr;
    1110     WCHAR wszQuery[256];
     1098
    11111099    WCHAR wszGuid[50];
    1112 
    1113     int length = StringFromGUID2(*pGuid, wszGuid, RT_ELEMENTS(wszGuid));
    1114     if (length)
    1115     {
    1116         swprintf(wszQuery, L"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE SettingID = \"%s\"", wszGuid);
     1100    int cwcGuid = StringFromGUID2(*pGuid, wszGuid, RT_ELEMENTS(wszGuid));
     1101    if (cwcGuid)
     1102    {
     1103        com::BstrFmt bstrQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE SettingID = \"%ls\"", wszGuid);
    11171104        IEnumWbemClassObject* pEnumerator = NULL;
    1118         hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t(wszQuery), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
     1105        hr = pSvc->ExecQuery(com::Bstr("WQL").raw(), bstrQuery.raw(), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
    11191106                             NULL, &pEnumerator);
    11201107        if (SUCCEEDED(hr))
     
    11221109            if (pEnumerator)
    11231110            {
    1124                 IWbemClassObject *pclsObj;
     1111                IWbemClassObject *pclsObj = NULL;
    11251112                ULONG uReturn = 0;
    11261113                hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
     
    11361123                        return S_OK;
    11371124                    }
    1138 
    11391125                    hr = E_FAIL;
    11401126                }
    1141 
    11421127                pEnumerator->Release();
    11431128            }
     
    11541139    {
    11551140        DWORD winEr = GetLastError();
    1156         hr = HRESULT_FROM_WIN32( winEr );
     1141        hr = HRESULT_FROM_WIN32(winEr);
    11571142        if (SUCCEEDED(hr))
    11581143            hr = E_FAIL;
     
    11641149}
    11651150
    1166 static HRESULT netIfWinIsHostOnly(IWbemClassObject * pAdapterConfig, BOOL * pbIsHostOnly)
     1151static HRESULT netIfWinIsHostOnly(IWbemClassObject *pAdapterConfig, BOOL *pfIsHostOnly)
    11671152{
    11681153    VARIANT vtServiceName;
     
    11721157    if (SUCCEEDED(hr))
    11731158    {
    1174         *pbIsHostOnly = bstr_t(vtServiceName.bstrVal) == bstr_t("VBoxNetAdp");
     1159        *pfIsHostOnly = RTUtf16CmpAscii(vtServiceName.bstrVal, "VBoxNetAdp") == 0;
    11751160
    11761161        VariantClear(&vtServiceName);
     
    11821167static HRESULT netIfWinGetIpSettings(IWbemClassObject * pAdapterConfig, ULONG *pIpv4, ULONG *pMaskv4)
    11831168{
     1169    *pIpv4   = 0;
     1170    *pMaskv4 = 0;
     1171
    11841172    VARIANT vtIp;
    1185     HRESULT hr;
    11861173    VariantInit(&vtIp);
    1187 
    1188     *pIpv4 = 0;
    1189     *pMaskv4 = 0;
    1190 
    1191     hr = pAdapterConfig->Get(L"IPAddress", 0, &vtIp, 0, 0);
     1174    HRESULT hr = pAdapterConfig->Get(L"IPAddress", 0, &vtIp, 0, 0);
    11921175    if (SUCCEEDED(hr))
    11931176    {
     
    12011184                if (vtMask.vt == (VT_ARRAY | VT_BSTR))
    12021185                {
    1203                     SAFEARRAY * pIpArray = vtIp.parray;
    1204                     SAFEARRAY * pMaskArray = vtMask.parray;
     1186                    SAFEARRAY *pIpArray  = vtIp.parray;
     1187                    SAFEARRAY *pMaskArray = vtMask.parray;
    12051188                    if (pIpArray && pMaskArray)
    12061189                    {
    1207                         BSTR pCurIp;
    1208                         BSTR pCurMask;
     1190                        BSTR pBstrCurIp;
     1191                        BSTR pBstrCurMask;
    12091192                        for (LONG i = 0;
    1210                             SafeArrayGetElement(pIpArray, &i, (PVOID)&pCurIp) == S_OK
    1211                             && SafeArrayGetElement(pMaskArray, &i, (PVOID)&pCurMask) == S_OK;
    1212                             i++)
     1193                                SafeArrayGetElement(pIpArray,  &i,  (PVOID)&pBstrCurIp)  == S_OK
     1194                             && SafeArrayGetElement(pMaskArray, &i, (PVOID)&pBstrCurMask) == S_OK;
     1195                             i++)
    12131196                        {
    1214                             bstr_t ip(pCurIp);
    1215 
    1216                             ULONG Ipv4 = inet_addr((char*)(ip));
     1197                            com::Utf8Str strIp(pBstrCurIp);
     1198                            ULONG Ipv4 = inet_addr(strIp.c_str());
    12171199                            if (Ipv4 != INADDR_NONE)
    12181200                            {
    12191201                                *pIpv4 = Ipv4;
    1220                                 bstr_t mask(pCurMask);
    1221                                 *pMaskv4 = inet_addr((char*)(mask));
     1202
     1203                                com::Utf8Str strMask(pBstrCurMask);
     1204                                *pMaskv4 = inet_addr(strMask.c_str());
    12221205                                break;
    12231206                            }
     
    12251208                    }
    12261209                }
    1227                 else
    1228                 {
    1229                     *pIpv4 = 0;
    1230                     *pMaskv4 = 0;
    1231                 }
    1232 
    12331210                VariantClear(&vtMask);
    12341211            }
    12351212        }
    1236         else
    1237         {
    1238             *pIpv4 = 0;
    1239             *pMaskv4 = 0;
    1240         }
    1241 
    12421213        VariantClear(&vtIp);
    12431214    }
     
    13081279    ULONG i;
    13091280    *pFound = false;
    1310     ComPtr <IWbemClassObject> pAdapterConfig;
     1281    ComPtr<IWbemClassObject> pAdapterConfig;
    13111282    for (i = 0;
    13121283            (hr = netIfWinFindAdapterClassById(pSvc, pGuid, pAdapterConfig.asOutParam())) == S_OK
     
    13241295#endif /* unused */
    13251296
    1326 static HRESULT netIfWinCreateIWbemServices(IWbemServices ** ppSvc)
     1297static HRESULT netIfWinCreateIWbemServices(IWbemServices **ppSvc)
    13271298{
    13281299    IWbemLocator *pLoc = NULL;
    1329     HRESULT hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
     1300    HRESULT hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
    13301301    if (SUCCEEDED(hr))
    13311302    {
    13321303        IWbemServices *pSvc = NULL;
    1333         hr = pLoc->ConnectServer(bstr_t(L"ROOT\\CIMV2"), /* [in] const BSTR strNetworkResource */
    1334                 NULL, /* [in] const BSTR strUser */
    1335                 NULL, /* [in] const BSTR strPassword */
    1336                 0,    /* [in] const BSTR strLocale */
    1337                 NULL, /* [in] LONG lSecurityFlags */
    1338                 0,    /* [in] const BSTR strAuthority */
    1339                 0,    /* [in] IWbemContext* pCtx */
    1340                 &pSvc /* [out] IWbemServices** ppNamespace */);
     1304        hr = pLoc->ConnectServer(com::Bstr(L"ROOT\\CIMV2").raw(), /* [in] const BSTR strNetworkResource */
     1305                                 NULL, /* [in] const BSTR strUser */
     1306                                 NULL, /* [in] const BSTR strPassword */
     1307                                 0,    /* [in] const BSTR strLocale */
     1308                                 NULL, /* [in] LONG lSecurityFlags */
     1309                                 0,    /* [in] const BSTR strAuthority */
     1310                                 0,    /* [in] IWbemContext* pCtx */
     1311                                 &pSvc /* [out] IWbemServices** ppNamespace */);
    13411312        if (SUCCEEDED(hr))
    13421313        {
    13431314            hr = CoSetProxyBlanket(pSvc, /* IUnknown * pProxy */
    1344                     RPC_C_AUTHN_WINNT, /* DWORD dwAuthnSvc */
    1345                     RPC_C_AUTHZ_NONE, /* DWORD dwAuthzSvc */
    1346                     NULL, /* WCHAR * pServerPrincName */
    1347                     RPC_C_AUTHN_LEVEL_CALL, /* DWORD dwAuthnLevel */
    1348                     RPC_C_IMP_LEVEL_IMPERSONATE, /* DWORD dwImpLevel */
    1349                     NULL, /* RPC_AUTH_IDENTITY_HANDLE pAuthInfo */
    1350                     EOAC_NONE /* DWORD dwCapabilities */
    1351                     );
     1315                                   RPC_C_AUTHN_WINNT, /* DWORD dwAuthnSvc */
     1316                                   RPC_C_AUTHZ_NONE, /* DWORD dwAuthzSvc */
     1317                                   NULL, /* WCHAR * pServerPrincName */
     1318                                   RPC_C_AUTHN_LEVEL_CALL, /* DWORD dwAuthnLevel */
     1319                                   RPC_C_IMP_LEVEL_IMPERSONATE, /* DWORD dwImpLevel */
     1320                                   NULL, /* RPC_AUTH_IDENTITY_HANDLE pAuthInfo */
     1321                                   EOAC_NONE /* DWORD dwCapabilities */
     1322                                   );
    13521323            if (SUCCEEDED(hr))
    13531324            {
     
    13571328                return hr;
    13581329            }
    1359             else
    1360                 NonStandardLogFlow(("CoSetProxyBlanket failed, hr (0x%x)\n", hr));
    1361 
     1330
     1331            NonStandardLogFlow(("CoSetProxyBlanket failed: %Rhrc\n", hr));
    13621332            pSvc->Release();
    13631333        }
    13641334        else
    1365             NonStandardLogFlow(("ConnectServer failed, hr (0x%x)\n", hr));
     1335            NonStandardLogFlow(("ConnectServer failed: %Rhrc\n", hr));
    13661336        pLoc->Release();
    13671337    }
    13681338    else
    1369         NonStandardLogFlow(("CoCreateInstance failed, hr (0x%x)\n", hr));
    1370     return hr;
    1371 }
    1372 
    1373 static HRESULT netIfWinAdapterConfigPath(IWbemClassObject *pObj, BSTR * pStr)
     1339        NonStandardLogFlow(("CoCreateInstance failed: %Rhrc\n", hr));
     1340    return hr;
     1341}
     1342
     1343static HRESULT netIfWinAdapterConfigPath(IWbemClassObject *pObj, com::Bstr *pRet)
    13741344{
    13751345    VARIANT index;
     1346    VariantInit(&index);
    13761347    HRESULT hr = pObj->Get(L"Index", 0, &index, 0, 0);
    13771348    if (SUCCEEDED(hr))
    1378     {
    1379         WCHAR strIndex[8];
    1380         swprintf(strIndex, L"%u", index.uintVal);
    1381         *pStr = (bstr_t(L"Win32_NetworkAdapterConfiguration.Index='") + strIndex + "'").copy();
    1382     }
     1349        hr = pRet->printfNoThrow("Win32_NetworkAdapterConfiguration.Index='%u'", index.uintVal);
    13831350    else
    1384         NonStandardLogFlow(("Get failed, hr (0x%x)\n", hr));
    1385     return hr;
    1386 }
    1387 
    1388 static HRESULT netIfExecMethod(IWbemServices * pSvc, IWbemClassObject *pClass, BSTR ObjPath,
    1389         BSTR MethodName, LPWSTR *pArgNames, LPVARIANT *pArgs, UINT cArgs,
    1390         IWbemClassObject** ppOutParams
    1391         )
    1392 {
    1393     HRESULT hr = S_OK;
    1394     ComPtr<IWbemClassObject> pInParamsDefinition;
    1395     ComPtr<IWbemClassObject> pClassInstance;
    1396 
    1397     if (cArgs)
    1398     {
    1399         hr = pClass->GetMethod(MethodName, 0, pInParamsDefinition.asOutParam(), NULL);
     1351    {
     1352        pRet->setNull();
     1353        NonStandardLogFlow(("Get failed: %Rhrc\n", hr));
     1354    }
     1355    return hr;
     1356}
     1357
     1358static HRESULT netIfExecMethod(IWbemServices * pSvc, IWbemClassObject *pClass, com::Bstr const &rObjPath,
     1359                               const char *pszMethodName, LPWSTR *papwszArgNames, LPVARIANT *pArgs, UINT cArgs,
     1360                               IWbemClassObject **ppOutParams)
     1361{
     1362    *ppOutParams = NULL;
     1363    com::Bstr bstrMethodName;
     1364    HRESULT hr = bstrMethodName.assignEx(pszMethodName);
     1365    if (SUCCEEDED(hr))
     1366    {
     1367        ComPtr<IWbemClassObject> pInParamsDefinition;
     1368        ComPtr<IWbemClassObject> pClassInstance;
     1369        if (cArgs)
     1370        {
     1371            hr = pClass->GetMethod(bstrMethodName.raw(), 0, pInParamsDefinition.asOutParam(), NULL);
     1372            if (SUCCEEDED(hr))
     1373            {
     1374                hr = pInParamsDefinition->SpawnInstance(0, pClassInstance.asOutParam());
     1375                if (SUCCEEDED(hr))
     1376                {
     1377                    for (UINT i = 0; i < cArgs; i++)
     1378                    {
     1379                        hr = pClassInstance->Put(papwszArgNames[i], 0, pArgs[i], 0);
     1380                        if (FAILED(hr))
     1381                            break;
     1382                    }
     1383                }
     1384            }
     1385        }
     1386
    14001387        if (SUCCEEDED(hr))
    14011388        {
    1402             hr = pInParamsDefinition->SpawnInstance(0, pClassInstance.asOutParam());
     1389            IWbemClassObject *pOutParams = NULL;
     1390            hr = pSvc->ExecMethod(rObjPath.raw(), bstrMethodName.raw(), 0, NULL, pClassInstance, &pOutParams, NULL);
    14031391            if (SUCCEEDED(hr))
    1404             {
    1405                 for (UINT i = 0; i < cArgs; i++)
    1406                 {
    1407                     hr = pClassInstance->Put(pArgNames[i], 0,
    1408                         pArgs[i], 0);
    1409                     if (FAILED(hr))
    1410                         break;
    1411                 }
    1412             }
    1413         }
    1414     }
    1415 
    1416     if (SUCCEEDED(hr))
    1417     {
    1418         IWbemClassObject* pOutParams = NULL;
    1419         hr = pSvc->ExecMethod(ObjPath, MethodName, 0, NULL, pClassInstance, &pOutParams, NULL);
     1392                *ppOutParams = pOutParams;
     1393        }
     1394    }
     1395
     1396    return hr;
     1397}
     1398
     1399static HRESULT netIfWinCreateIpArray(SAFEARRAY **ppArray, in_addr const *paIps, UINT cIps)
     1400{
     1401    HRESULT    hr = S_OK;
     1402    SAFEARRAY *pIpArray = SafeArrayCreateVector(VT_BSTR, 0, cIps);
     1403    if (pIpArray)
     1404    {
     1405        for (UINT i = 0; i < cIps; i++)
     1406        {
     1407            com::Bstr bstrVal;
     1408            hr = bstrVal.printfNoThrow("%RTnaipv4", paIps[i].s_addr);
     1409            if (SUCCEEDED(hr))
     1410            {
     1411                Assert(bstrVal.equals(inet_ntoa(paIps[i])));
     1412
     1413                BSTR pRawVal;
     1414                hr = bstrVal.detachToEx(&pRawVal);
     1415                if (SUCCEEDED(hr))
     1416                {
     1417                    LONG aIndex[1] = { (LONG)i };
     1418                    hr = SafeArrayPutElement(pIpArray, aIndex, pRawVal);
     1419                    if (SUCCEEDED(hr))
     1420                        continue;
     1421                    SysFreeString(pRawVal);
     1422                }
     1423            }
     1424            break;
     1425        }
     1426
    14201427        if (SUCCEEDED(hr))
    1421         {
    1422             *ppOutParams = pOutParams;
    1423         }
    1424     }
    1425 
    1426     return hr;
    1427 }
    1428 
    1429 static HRESULT netIfWinCreateIpArray(SAFEARRAY **ppArray, in_addr* aIp, UINT cIp)
    1430 {
    1431     HRESULT hr = S_OK; /* MSC maybe used uninitialized */
    1432     SAFEARRAY * pIpArray = SafeArrayCreateVector(VT_BSTR, 0, cIp);
    1433     if (pIpArray)
    1434     {
    1435         for (UINT i = 0; i < cIp; i++)
    1436         {
    1437             char* addr = inet_ntoa(aIp[i]);
    1438             BSTR val = bstr_t(addr).copy();
    1439             long aIndex[1];
    1440             aIndex[0] = i;
    1441             hr = SafeArrayPutElement(pIpArray, aIndex, val);
    1442             if (FAILED(hr))
    1443             {
    1444                 SysFreeString(val);
    1445                 SafeArrayDestroy(pIpArray);
    1446                 break;
    1447             }
    1448         }
    1449 
    1450         if (SUCCEEDED(hr))
    1451         {
    14521428            *ppArray = pIpArray;
    1453         }
     1429        else
     1430            SafeArrayDestroy(pIpArray);
    14541431    }
    14551432    else
    14561433        hr = HRESULT_FROM_WIN32(GetLastError());
    1457 
    14581434    return hr;
    14591435}
     
    14661442    if (pIpArray)
    14671443    {
    1468         BSTR val = bstr_t(Ip, false).copy();
     1444        BSTR val = com::Bstr(Ip, false).copy();
    14691445        long aIndex[1];
    14701446        aIndex[0] = 0;
     
    14891465
    14901466
    1491 static HRESULT netIfWinCreateIpArrayVariantV4(VARIANT * pIpAddresses, in_addr* aIp, UINT cIp)
    1492 {
    1493     HRESULT hr;
     1467static HRESULT netIfWinCreateIpArrayVariantV4(VARIANT *pIpAddresses, in_addr const *paIps, UINT cIps)
     1468{
    14941469    VariantInit(pIpAddresses);
    14951470    pIpAddresses->vt = VT_ARRAY | VT_BSTR;
     1471
    14961472    SAFEARRAY *pIpArray;
    1497     hr = netIfWinCreateIpArray(&pIpArray, aIp, cIp);
     1473    HRESULT hr = netIfWinCreateIpArray(&pIpArray, paIps, cIps);
    14981474    if (SUCCEEDED(hr))
    1499     {
    15001475        pIpAddresses->parray = pIpArray;
    1501     }
    15021476    return hr;
    15031477}
     
    15191493#endif
    15201494
    1521 static HRESULT netIfWinEnableStatic(IWbemServices *pSvc, const GUID *pGuid, BSTR ObjPath, VARIANT *pIp, VARIANT *pMask)
     1495static HRESULT netIfWinEnableStatic(IWbemServices *pSvc, const GUID *pGuid, com::Bstr &rObjPath, VARIANT *pIp, VARIANT *pMask)
     1496{
     1497    com::Bstr bstrClassName;
     1498    HRESULT hr = bstrClassName.assignEx("Win32_NetworkAdapterConfiguration");
     1499    if (SUCCEEDED(hr))
     1500    {
     1501        ComPtr<IWbemClassObject> pClass;
     1502        hr = pSvc->GetObject(bstrClassName.raw(), 0, NULL, pClass.asOutParam(), NULL);
     1503        if (SUCCEEDED(hr))
     1504        {
     1505            LPWSTR argNames[] = {L"IPAddress", L"SubnetMask"};
     1506            LPVARIANT  args[] = {         pIp,        pMask };
     1507
     1508            ComPtr<IWbemClassObject> pOutParams;
     1509            hr = netIfExecMethod(pSvc, pClass, rObjPath.raw(), "EnableStatic", argNames, args,
     1510                                 2, pOutParams.asOutParam());
     1511            if (SUCCEEDED(hr))
     1512            {
     1513                com::Bstr bstrReturnValue;
     1514                hr = bstrReturnValue.assignEx("ReturnValue");
     1515                if (SUCCEEDED(hr))
     1516                {
     1517                    VARIANT varReturnValue;
     1518                    VariantInit(&varReturnValue);
     1519                    hr = pOutParams->Get(bstrReturnValue.raw(), 0, &varReturnValue, NULL, 0);
     1520                    Assert(SUCCEEDED(hr));
     1521                    if (SUCCEEDED(hr))
     1522                    {
     1523                        //Assert(varReturnValue.vt == VT_UINT);
     1524                        int winEr = varReturnValue.uintVal;
     1525                        switch (winEr)
     1526                        {
     1527                            case 0:
     1528                            {
     1529                                hr = S_OK;
     1530                                //bool bFound;
     1531                                //HRESULT tmpHr = netIfWinWaitIpSettings(pSvc, pGuid, pIp->parray, pMask->parray, 180, &bFound);
     1532                                NOREF(pGuid);
     1533                                break;
     1534                            }
     1535                            default:
     1536                                hr = HRESULT_FROM_WIN32( winEr );
     1537                                break;
     1538                        }
     1539                    }
     1540                }
     1541            }
     1542        }
     1543    }
     1544    return hr;
     1545}
     1546
     1547
     1548static HRESULT netIfWinEnableStaticV4(IWbemServices *pSvc, const GUID *pGuid, com::Bstr &rObjPath,
     1549                                      in_addr const *paIps, in_addr const *paMasks, UINT cIpAndMasks)
     1550{
     1551    VARIANT ipAddresses;
     1552    HRESULT hr = netIfWinCreateIpArrayVariantV4(&ipAddresses, paIps, cIpAndMasks);
     1553    if (SUCCEEDED(hr))
     1554    {
     1555        VARIANT ipMasks;
     1556        hr = netIfWinCreateIpArrayVariantV4(&ipMasks, paMasks, cIpAndMasks);
     1557        if (SUCCEEDED(hr))
     1558        {
     1559            hr = netIfWinEnableStatic(pSvc, pGuid, rObjPath, &ipAddresses, &ipMasks);
     1560            VariantClear(&ipMasks);
     1561        }
     1562        VariantClear(&ipAddresses);
     1563    }
     1564    return hr;
     1565}
     1566
     1567#if 0 /* unused */
     1568
     1569static HRESULT netIfWinEnableStaticV4V6(IWbemServices * pSvc, const GUID * pGuid, BSTR ObjPath, BSTR Ip, BSTR Mask)
     1570{
     1571    VARIANT ipAddresses;
     1572    HRESULT hr = netIfWinCreateIpArrayVariantV4V6(&ipAddresses, Ip);
     1573    if (SUCCEEDED(hr))
     1574    {
     1575        VARIANT ipMasks;
     1576        hr = netIfWinCreateIpArrayVariantV4V6(&ipMasks, Mask);
     1577        if (SUCCEEDED(hr))
     1578        {
     1579            hr = netIfWinEnableStatic(pSvc, pGuid, ObjPath, &ipAddresses, &ipMasks);
     1580            VariantClear(&ipMasks);
     1581        }
     1582        VariantClear(&ipAddresses);
     1583    }
     1584    return hr;
     1585}
     1586
     1587/* win API allows to set gw metrics as well, we are not setting them */
     1588static HRESULT netIfWinSetGateways(IWbemServices * pSvc, BSTR ObjPath, VARIANT * pGw)
    15221589{
    15231590    ComPtr<IWbemClassObject> pClass;
     
    15291596        if (SUCCEEDED(hr))
    15301597        {
    1531             LPWSTR argNames[] = {L"IPAddress", L"SubnetMask"};
    1532             LPVARIANT args[] = {pIp, pMask};
    1533             ComPtr<IWbemClassObject> pOutParams;
    1534 
    1535             hr = netIfExecMethod(pSvc, pClass, ObjPath, bstr_t(L"EnableStatic"), argNames, args, 2, pOutParams.asOutParam());
    1536             if (SUCCEEDED(hr))
    1537             {
    1538                 VARIANT varReturnValue;
    1539                 hr = pOutParams->Get(bstr_t(L"ReturnValue"), 0,
    1540                     &varReturnValue, NULL, 0);
    1541                 Assert(SUCCEEDED(hr));
    1542                 if (SUCCEEDED(hr))
    1543                 {
    1544 //                    Assert(varReturnValue.vt == VT_UINT);
    1545                     int winEr = varReturnValue.uintVal;
    1546                     switch (winEr)
    1547                     {
    1548                         case 0:
    1549                         {
    1550                             hr = S_OK;
    1551 //                            bool bFound;
    1552 //                            HRESULT tmpHr = netIfWinWaitIpSettings(pSvc, pGuid, pIp->parray, pMask->parray, 180, &bFound);
    1553                             NOREF(pGuid);
    1554                             break;
    1555                         }
    1556                         default:
    1557                             hr = HRESULT_FROM_WIN32( winEr );
    1558                             break;
    1559                     }
    1560                 }
    1561             }
    1562         }
    1563         SysFreeString(ClassName);
    1564     }
    1565     else
    1566         hr = HRESULT_FROM_WIN32(GetLastError());
    1567 
    1568     return hr;
    1569 }
    1570 
    1571 
    1572 static HRESULT netIfWinEnableStaticV4(IWbemServices * pSvc, const GUID * pGuid, BSTR ObjPath, in_addr* aIp, in_addr * aMask, UINT cIp)
    1573 {
    1574     VARIANT ipAddresses;
    1575     HRESULT hr = netIfWinCreateIpArrayVariantV4(&ipAddresses, aIp, cIp);
    1576     if (SUCCEEDED(hr))
    1577     {
    1578         VARIANT ipMasks;
    1579         hr = netIfWinCreateIpArrayVariantV4(&ipMasks, aMask, cIp);
    1580         if (SUCCEEDED(hr))
    1581         {
    1582             hr = netIfWinEnableStatic(pSvc, pGuid, ObjPath, &ipAddresses, &ipMasks);
    1583             VariantClear(&ipMasks);
    1584         }
    1585         VariantClear(&ipAddresses);
    1586     }
    1587     return hr;
    1588 }
    1589 
    1590 #if 0 /* unused */
    1591 
    1592 static HRESULT netIfWinEnableStaticV4V6(IWbemServices * pSvc, const GUID * pGuid, BSTR ObjPath, BSTR Ip, BSTR Mask)
    1593 {
    1594     VARIANT ipAddresses;
    1595     HRESULT hr = netIfWinCreateIpArrayVariantV4V6(&ipAddresses, Ip);
    1596     if (SUCCEEDED(hr))
    1597     {
    1598         VARIANT ipMasks;
    1599         hr = netIfWinCreateIpArrayVariantV4V6(&ipMasks, Mask);
    1600         if (SUCCEEDED(hr))
    1601         {
    1602             hr = netIfWinEnableStatic(pSvc, pGuid, ObjPath, &ipAddresses, &ipMasks);
    1603             VariantClear(&ipMasks);
    1604         }
    1605         VariantClear(&ipAddresses);
    1606     }
    1607     return hr;
    1608 }
    1609 
    1610 /* win API allows to set gw metrics as well, we are not setting them */
    1611 static HRESULT netIfWinSetGateways(IWbemServices * pSvc, BSTR ObjPath, VARIANT * pGw)
    1612 {
    1613     ComPtr<IWbemClassObject> pClass;
    1614     BSTR ClassName = SysAllocString(L"Win32_NetworkAdapterConfiguration");
    1615     HRESULT hr;
    1616     if (ClassName)
    1617     {
    1618         hr = pSvc->GetObject(ClassName, 0, NULL, pClass.asOutParam(), NULL);
    1619         if (SUCCEEDED(hr))
    1620         {
    16211598            LPWSTR argNames[] = {L"DefaultIPGateway"};
    16221599            LPVARIANT args[] = {pGw};
    16231600            ComPtr<IWbemClassObject> pOutParams;
    16241601
    1625             hr = netIfExecMethod(pSvc, pClass, ObjPath, bstr_t(L"SetGateways"), argNames, args, 1, pOutParams.asOutParam());
     1602            hr = netIfExecMethod(pSvc, pClass, ObjPath, com::Bstr(L"SetGateways"), argNames, args, 1, pOutParams.asOutParam());
    16261603            if (SUCCEEDED(hr))
    16271604            {
    16281605                VARIANT varReturnValue;
    1629                 hr = pOutParams->Get(bstr_t(L"ReturnValue"), 0, &varReturnValue, NULL, 0);
     1606                hr = pOutParams->Get(com::Bstr(L"ReturnValue"), 0, &varReturnValue, NULL, 0);
    16301607                Assert(SUCCEEDED(hr));
    16311608                if (SUCCEEDED(hr))
     
    16811658#endif /* unused */
    16821659
    1683 static HRESULT netIfWinEnableDHCP(IWbemServices * pSvc, BSTR ObjPath)
    1684 {
    1685     ComPtr<IWbemClassObject> pClass;
    1686     BSTR ClassName = SysAllocString(L"Win32_NetworkAdapterConfiguration");
    1687     HRESULT hr;
    1688     if (ClassName)
    1689     {
    1690         hr = pSvc->GetObject(ClassName, 0, NULL, pClass.asOutParam(), NULL);
     1660static HRESULT netIfWinEnableDHCP(IWbemServices * pSvc, const com::Bstr &rObjPath)
     1661{
     1662    com::Bstr bstrClassName;
     1663    HRESULT hr = bstrClassName.assignEx("Win32_NetworkAdapterConfiguration");
     1664    if (SUCCEEDED(hr))
     1665    {
     1666        ComPtr<IWbemClassObject> pClass;
     1667        hr = pSvc->GetObject(bstrClassName.raw(), 0, NULL, pClass.asOutParam(), NULL);
    16911668        if (SUCCEEDED(hr))
    16921669        {
    16931670            ComPtr<IWbemClassObject> pOutParams;
    1694 
    1695             hr = netIfExecMethod(pSvc, pClass, ObjPath, bstr_t(L"EnableDHCP"), NULL, NULL, 0, pOutParams.asOutParam());
     1671            hr = netIfExecMethod(pSvc, pClass, rObjPath, "EnableDHCP", NULL, NULL, 0, pOutParams.asOutParam());
    16961672            if (SUCCEEDED(hr))
    16971673            {
    1698                 VARIANT varReturnValue;
    1699                 hr = pOutParams->Get(bstr_t(L"ReturnValue"), 0,
    1700                     &varReturnValue, NULL, 0);
    1701                 Assert(SUCCEEDED(hr));
     1674                com::Bstr bstrReturnValue;
     1675                hr = bstrReturnValue.assignEx("ReturnValue");
    17021676                if (SUCCEEDED(hr))
    17031677                {
    1704 //                    Assert(varReturnValue.vt == VT_UINT);
    1705                     int winEr = varReturnValue.uintVal;
    1706                     switch (winEr)
     1678                    VARIANT varReturnValue;
     1679                    VariantInit(&varReturnValue);
     1680                    hr = pOutParams->Get(bstrReturnValue.raw(), 0, &varReturnValue, NULL, 0);
     1681                    Assert(SUCCEEDED(hr));
     1682                    if (SUCCEEDED(hr))
    17071683                    {
    1708                     case 0:
    1709                         hr = S_OK;
    1710                         break;
    1711                     default:
    1712                         hr = HRESULT_FROM_WIN32( winEr );
    1713                         break;
     1684                        //Assert(varReturnValue.vt == VT_UINT);
     1685                        int winEr = varReturnValue.uintVal;
     1686                        switch (winEr)
     1687                        {
     1688                            case 0:
     1689                                hr = S_OK;
     1690                                break;
     1691                            default:
     1692                                hr = HRESULT_FROM_WIN32( winEr );
     1693                                break;
     1694                        }
    17141695                    }
    17151696                }
    17161697            }
    17171698        }
    1718         SysFreeString(ClassName);
    1719     }
    1720     else
    1721         hr = HRESULT_FROM_WIN32(GetLastError());
    1722 
    1723     return hr;
    1724 }
    1725 
    1726 static HRESULT netIfWinDhcpRediscover(IWbemServices * pSvc, BSTR ObjPath)
    1727 {
    1728     ComPtr<IWbemClassObject> pClass;
    1729     BSTR ClassName = SysAllocString(L"Win32_NetworkAdapterConfiguration");
    1730     HRESULT hr;
    1731     if (ClassName)
    1732     {
    1733         hr = pSvc->GetObject(ClassName, 0, NULL, pClass.asOutParam(), NULL);
     1699    }
     1700    return hr;
     1701}
     1702
     1703static HRESULT netIfWinDhcpRediscover(IWbemServices * pSvc, const com::Bstr &rObjPath)
     1704{
     1705    com::Bstr bstrClassName;
     1706    HRESULT hr = bstrClassName.assignEx("Win32_NetworkAdapterConfiguration");
     1707    if (SUCCEEDED(hr))
     1708    {
     1709        ComPtr<IWbemClassObject> pClass;
     1710        hr = pSvc->GetObject(bstrClassName.raw(), 0, NULL, pClass.asOutParam(), NULL);
    17341711        if (SUCCEEDED(hr))
    17351712        {
    17361713            ComPtr<IWbemClassObject> pOutParams;
    1737 
    1738             hr = netIfExecMethod(pSvc, pClass, ObjPath, bstr_t(L"ReleaseDHCPLease"), NULL, NULL, 0, pOutParams.asOutParam());
     1714            hr = netIfExecMethod(pSvc, pClass, rObjPath, "ReleaseDHCPLease", NULL, NULL, 0, pOutParams.asOutParam());
    17391715            if (SUCCEEDED(hr))
    17401716            {
    1741                 VARIANT varReturnValue;
    1742                 hr = pOutParams->Get(bstr_t(L"ReturnValue"), 0, &varReturnValue, NULL, 0);
    1743                 Assert(SUCCEEDED(hr));
     1717                com::Bstr bstrReturnValue;
     1718                hr = bstrReturnValue.assignEx("ReturnValue");
    17441719                if (SUCCEEDED(hr))
    17451720                {
    1746 //                    Assert(varReturnValue.vt == VT_UINT);
    1747                     int winEr = varReturnValue.uintVal;
    1748                     if (winEr == 0)
     1721                    VARIANT varReturnValue;
     1722                    VariantInit(&varReturnValue);
     1723                    hr = pOutParams->Get(bstrReturnValue.raw(), 0, &varReturnValue, NULL, 0);
     1724                    Assert(SUCCEEDED(hr));
     1725                    if (SUCCEEDED(hr))
    17491726                    {
    1750                         hr = netIfExecMethod(pSvc, pClass, ObjPath, bstr_t(L"RenewDHCPLease"), NULL, NULL, 0, pOutParams.asOutParam());
    1751                         if (SUCCEEDED(hr))
     1727                        //Assert(varReturnValue.vt == VT_UINT);
     1728                        int winEr = varReturnValue.uintVal;
     1729                        if (winEr == 0)
    17521730                        {
    1753                             hr = pOutParams->Get(bstr_t(L"ReturnValue"), 0, &varReturnValue, NULL, 0);
    1754                             Assert(SUCCEEDED(hr));
     1731                            hr = netIfExecMethod(pSvc, pClass, rObjPath, "RenewDHCPLease", NULL, NULL, 0, pOutParams.asOutParam());
    17551732                            if (SUCCEEDED(hr))
    17561733                            {
    1757             //                    Assert(varReturnValue.vt == VT_UINT);
    1758                                 winEr = varReturnValue.uintVal;
    1759                                 if (winEr == 0)
    1760                                     hr = S_OK;
    1761                                 else
    1762                                     hr = HRESULT_FROM_WIN32( winEr );
     1734                                hr = pOutParams->Get(bstrReturnValue.raw(), 0, &varReturnValue, NULL, 0);
     1735                                Assert(SUCCEEDED(hr));
     1736                                if (SUCCEEDED(hr))
     1737                                {
     1738                                    //Assert(varReturnValue.vt == VT_UINT);
     1739                                    winEr = varReturnValue.uintVal;
     1740                                    if (winEr == 0)
     1741                                        hr = S_OK;
     1742                                    else
     1743                                        hr = HRESULT_FROM_WIN32( winEr );
     1744                                }
    17631745                            }
    17641746                        }
     1747                        else
     1748                            hr = HRESULT_FROM_WIN32( winEr );
    17651749                    }
    1766                     else
    1767                         hr = HRESULT_FROM_WIN32( winEr );
    1768                 }
    1769             }
    1770         }
    1771         SysFreeString(ClassName);
    1772     }
    1773     else
    1774         hr = HRESULT_FROM_WIN32(GetLastError());
    1775 
    1776     return hr;
    1777 }
    1778 
    1779 static HRESULT vboxNetCfgWinIsDhcpEnabled(IWbemClassObject * pAdapterConfig, BOOL *pEnabled)
     1750                }
     1751            }
     1752        }
     1753    }
     1754
     1755    return hr;
     1756}
     1757
     1758static HRESULT vboxNetCfgWinIsDhcpEnabled(IWbemClassObject *pAdapterConfig, BOOL *pfEnabled)
    17801759{
    17811760    VARIANT vtEnabled;
     1761    VariantInit(&vtEnabled);
    17821762    HRESULT hr = pAdapterConfig->Get(L"DHCPEnabled", 0, &vtEnabled, 0, 0);
    17831763    if (SUCCEEDED(hr))
    1784         *pEnabled = vtEnabled.boolVal;
    1785     return hr;
    1786 }
    1787 
    1788 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGetAdapterSettings(IN const GUID * pGuid, OUT PADAPTER_SETTINGS pSettings)
    1789 {
    1790     HRESULT hr;
    1791     ComPtr <IWbemServices> pSvc;
    1792     hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
     1764        *pfEnabled = vtEnabled.boolVal;
     1765    else
     1766        *pfEnabled = FALSE;
     1767    return hr;
     1768}
     1769
     1770VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGetAdapterSettings(IN const GUID *pGuid, OUT PADAPTER_SETTINGS pSettings)
     1771{
     1772    ComPtr<IWbemServices> pSvc;
     1773    HRESULT hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
    17931774    if (SUCCEEDED(hr))
    17941775    {
     
    18081789VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinIsDhcpEnabled(const GUID * pGuid, BOOL *pEnabled)
    18091790{
    1810     HRESULT hr;
    1811     ComPtr <IWbemServices> pSvc;
    1812     hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
     1791    ComPtr<IWbemServices> pSvc;
     1792    HRESULT hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
    18131793    if (SUCCEEDED(hr))
    18141794    {
     
    18381818        if (SUCCEEDED(hr))
    18391819        {
    1840             BOOL bIsHostOnly;
    1841             hr = netIfWinIsHostOnly(pAdapterConfig, &bIsHostOnly);
     1820            BOOL fIsHostOnly;
     1821            hr = netIfWinIsHostOnly(pAdapterConfig, &fIsHostOnly);
    18421822            if (SUCCEEDED(hr))
    18431823            {
    1844                 if (bIsHostOnly)
     1824                if (fIsHostOnly)
    18451825                {
    18461826                    in_addr aIp[1];
    18471827                    in_addr aMask[1];
    1848                     aIp[0].S_un.S_addr = ip;
     1828                    aIp[0].S_un.S_addr   = ip;
    18491829                    aMask[0].S_un.S_addr = mask;
    18501830
    1851                     BSTR ObjPath;
    1852                     hr = netIfWinAdapterConfigPath(pAdapterConfig, &ObjPath);
     1831                    com::Bstr bstrObjPath;
     1832                    hr = netIfWinAdapterConfigPath(pAdapterConfig, &bstrObjPath);
    18531833                    if (SUCCEEDED(hr))
    18541834                    {
    1855                         hr = netIfWinEnableStaticV4(pSvc, pGuid, ObjPath, aIp, aMask, ip != 0 ? 1 : 0);
     1835                        hr = netIfWinEnableStaticV4(pSvc, pGuid, bstrObjPath, aIp, aMask, ip != 0 ? 1 : 0);
    18561836                        if (SUCCEEDED(hr))
    18571837                        {
     
    18591839                            in_addr aGw[1];
    18601840                            aGw[0].S_un.S_addr = gw;
    1861                             hr = netIfWinSetGatewaysV4(pSvc, ObjPath, aGw, 1);
     1841                            hr = netIfWinSetGatewaysV4(pSvc, bstrObjPath, aGw, 1);
    18621842                            if (SUCCEEDED(hr))
    18631843#endif
     
    18651845                            }
    18661846                        }
    1867                         SysFreeString(ObjPath);
    18681847                    }
    18691848                }
     
    18761855    }
    18771856
    1878     NonStandardLogFlow(("VBoxNetCfgWinEnableStaticIpConfig: returns 0x%x\n", hr));
     1857    NonStandardLogFlow(("VBoxNetCfgWinEnableStaticIpConfig: returns %Rhrc\n", hr));
    18791858    return hr;
    18801859}
     
    18841863{
    18851864    HRESULT hr;
    1886         ComPtr <IWbemServices> pSvc;
     1865        ComPtr<IWbemServices> pSvc;
    18871866        hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
    18881867        if (SUCCEEDED(hr))
     
    19311910VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinEnableDynamicIpConfig(IN const GUID *pGuid)
    19321911{
    1933     HRESULT hr;
    1934         ComPtr <IWbemServices> pSvc;
    1935         hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
    1936         if (SUCCEEDED(hr))
    1937         {
    1938             ComPtr<IWbemClassObject> pAdapterConfig;
    1939             hr = netIfWinFindAdapterClassById(pSvc, pGuid, pAdapterConfig.asOutParam());
    1940             if (SUCCEEDED(hr))
    1941             {
    1942                 BOOL bIsHostOnly;
    1943                 hr = netIfWinIsHostOnly(pAdapterConfig, &bIsHostOnly);
    1944                 if (SUCCEEDED(hr))
    1945                 {
    1946                     if (bIsHostOnly)
    1947                     {
    1948                         BSTR ObjPath;
    1949                         hr = netIfWinAdapterConfigPath(pAdapterConfig, &ObjPath);
    1950                         if (SUCCEEDED(hr))
    1951                         {
    1952                             hr = netIfWinEnableDHCP(pSvc, ObjPath);
    1953                             if (SUCCEEDED(hr))
    1954                             {
    1955 //                              hr = netIfWinUpdateConfig(pIf);
    1956                             }
    1957                             SysFreeString(ObjPath);
    1958                         }
    1959                     }
    1960                     else
    1961                     {
    1962                         hr = E_FAIL;
    1963                     }
    1964                 }
    1965             }
    1966         }
    1967 
    1968 
    1969     return hr;
    1970 }
    1971 
    1972 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinDhcpRediscover(IN const GUID *pGuid)
    1973 {
    1974     HRESULT hr;
    1975     ComPtr <IWbemServices> pSvc;
    1976     hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
     1912    ComPtr<IWbemServices> pSvc;
     1913    HRESULT hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
    19771914    if (SUCCEEDED(hr))
    19781915    {
     
    19811918        if (SUCCEEDED(hr))
    19821919        {
    1983             BOOL bIsHostOnly;
    1984             hr = netIfWinIsHostOnly(pAdapterConfig, &bIsHostOnly);
     1920            BOOL fIsHostOnly;
     1921            hr = netIfWinIsHostOnly(pAdapterConfig, &fIsHostOnly);
    19851922            if (SUCCEEDED(hr))
    19861923            {
    1987                 if (bIsHostOnly)
    1988                 {
    1989                     BSTR ObjPath;
    1990                     hr = netIfWinAdapterConfigPath(pAdapterConfig, &ObjPath);
     1924                if (fIsHostOnly)
     1925                {
     1926                    com::Bstr bstrObjPath;
     1927                    hr = netIfWinAdapterConfigPath(pAdapterConfig, &bstrObjPath);
    19911928                    if (SUCCEEDED(hr))
    19921929                    {
    1993                         hr = netIfWinDhcpRediscover(pSvc, ObjPath);
     1930                        hr = netIfWinEnableDHCP(pSvc, bstrObjPath);
    19941931                        if (SUCCEEDED(hr))
    19951932                        {
    19961933                            //hr = netIfWinUpdateConfig(pIf);
    19971934                        }
    1998                         SysFreeString(ObjPath);
    19991935                    }
    20001936                }
    20011937                else
    2002                 {
    20031938                    hr = E_FAIL;
    2004                 }
    2005             }
    2006         }
    2007     }
    2008 
    2009 
    2010     return hr;
    2011 }
    2012 
    2013 static const char *vboxNetCfgWinAddrToStr(char *pszBuf, LPSOCKADDR pAddr)
     1939            }
     1940        }
     1941    }
     1942    return hr;
     1943}
     1944
     1945VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinDhcpRediscover(IN const GUID *pGuid)
     1946{
     1947    ComPtr<IWbemServices> pSvc;
     1948    HRESULT hr = netIfWinCreateIWbemServices(pSvc.asOutParam());
     1949    if (SUCCEEDED(hr))
     1950    {
     1951        ComPtr<IWbemClassObject> pAdapterConfig;
     1952        hr = netIfWinFindAdapterClassById(pSvc, pGuid, pAdapterConfig.asOutParam());
     1953        if (SUCCEEDED(hr))
     1954        {
     1955            BOOL fIsHostOnly;
     1956            hr = netIfWinIsHostOnly(pAdapterConfig, &fIsHostOnly);
     1957            if (SUCCEEDED(hr))
     1958            {
     1959                if (fIsHostOnly)
     1960                {
     1961                    com::Bstr bstrObjPath;
     1962                    hr = netIfWinAdapterConfigPath(pAdapterConfig, &bstrObjPath);
     1963                    if (SUCCEEDED(hr))
     1964                    {
     1965                        hr = netIfWinDhcpRediscover(pSvc, bstrObjPath);
     1966                        if (SUCCEEDED(hr))
     1967                        {
     1968                            //hr = netIfWinUpdateConfig(pIf);
     1969                        }
     1970                    }
     1971                }
     1972                else
     1973                    hr = E_FAIL;
     1974            }
     1975        }
     1976    }
     1977
     1978
     1979    return hr;
     1980}
     1981
     1982static const char *vboxNetCfgWinAddrToStr(char *pszBuf, size_t cbBuf, LPSOCKADDR pAddr)
    20141983{
    20151984    switch (pAddr->sa_family)
    20161985    {
    20171986        case AF_INET:
    2018             sprintf(pszBuf, "%d.%d.%d.%d",
    2019                     ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b1,
    2020                     ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b2,
    2021                     ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b3,
    2022                     ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b4);
     1987            RTStrPrintf(pszBuf, cbBuf, "%d.%d.%d.%d",
     1988                        ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b1,
     1989                        ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b2,
     1990                        ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b3,
     1991                        ((PSOCKADDR_IN)pAddr)->sin_addr.S_un.S_un_b.s_b4);
    20231992            break;
    20241993        case AF_INET6:
    2025             sprintf(pszBuf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",
    2026                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[0], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[1],
    2027                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[2], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[3],
    2028                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[4], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[5],
    2029                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[6], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[7],
    2030                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[8], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[9],
    2031                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[10], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[11],
    2032                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[12], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[13],
    2033                  ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[14], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[15]);
     1994            RTStrPrintf(pszBuf, cbBuf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",
     1995                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[0], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[1],
     1996                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[2], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[3],
     1997                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[4], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[5],
     1998                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[6], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[7],
     1999                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[8], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[9],
     2000                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[10], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[11],
     2001                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[12], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[13],
     2002                        ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[14], ((PSOCKADDR_IN6)pAddr)->sin6_addr.s6_addr[15]);
    20342003            break;
    20352004        default:
    2036             strcpy(pszBuf, "unknown");
     2005            RTStrCopy(pszBuf, cbBuf, "unknown");
    20372006            break;
    20382007    }
     
    20472016    for (pAdapter = pAddresses; pAdapter; pAdapter = pAdapter->Next)
    20482017    {
    2049         char szBuf[80];
    2050 
    20512018        NonStandardLogFlow(("+- Enumerating adapter '%ls' %s\n", pAdapter->FriendlyName, pAdapter->AdapterName));
    20522019        for (PIP_ADAPTER_PREFIX pPrefix = pAdapter->FirstPrefix; pPrefix; pPrefix = pPrefix->Next)
    20532020        {
    2054             const char *pcszAddress = vboxNetCfgWinAddrToStr(szBuf, pPrefix->Address.lpSockaddr);
     2021            char szBuf[80];
     2022            const char *pcszAddress = vboxNetCfgWinAddrToStr(szBuf, sizeof(szBuf), pPrefix->Address.lpSockaddr);
     2023
    20552024            /* We are concerned with IPv4 only, ignore the rest. */
    20562025            if (pPrefix->Address.lpSockaddr->sa_family != AF_INET)
     
    20592028                continue;
    20602029            }
     2030
    20612031            /* Ignore invalid prefixes as well as host addresses. */
    20622032            if (pPrefix->PrefixLength < 1 || pPrefix->PrefixLength > 31)
     
    20652035                continue;
    20662036            }
     2037
    20672038            /* Ignore multicast and beyond. */
    20682039            ULONG ip = ((struct sockaddr_in *)pPrefix->Address.lpSockaddr)->sin_addr.s_addr;
     
    20722043                continue;
    20732044            }
     2045
    20742046            ULONG mask = htonl((~(((ULONG)~0) >> pPrefix->PrefixLength)));
    20752047            bool fContinue = pfnCallback(ip, mask, pContext);
     
    20792051                return;
    20802052            }
    2081             else
    2082                 NonStandardLogFlow(("| +- %s %d: no conflict, moving on\n", pcszAddress, pPrefix->PrefixLength));
     2053
     2054            NonStandardLogFlow(("| +- %s %d: no conflict, moving on\n", pcszAddress, pPrefix->PrefixLength));
    20832055        }
    20842056    }
     
    20882060{
    20892061    ULONG Prefix;
    2090     bool bConflict;
     2062    bool fConflict;
    20912063}IPPROBE_CONTEXT, *PIPPROBE_CONTEXT;
    20922064
    2093 #define IPPROBE_INIT(_pContext, _addr) \
    2094     ((_pContext)->bConflict = false, \
    2095      (_pContext)->Prefix = _addr)
    2096 
    2097 #define IPPROBE_INIT_STR(_pContext, _straddr) \
    2098     IPROBE_INIT(_pContext, inet_addr(_straddr))
     2065#define IPPROBE_INIT(a_pContext, a_addr) \
     2066    do { (a_pContext)->fConflict = false; (a_pContext)->Prefix = (a_addr); } while (0)
     2067
     2068#define IPPROBE_INIT_STR(a_pContext, a_straddr) \
     2069    IPROBE_INIT(a_pContext, inet_addr(_straddr))
    20992070
    21002071static bool vboxNetCfgWinIpProbeCallback (ULONG ip, ULONG mask, PVOID pContext)
     
    21042075    if ((ip & mask) == (pProbe->Prefix & mask))
    21052076    {
    2106         pProbe->bConflict = true;
     2077        pProbe->fConflict = true;
    21072078        return false;
    21082079    }
     
    21132084VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostOnlyNetworkNetworkIp(OUT PULONG pNetIp, OUT PULONG pNetMask)
    21142085{
    2115     DWORD dwRc;
    21162086    HRESULT hr = S_OK;
     2087
     2088    *pNetIp   = 0;
     2089    *pNetMask = 0;
     2090
    21172091    /*
    21182092     * MSDN recommends to pre-allocate a 15KB buffer.
    21192093     */
    2120     ULONG uBufLen = 15 * 1024;
    2121     PIP_ADAPTER_ADDRESSES pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(uBufLen);
    2122     if (!pAddresses)
    2123         return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    2124     dwRc = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &uBufLen);
     2094    ULONG                 cbBuf       = 15 * _1K;
     2095    PIP_ADAPTER_ADDRESSES paAddresses = (PIP_ADAPTER_ADDRESSES)RTMemAllocZ(cbBuf);
     2096    if (!paAddresses)
     2097        return E_OUTOFMEMORY;
     2098    DWORD dwRc = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, paAddresses, &cbBuf);
    21252099    if (dwRc == ERROR_BUFFER_OVERFLOW)
    21262100    {
    21272101        /* Impressive! More than 10 adapters! Get more memory and try again. */
    2128         free(pAddresses);
    2129         pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(uBufLen);
    2130         if (!pAddresses)
    2131             return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    2132         dwRc = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &uBufLen);
     2102        RTMemFree(paAddresses);
     2103        paAddresses = (PIP_ADAPTER_ADDRESSES)RTMemAllocZ(cbBuf);
     2104        if (!paAddresses)
     2105            return E_OUTOFMEMORY;
     2106        dwRc = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, paAddresses, &cbBuf);
    21332107    }
    21342108    if (dwRc == NO_ERROR)
    21352109    {
    2136         IPPROBE_CONTEXT Context;
    21372110        const ULONG ip192168 = inet_addr("192.168.0.0");
    2138         srand(GetTickCount());
    2139 
    2140         *pNetIp = 0;
    2141         *pNetMask = 0;
    2142 
    2143         for (int i = 0; i < 255; i++)
    2144         {
    2145             ULONG ipProbe = rand()*255/RAND_MAX;
     2111        for (int i = 0; i < 384; i++)
     2112        {
     2113#if 0
     2114            ULONG ipProbe = rand()*255 / RAND_MAX;
     2115#else
     2116            uint32_t ipProbe = RTRandU32Ex(0, 255);
     2117#endif
    21462118            ipProbe = ip192168 | (ipProbe << 16);
    2147             unsigned char *a = (unsigned char *)&ipProbe;
    2148             NonStandardLogFlow(("probing %d.%d.%d.%d\n", a[0], a[1], a[2], a[3]));
     2119            NonStandardLogFlow(("probing %RTnaipv4\n", ipProbe));
     2120
     2121            IPPROBE_CONTEXT Context;
    21492122            IPPROBE_INIT(&Context, ipProbe);
    2150             vboxNetCfgWinEnumIpConfig(pAddresses, vboxNetCfgWinIpProbeCallback, &Context);
    2151             if (!Context.bConflict)
    2152             {
    2153                 NonStandardLogFlow(("found unused net %d.%d.%d.%d\n", a[0], a[1], a[2], a[3]));
     2123            vboxNetCfgWinEnumIpConfig(paAddresses, vboxNetCfgWinIpProbeCallback, &Context);
     2124            if (!Context.fConflict)
     2125            {
     2126                NonStandardLogFlow(("found unused net %RTnaipv4\n", ipProbe));
    21542127                *pNetIp = ipProbe;
    21552128                *pNetMask = inet_addr("255.255.255.0");
     
    21612134    }
    21622135    else
    2163         NonStandardLogFlow(("GetAdaptersAddresses err (%d)\n", dwRc));
    2164 
    2165     if (pAddresses)
    2166         free(pAddresses);
     2136        NonStandardLogFlow(("GetAdaptersAddresses err (%u)\n", dwRc));
     2137
     2138    RTMemFree(paAddresses);
    21672139
    21682140    if (dwRc != NO_ERROR)
    2169     {
    21702141        hr = HRESULT_FROM_WIN32(dwRc);
    2171     }
    2172 
    21732142    return hr;
    21742143}
     
    21892158
    21902159        hr = VBoxNetCfgWinUninstallComponent(pNc, pNcc);
    2191         NonStandardLogFlow(("NetFlt component uninstallation ended with hr (0x%x)\n", hr));
     2160        NonStandardLogFlow(("NetFlt component uninstallation ended with hr (%Rhrc)\n", hr));
    21922161
    21932162        pNcc->Release();
    21942163    }
    21952164    else if (hr == S_FALSE)
    2196     {
    21972165        NonStandardLog("NetFlt is not installed currently\n");
    2198     }
    21992166    else
    2200     {
    2201         NonStandardLogFlow(("FindComponent failed, hr (0x%x)\n", hr));
    2202     }
     2167        NonStandardLogFlow(("FindComponent failed: %Rhrc\n", hr));
    22032168
    22042169    VBoxDrvCfgInfUninstallAllF(L"NetService", VBOXNETCFGWIN_NETFLT_ID, InfRmFlags);
     
    22132178}
    22142179
    2215 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinNetFltInstall(IN INetCfg *pNc,
    2216                                                        IN LPCWSTR const *apInfFullPaths, IN UINT cInfFullPaths)
     2180VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinNetFltInstall(IN INetCfg *pNc, IN LPCWSTR const *pwszInfFullPath, IN UINT cInfFullPaths)
    22172181{
    22182182    HRESULT hr = vboxNetCfgWinNetFltUninstall(pNc, SUOI_FORCEDELETE);
     
    22222186        hr = vboxNetCfgWinInstallInfAndComponent(pNc, VBOXNETCFGWIN_NETFLT_ID,
    22232187                                                 &GUID_DEVCLASS_NETSERVICE,
    2224                                                  apInfFullPaths,
     2188                                                 pwszInfFullPath,
    22252189                                                 cInfFullPaths,
    22262190                                                 NULL);
     
    22452209
    22462210VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinNetAdpInstall(IN INetCfg *pNc,
    2247                                                        IN LPCWSTR const pInfFullPath)
     2211                                                       IN LPCWSTR const pwszInfFullPath)
    22482212{
    22492213    NonStandardLog("NetAdp will be installed ...\n");
    2250     HRESULT hr = vboxNetCfgWinInstallInfAndComponent(pNc, VBOXNETCFGWIN_NETADP_ID,
    2251                                              &GUID_DEVCLASS_NET,
    2252                                              &pInfFullPath,
    2253                                              1,
    2254                                              NULL);
    2255     return hr;
    2256 }
    2257 
    2258 #define VBOXNETCFGWIN_NETLWF_ID    L"oracle_VBoxNetLwf"
     2214    HRESULT hr = vboxNetCfgWinInstallInfAndComponent(pNc, VBOXNETCFGWIN_NETADP_ID_WSZ,
     2215                                                     &GUID_DEVCLASS_NET,
     2216                                                     &pwszInfFullPath,
     2217                                                     1,
     2218                                                     NULL);
     2219    return hr;
     2220}
     2221
    22592222
    22602223static HRESULT vboxNetCfgWinNetLwfUninstall(IN INetCfg *pNc, DWORD InfRmFlags)
     
    22772240    else
    22782241    {
    2279         NonStandardLogFlow(("FindComponent failed, hr (0x%x)\n", hr));
     2242        NonStandardLogFlow(("FindComponent failed: %Rhrc\n", hr));
    22802243        hr = S_OK;
    22812244    }
     
    22992262     * See @bugref{7899}.
    23002263     */
    2301     HKEY hNetKey;
    2302     DWORD dwMaxNumFilters = 0;
    2303     DWORD cbMaxNumFilters = sizeof(dwMaxNumFilters);
    2304     LONG hr = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    2305                            _T("SYSTEM\\CurrentControlSet\\Control\\Network"),
    2306                            0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hNetKey);
    2307     if (SUCCEEDED(hr))
    2308     {
    2309         hr = RegQueryValueEx(hNetKey, _T("MaxNumFilters"), NULL, NULL,
    2310                              (LPBYTE)&dwMaxNumFilters, &cbMaxNumFilters);
    2311         if (SUCCEEDED(hr) && cbMaxNumFilters == sizeof(dwMaxNumFilters) && dwMaxNumFilters == 8)
     2264    /** @todo r=bird: This code was mixing HRESULT and LSTATUS, checking the return
     2265     * codes using SUCCEEDED(lrc) instead of lrc == ERROR_SUCCESS.  So, it might
     2266     * have misbehaved on bogus registry content, but worked fine on sane values. */
     2267    HKEY hKeyNet = NULL;
     2268    LSTATUS lrc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Network", 0,
     2269                                KEY_QUERY_VALUE | KEY_SET_VALUE, &hKeyNet);
     2270    if (lrc == ERROR_SUCCESS)
     2271    {
     2272        DWORD dwMaxNumFilters = 0;
     2273        DWORD cbMaxNumFilters = sizeof(dwMaxNumFilters);
     2274        lrc = RegQueryValueExW(hKeyNet, L"MaxNumFilters", NULL, NULL, (LPBYTE)&dwMaxNumFilters, &cbMaxNumFilters);
     2275        if (lrc == ERROR_SUCCESS && cbMaxNumFilters == sizeof(dwMaxNumFilters) && dwMaxNumFilters == 8)
    23122276        {
    23132277            dwMaxNumFilters = 14;
    2314             hr = RegSetValueEx(hNetKey, _T("MaxNumFilters"), 0, REG_DWORD,
    2315                              (LPBYTE)&dwMaxNumFilters, sizeof(dwMaxNumFilters));
    2316             if (SUCCEEDED(hr))
     2278            lrc = RegSetValueExW(hKeyNet, L"MaxNumFilters", 0, REG_DWORD, (LPBYTE)&dwMaxNumFilters, sizeof(dwMaxNumFilters));
     2279            if (lrc == ERROR_SUCCESS)
    23172280                NonStandardLog("Adjusted the installed filter limit to 14...\n");
    23182281            else
    2319                 NonStandardLog("Failed to set MaxNumFilters, error code 0x%x\n", hr);
    2320         }
    2321         RegCloseKey(hNetKey);
     2282                NonStandardLog("Failed to set MaxNumFilters, error code %d\n", lrc);
     2283        }
     2284        RegCloseKey(hKeyNet);
    23222285    }
    23232286    else
    2324     {
    2325         NonStandardLog("Failed to open network key, error code 0x%x\n", hr);
    2326     }
    2327 
    2328 }
    2329 
    2330 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinNetLwfInstall(IN INetCfg *pNc,
    2331                                                        IN LPCWSTR const pInfFullPath)
     2287        NonStandardLog("Failed to open network key, error code %d\n", lrc);
     2288
     2289}
     2290
     2291VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinNetLwfInstall(IN INetCfg *pNc, IN LPCWSTR const pwszInfFullPath)
    23322292{
    23332293    HRESULT hr = vboxNetCfgWinNetLwfUninstall(pNc, SUOI_FORCEDELETE);
     
    23382298        hr = vboxNetCfgWinInstallInfAndComponent(pNc, VBOXNETCFGWIN_NETLWF_ID,
    23392299                                                 &GUID_DEVCLASS_NETSERVICE,
    2340                                                  &pInfFullPath,
     2300                                                 &pwszInfFullPath,
    23412301                                                 1,
    23422302                                                 NULL);
     
    23452305}
    23462306
    2347 #define VBOX_CONNECTION_NAME L"VirtualBox Host-Only Network"
    2348 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostonlyConnectionName(PCWSTR DevName, WCHAR *pBuf, PULONG pcbBuf)
    2349 {
    2350     const WCHAR * pSuffix = wcsrchr( DevName, L'#' );
    2351     ULONG cbSize = sizeof(VBOX_CONNECTION_NAME);
    2352 
    2353     if (pSuffix)
    2354     {
    2355         cbSize += (ULONG)wcslen(pSuffix) * 2;
    2356         cbSize += 2; /* for space */
    2357     }
    2358 
    2359     if (*pcbBuf < cbSize)
    2360     {
    2361         *pcbBuf = cbSize;
    2362         return E_FAIL;
    2363     }
    2364 
    2365     wcscpy(pBuf, VBOX_CONNECTION_NAME);
    2366     if (pSuffix)
    2367     {
    2368         wcscat(pBuf, L" ");
    2369         wcscat(pBuf, pSuffix);
    2370     }
    2371 
    2372     return S_OK;
     2307VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostonlyConnectionName(IN PCWSTR pwszDevName, OUT WCHAR *pwszBuf,
     2308                                                                   IN ULONG cwcBuf, OUT PULONG pcwcNeeded)
     2309{
     2310    /* Look for a suffix that we need to preserve. */
     2311    size_t const cwcDevName = RTUtf16Len(pwszDevName);
     2312    size_t       offSuffix  = cwcDevName;
     2313    while (offSuffix > 0 && pwszDevName[offSuffix - 1] != '#')
     2314        offSuffix--;
     2315    size_t const cwcSuffix  = pwszDevName[offSuffix] != '#' ? 0 : cwcDevName - offSuffix;
     2316
     2317    /* Calculate required buffer size: */
     2318    size_t cwcNeeded = sizeof(VBOX_CONNECTION_NAME_WSZ) / sizeof(wchar_t) /* includes terminator */
     2319                     + !!cwcSuffix /*space*/ + cwcSuffix;
     2320    if (pcwcNeeded)
     2321        *pcwcNeeded = (ULONG)cwcNeeded;
     2322
     2323    if (cwcNeeded <= cwcBuf)
     2324    {
     2325        memcpy(pwszBuf, VBOX_CONNECTION_NAME_WSZ, sizeof(VBOX_CONNECTION_NAME_WSZ));
     2326        if (cwcSuffix > 0)
     2327        {
     2328            size_t offDst = sizeof(VBOX_CONNECTION_NAME_WSZ) / sizeof(wchar_t) - 1;
     2329            pwszBuf[offDst++] = ' ';
     2330            memcpy(&pwszBuf[offDst], &pwszDevName[offSuffix], cwcSuffix * sizeof(wchar_t));
     2331            pwszBuf[offDst + cwcSuffix] = '\0';
     2332        }
     2333        return S_OK;
     2334    }
     2335    return E_FAIL;
    23732336}
    23742337
    23752338static BOOL vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority(IN INetCfg *pNc, IN INetCfgComponent *pNcc, PVOID pContext)
    23762339{
     2340    GUID * const pGuid = (GUID*)pContext;
    23772341    RT_NOREF1(pNc);
    2378     INetCfgComponentBindings *pNetCfgBindings;
    2379     GUID *pGuid = (GUID*)pContext;
    23802342
    23812343    /* Get component's binding. */
    2382     HRESULT hr = pNcc->QueryInterface(IID_INetCfgComponentBindings, (PVOID*)&pNetCfgBindings);
     2344    INetCfgComponentBindings *pNetCfgBindings = NULL;
     2345    HRESULT hr = pNcc->QueryInterface(IID_INetCfgComponentBindings, (PVOID *)&pNetCfgBindings);
    23832346    if (SUCCEEDED(hr))
    23842347    {
    23852348        /* Get binding path enumerator reference. */
    2386         IEnumNetCfgBindingPath *pEnumNetCfgBindPath;
     2349        IEnumNetCfgBindingPath *pEnumNetCfgBindPath = NULL;
    23872350        hr = pNetCfgBindings->EnumBindingPaths(EBP_BELOW, &pEnumNetCfgBindPath);
    23882351        if (SUCCEEDED(hr))
    23892352        {
    2390             bool bFoundIface = false;
     2353            bool fFoundIface = false;
    23912354            hr = pEnumNetCfgBindPath->Reset();
    23922355            do
    23932356            {
    2394                 INetCfgBindingPath *pNetCfgBindPath;
     2357                INetCfgBindingPath *pNetCfgBindPath = NULL;
    23952358                hr = pEnumNetCfgBindPath->Next(1, &pNetCfgBindPath, NULL);
    23962359                if (hr == S_OK)
     
    24222385                                            hr = pNetCfgBindings->MoveAfter(pNetCfgBindPath, NULL);
    24232386                                            if (FAILED(hr))
    2424                                                 NonStandardLogFlow(("Unable to move interface, hr (0x%x)\n", hr));
    2425                                             bFoundIface = true;
     2387                                                NonStandardLogFlow(("Unable to move interface: %Rhrc\n", hr));
     2388                                            fFoundIface = true;
     2389
    24262390                                            /*
    24272391                                             * Enable binding paths for host-only adapters bound to bridged filter
     
    24292393                                             */
    24302394                                            HRESULT hr2;
    2431                                             LPWSTR pwszHwId = NULL;
     2395                                            LPWSTR  pwszHwId = NULL;
    24322396                                            if ((hr2 = pNcc->GetId(&pwszHwId)) != S_OK)
    2433                                                 NonStandardLogFlow(("Failed to get HW ID, hr (0x%x)\n", hr2));
    2434                                             else if (_wcsnicmp(pwszHwId, VBOXNETCFGWIN_NETLWF_ID,
    2435                                                                sizeof(VBOXNETCFGWIN_NETLWF_ID)/2))
    2436                                                 NonStandardLogFlow(("Ignoring component %ls\n", pwszHwId));
    2437                                             else if ((hr2 = pNetCfgBindPath->IsEnabled()) != S_FALSE)
    2438                                                 NonStandardLogFlow(("Already enabled binding path, hr (0x%x)\n", hr2));
    2439                                             else if ((hr2 = pNetCfgBindPath->Enable(TRUE)) != S_OK)
    2440                                                 NonStandardLogFlow(("Failed to enable binding path, hr (0x%x)\n", hr2));
     2397                                                NonStandardLogFlow(("Failed to get HW ID: %Rhrc\n", hr2));
    24412398                                            else
    2442                                                 NonStandardLogFlow(("Enabled binding path\n"));
    2443                                             if (pwszHwId)
     2399                                            {
     2400                                                /** @todo r=bird: Original was:
     2401                                                 *    _wcsnicmp(pwszHwId, VBOXNETCFGWIN_NETLWF_ID, sizeof(VBOXNETCFGWIN_NETLWF_ID)/2)
     2402                                                 * which is the same as _wcsicmp. Not sure if this was accidental, but it's not the
     2403                                                 * only one in this code area (VBoxNetFltNobj.cpp had some too IIRC). */
     2404                                                if (RTUtf16ICmp(pwszHwId, VBOXNETCFGWIN_NETLWF_ID) != 0)
     2405                                                    NonStandardLogFlow(("Ignoring component %ls\n", pwszHwId));
     2406                                                else if ((hr2 = pNetCfgBindPath->IsEnabled()) != S_FALSE)
     2407                                                    NonStandardLogFlow(("Already enabled binding path: %Rhrc\n", hr2));
     2408                                                else if ((hr2 = pNetCfgBindPath->Enable(TRUE)) != S_OK)
     2409                                                    NonStandardLogFlow(("Failed to enable binding path: %Rhrc\n", hr2));
     2410                                                else
     2411                                                    NonStandardLogFlow(("Enabled binding path\n"));
    24442412                                                CoTaskMemFree(pwszHwId);
     2413                                            }
    24452414                                        }
    24462415                                    }
     
    24482417                                }
    24492418                                else
    2450                                     NonStandardLogFlow(("GetLowerComponent failed, hr (0x%x)\n", hr));
     2419                                    NonStandardLogFlow(("GetLowerComponent failed: %Rhrc\n", hr));
    24512420                                pNetCfgBindIfce->Release();
    24522421                            }
     
    24562425                                    hr = S_OK;
    24572426                                else
    2458                                     NonStandardLogFlow(("Next binding interface failed, hr (0x%x)\n", hr));
     2427                                    NonStandardLogFlow(("Next binding interface failed: %Rhrc\n", hr));
    24592428                                break;
    24602429                            }
    2461                         } while (!bFoundIface);
     2430                        } while (!fFoundIface);
    24622431                        pEnumNetCfgBindIface->Release();
    24632432                    }
    24642433                    else
    2465                         NonStandardLogFlow(("EnumBindingInterfaces failed, hr (0x%x)\n", hr));
     2434                        NonStandardLogFlow(("EnumBindingInterfaces failed: %Rhrc\n", hr));
    24662435                    pNetCfgBindPath->Release();
    24672436                }
     
    24712440                        hr = S_OK;
    24722441                    else
    2473                         NonStandardLogFlow(("Next bind path failed, hr (0x%x)\n", hr));
     2442                        NonStandardLogFlow(("Next bind path failed: %Rhrc\n", hr));
    24742443                    break;
    24752444                }
    2476             } while (!bFoundIface);
     2445            } while (!fFoundIface);
    24772446            pEnumNetCfgBindPath->Release();
    24782447        }
    24792448        else
    2480             NonStandardLogFlow(("EnumBindingPaths failed, hr (0x%x)\n", hr));
     2449            NonStandardLogFlow(("EnumBindingPaths failed: %Rhrc\n", hr));
    24812450        pNetCfgBindings->Release();
    24822451    }
    24832452    else
    2484         NonStandardLogFlow(("QueryInterface for IID_INetCfgComponentBindings failed, hr (0x%x)\n", hr));
     2453        NonStandardLogFlow(("QueryInterface for IID_INetCfgComponentBindings failed: %Rhrc\n", hr));
    24852454    return TRUE;
    24862455}
    24872456
    2488 static UINT WINAPI vboxNetCfgWinPspFileCallback(
    2489         PVOID Context,
    2490         UINT Notification,
    2491         UINT_PTR Param1,
    2492         UINT_PTR Param2
    2493     )
     2457/** Callback for SetupDiSetDeviceInstallParams used  by
     2458 *  vboxNetCfgWinCreateHostOnlyNetworkInterface */
     2459static UINT WINAPI vboxNetCfgWinPspFileCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
    24942460{
    24952461    switch (Notification)
     
    24992465            return TRUE;
    25002466    }
    2501     return SetupDefaultQueueCallback(Context, Notification, Param1, Param2);
    2502 }
    2503 
    2504 /* The original source of the VBoxNetAdp adapter creation/destruction code has the following copyright */
     2467    return SetupDefaultQueueCallbackW(Context, Notification, Param1, Param2);
     2468}
     2469
     2470
     2471
     2472
     2473/* The original source of the VBoxNetAdp adapter creation/destruction code has the following copyright: */
    25052474/*
    25062475   Copyright 2004 by the Massachusetts Institute of Technology
     
    25302499 *  Use the IShellFolder API to rename the connection.
    25312500 */
    2532 static HRESULT rename_shellfolder (PCWSTR wGuid, PCWSTR wNewName)
    2533 {
     2501static HRESULT rename_shellfolder(PCWSTR pwszGuid, PCWSTR pwszNewName)
     2502{
     2503    /* Build the display name in the form "::{GUID}". Do this first in case it overflows. */
     2504    WCHAR wszAdapterGuid[MAX_PATH + 2] = {0};
     2505    ssize_t cwc = RTUtf16Printf(wszAdapterGuid, RT_ELEMENTS(wszAdapterGuid), "::%ls", pwszGuid);
     2506    if (cwc < 0)
     2507        return E_INVALIDARG;
     2508
    25342509    /* This is the GUID for the network connections folder. It is constant.
    25352510     * {7007ACC7-3202-11D1-AAD2-00805FC1270E} */
     
    25402515    };
    25412516
    2542     LPITEMIDLIST pidl = NULL;
     2517    /* Create an instance of the network connections folder. */
    25432518    IShellFolder *pShellFolder = NULL;
    2544     HRESULT hr;
    2545 
    2546     /* Build the display name in the form "::{GUID}". */
    2547     if (wcslen(wGuid) >= MAX_PATH)
    2548         return E_INVALIDARG;
    2549     WCHAR szAdapterGuid[MAX_PATH + 2] = {0};
    2550     swprintf(szAdapterGuid, L"::%ls", wGuid);
    2551 
    2552     /* Create an instance of the network connections folder. */
    2553     hr = CoCreateInstance(MY_CLSID_NetworkConnections, NULL,
    2554                           CLSCTX_INPROC_SERVER, IID_IShellFolder,
    2555                           reinterpret_cast<LPVOID *>(&pShellFolder));
    2556     /* Parse the display name. */
    2557     if (SUCCEEDED (hr))
    2558     {
    2559         hr = pShellFolder->ParseDisplayName (NULL, NULL, szAdapterGuid, NULL,
    2560                                              &pidl, NULL);
    2561     }
    2562     if (SUCCEEDED (hr))
    2563     {
    2564         hr = pShellFolder->SetNameOf (NULL, pidl, wNewName, SHGDN_NORMAL,
    2565                                       &pidl);
    2566     }
    2567 
    2568     CoTaskMemFree (pidl);
    2569 
    2570     if (pShellFolder)
     2519    HRESULT hr = CoCreateInstance(MY_CLSID_NetworkConnections, NULL, CLSCTX_INPROC_SERVER, IID_IShellFolder,
     2520                                  reinterpret_cast<LPVOID *>(&pShellFolder));
     2521    if (SUCCEEDED(hr))
     2522    {
     2523        /* Parse the display name. */
     2524        LPITEMIDLIST pidl = NULL;
     2525        hr = pShellFolder->ParseDisplayName(NULL, NULL, wszAdapterGuid, NULL, &pidl, NULL);
     2526        if (SUCCEEDED(hr))
     2527            hr = pShellFolder->SetNameOf(NULL, pidl, pwszNewName, SHGDN_NORMAL, &pidl);
     2528        CoTaskMemFree(pidl);
    25712529        pShellFolder->Release();
    2572 
     2530    }
    25732531    return hr;
    25742532}
     
    25782536 *
    25792537 * @returns Module handle or NULL
    2580  * @param   pszName             The DLL name.
     2538 * @param   pwszName            The DLL name.
    25812539 */
    2582 static HMODULE loadSystemDll(const char *pszName)
    2583 {
    2584     char   szPath[MAX_PATH];
    2585     UINT   cchPath = GetSystemDirectoryA(szPath, sizeof(szPath));
    2586     size_t cbName  = strlen(pszName) + 1;
    2587     if (cchPath + 1 + cbName > sizeof(szPath))
     2540static HMODULE loadSystemDll(const wchar_t *pwszName)
     2541{
     2542    WCHAR  wszPath[MAX_PATH];
     2543    UINT   cwcPath = GetSystemDirectoryW(wszPath, RT_ELEMENTS(wszPath));
     2544    size_t cwcName = RTUtf16Len(pwszName) + 1;
     2545    if (cwcPath + 1 + cwcName > RT_ELEMENTS(wszPath))
    25882546        return NULL;
    2589     szPath[cchPath] = '\\';
    2590     memcpy(&szPath[cchPath + 1], pszName, cbName);
    2591     return LoadLibraryA(szPath);
    2592 }
    2593 
    2594 static bool vboxNetCfgWinDetectStaleConnection(PCWSTR pName)
    2595 {
    2596     HKEY hkeyConnection, hkeyAdapter, hkeyAdapters;
    2597     WCHAR wszAdaptersKeyName[] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}";
    2598     WCHAR wszAdapterSubKeyName[MAX_PATH];
    2599     LSTATUS status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, wszAdaptersKeyName, 0, KEY_ALL_ACCESS, &hkeyAdapters);
    2600     if (status != ERROR_SUCCESS)
     2547
     2548    wszPath[cwcPath++] = '\\';
     2549    memcpy(&wszPath[cwcPath], pwszName, cwcName * sizeof(wszPath[0]));
     2550    return LoadLibraryW(wszPath);
     2551}
     2552
     2553static bool vboxNetCfgWinDetectStaleConnection(PCWSTR pwszName)
     2554{
     2555    HKEY    hKeyAdapters = NULL;
     2556    LSTATUS lrc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
     2557                               L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}",
     2558                               0 /*ulOptions*/, KEY_ALL_ACCESS, &hKeyAdapters);
     2559    if (lrc != ERROR_SUCCESS)
    26012560        return false;
    26022561
     
    26042563    for (DWORD i = 0; !fFailureImminent; ++i)
    26052564    {
    2606         DWORD cbName = MAX_PATH;
    2607         status = RegEnumKeyEx(hkeyAdapters, i, wszAdapterSubKeyName, &cbName, NULL, NULL, NULL, NULL);
    2608         // if (status == ERROR_NO_MORE_ITEMS)
    2609         //     break;
    2610         if (status != ERROR_SUCCESS)
     2565        WCHAR wszAdapterSubKeyName[MAX_PATH];
     2566        DWORD cwcAdapterSubKeyName = MAX_PATH;
     2567        lrc = RegEnumKeyEx(hKeyAdapters, i, wszAdapterSubKeyName, &cwcAdapterSubKeyName, NULL, NULL, NULL, NULL);
     2568        if (lrc != ERROR_SUCCESS)
    26112569            break;
    26122570
    2613         status = RegOpenKeyEx(hkeyAdapters, wszAdapterSubKeyName, 0, KEY_ALL_ACCESS, &hkeyAdapter);
    2614         if (status == ERROR_SUCCESS)
    2615         {
    2616             status = RegOpenKeyEx(hkeyAdapter, L"Connection", 0, KEY_ALL_ACCESS, &hkeyConnection);
    2617             if (status == ERROR_SUCCESS)
    2618             {
    2619                 WCHAR wszName[MAX_PATH];
    2620                 cbName = MAX_PATH;
    2621                 status = RegQueryValueEx(hkeyConnection, L"Name", NULL, NULL, (LPBYTE)wszName, &cbName);
    2622                 if (status == ERROR_SUCCESS)
    2623                     if (wcsicmp(wszName, pName) == 0)
     2571        HKEY hKeyAdapter = NULL;
     2572        lrc = RegOpenKeyEx(hKeyAdapters, wszAdapterSubKeyName, 0, KEY_ALL_ACCESS, &hKeyAdapter);
     2573        if (lrc == ERROR_SUCCESS)
     2574        {
     2575            HKEY hKeyConnection = NULL;
     2576            lrc = RegOpenKeyEx(hKeyAdapter, L"Connection", 0, KEY_ALL_ACCESS, &hKeyConnection);
     2577            if (lrc == ERROR_SUCCESS)
     2578            {
     2579                WCHAR wszCurName[MAX_PATH + 1];
     2580                DWORD cbCurName = sizeof(wszCurName) - sizeof(WCHAR);
     2581                DWORD dwType    = REG_SZ;
     2582                lrc = RegQueryValueEx(hKeyConnection, L"Name", NULL, NULL, (LPBYTE)wszCurName, &cbCurName);
     2583                if (   lrc == ERROR_SUCCESS
     2584                    /** @todo r=bird: The original code didn't do any value type checks, thus allowing all SZ types. */
     2585                    && (dwType == REG_SZ || dwType == REG_EXPAND_SZ || dwType == REG_MULTI_SZ))
     2586                {
     2587                    wszCurName[MAX_PATH] = '\0'; /* returned values doesn't necessarily need to be terminated */
     2588
     2589                    if (RTUtf16ICmp(pwszName, pwszName) == 0)
    26242590                        fFailureImminent = true;
    2625                 RegCloseKey(hkeyConnection);
    2626             }
    2627             RegCloseKey(hkeyAdapter);
    2628         }
    2629     }
    2630     RegCloseKey(hkeyAdapters);
     2591                }
     2592                RegCloseKey(hKeyConnection);
     2593            }
     2594            RegCloseKey(hKeyAdapter);
     2595        }
     2596    }
     2597    RegCloseKey(hKeyAdapters);
    26312598
    26322599    return fFailureImminent;
    26332600}
    26342601
    2635 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameConnection (LPWSTR pGuid, PCWSTR NewName)
    2636 {
    2637     typedef HRESULT (WINAPI *lpHrRenameConnection) (const GUID *, PCWSTR);
    2638     lpHrRenameConnection RenameConnectionFunc = NULL;
    2639     HRESULT status;
    2640 
     2602VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameConnection(LPWSTR pwszGuid, PCWSTR NewName)
     2603{
    26412604    /*
    26422605     * Before attempting to rename the connection, check if there is a stale
     
    26462609    if (vboxNetCfgWinDetectStaleConnection(NewName))
    26472610        return S_OK;
     2611
    26482612    /* First try the IShellFolder interface, which was unimplemented
    26492613     * for the network connections folder before XP. */
    2650     status = rename_shellfolder (pGuid, NewName);
    2651     if (status == E_NOTIMPL)
     2614    HRESULT hrc = rename_shellfolder(pwszGuid, NewName);
     2615    if (hrc == E_NOTIMPL)
    26522616    {
    26532617/** @todo that code doesn't seem to work! */
     
    26552619         * Try the (undocumented) HrRenameConnection API in the netshell
    26562620         * library. */
    2657         CLSID clsid;
    2658         HINSTANCE hNetShell;
    2659         status = CLSIDFromString ((LPOLESTR) pGuid, &clsid);
    2660         if (FAILED(status))
     2621        CLSID     clsid;
     2622        hrc = CLSIDFromString((LPOLESTR)pwszGuid, &clsid);
     2623        if (FAILED(hrc))
    26612624            return E_FAIL;
    2662         hNetShell = loadSystemDll("netshell.dll");
     2625
     2626        HINSTANCE hNetShell = loadSystemDll(L"netshell.dll");
    26632627        if (hNetShell == NULL)
    26642628            return E_FAIL;
    2665         RenameConnectionFunc =
    2666           (lpHrRenameConnection) GetProcAddress (hNetShell,
    2667                                                  "HrRenameConnection");
    2668         if (RenameConnectionFunc == NULL)
    2669         {
    2670             FreeLibrary (hNetShell);
    2671             return E_FAIL;
    2672         }
    2673         status = RenameConnectionFunc (&clsid, NewName);
    2674         FreeLibrary (hNetShell);
    2675     }
    2676     if (FAILED (status))
    2677         return status;
    2678 
     2629
     2630        typedef HRESULT (WINAPI *PFNHRRENAMECONNECTION)(const GUID *, PCWSTR);
     2631        PFNHRRENAMECONNECTION pfnRenameConnection = (PFNHRRENAMECONNECTION)GetProcAddress(hNetShell, "HrRenameConnection");
     2632        if (pfnRenameConnection != NULL)
     2633            hrc = pfnRenameConnection(&clsid, NewName);
     2634        else
     2635            hrc = E_FAIL;
     2636
     2637        FreeLibrary(hNetShell);
     2638    }
     2639    if (FAILED(hrc))
     2640        return hrc;
    26792641    return S_OK;
    26802642}
    26812643
    2682 #define DRIVERHWID _T("sun_VBoxNetAdp")
    2683 
    2684 #define SetErrBreak(strAndArgs) \
    2685     if (1) { \
    2686         hrc = E_FAIL; \
    2687         NonStandardLog strAndArgs; \
    2688         bstrError = bstr_printf strAndArgs; \
    2689         break; \
    2690     } else do {} while (0)
    2691 
    2692 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveHostOnlyNetworkInterface(IN const GUID *pGUID, OUT BSTR *pErrMsg)
     2644
     2645VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveHostOnlyNetworkInterface(IN const GUID *pGUID, OUT BSTR *pBstrErrMsg)
    26932646{
    26942647    HRESULT hrc = S_OK;
    2695     bstr_t bstrError;
    2696 
    2697     do
    2698     {
    2699         TCHAR lszPnPInstanceId [512] = {0};
    2700 
    2701         /* We have to find the device instance ID through a registry search */
    2702 
    2703         HKEY hkeyNetwork = 0;
    2704         HKEY hkeyConnection = 0;
    2705 
    2706         do
    2707         {
    2708             WCHAR strRegLocation [256];
     2648    com::Bstr bstrError;
     2649
     2650    do /* break non-loop */
     2651    {
     2652        WCHAR wszPnPInstanceId[512] = {0};
     2653
     2654        /*
     2655         * We have to find the device instance ID through a registry search
     2656         */
     2657        HKEY hkeyNetwork    = NULL;
     2658        HKEY hkeyConnection = NULL;
     2659        do /* another non-loop for breaking out of */
     2660        {
    27092661            WCHAR wszGuid[50];
    2710 
    2711             int length = StringFromGUID2(*pGUID, wszGuid, RT_ELEMENTS(wszGuid));
    2712             if (!length)
     2662            int cwcGuid = StringFromGUID2(*pGUID, wszGuid, RT_ELEMENTS(wszGuid));
     2663            if (!cwcGuid)
    27132664                SetErrBreak(("Failed to create a Guid string"));
    27142665
    2715             swprintf (strRegLocation,
    2716                      L"SYSTEM\\CurrentControlSet\\Control\\Network\\"
    2717                      L"{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s",
    2718                      wszGuid);
    2719 
    2720             LONG status;
    2721             status = RegOpenKeyExW (HKEY_LOCAL_MACHINE, strRegLocation, 0,
    2722                                     KEY_READ, &hkeyNetwork);
    2723             if ((status != ERROR_SUCCESS) || !hkeyNetwork)
    2724                 SetErrBreak (("Host interface network is not found in registry (%S) [1]",
    2725                     strRegLocation));
    2726 
    2727             status = RegOpenKeyExW (hkeyNetwork, L"Connection", 0,
    2728                                     KEY_READ, &hkeyConnection);
    2729             if ((status != ERROR_SUCCESS) || !hkeyConnection)
    2730                 SetErrBreak (("Host interface network is not found in registry (%S) [2]",
    2731                     strRegLocation));
    2732 
    2733             DWORD len = sizeof (lszPnPInstanceId);
    2734             DWORD dwKeyType;
    2735             status = RegQueryValueExW (hkeyConnection, L"PnPInstanceID", NULL,
    2736                                        &dwKeyType, (LPBYTE) lszPnPInstanceId, &len);
    2737             if ((status != ERROR_SUCCESS) || (dwKeyType != REG_SZ))
    2738                 SetErrBreak (("Host interface network is not found in registry (%S) [3]",
    2739                     strRegLocation));
    2740         }
    2741         while (0);
     2666            WCHAR wszRegLocation[128 + RT_ELEMENTS(wszGuid)];
     2667            RTUtf16Printf(wszRegLocation, RT_ELEMENTS(wszRegLocation),
     2668                          "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%ls", wszGuid);
     2669
     2670            LSTATUS lrc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wszRegLocation, 0, KEY_READ, &hkeyNetwork);
     2671            if (lrc != ERROR_SUCCESS || !hkeyNetwork)
     2672                SetErrBreak(("Host interface network is not found in registry (%S): lrc=%u [1]", wszRegLocation, lrc));
     2673
     2674            lrc = RegOpenKeyExW(hkeyNetwork, L"Connection", 0, KEY_READ, &hkeyConnection);
     2675            if (lrc != ERROR_SUCCESS || !hkeyConnection)
     2676                SetErrBreak(("Host interface network is not found in registry (%S): lrc=%u [2]", wszRegLocation, lrc));
     2677
     2678            DWORD cbValue = sizeof(wszPnPInstanceId) - sizeof(WCHAR);
     2679            DWORD dwType  = ~0U;
     2680            lrc = RegQueryValueExW(hkeyConnection, L"PnPInstanceID", NULL, &dwType, (LPBYTE)wszPnPInstanceId, &cbValue);
     2681            if (lrc != ERROR_SUCCESS || dwType != REG_SZ)
     2682                SetErrBreak(("Host interface network is not found in registry (%S): lrc=%u, dwType=%u [3]",
     2683                             wszRegLocation, lrc, dwType));
     2684        } while (0);
    27422685
    27432686        if (hkeyConnection)
    2744             RegCloseKey (hkeyConnection);
     2687            RegCloseKey(hkeyConnection);
    27452688        if (hkeyNetwork)
    2746             RegCloseKey (hkeyNetwork);
    2747 
    2748         if (FAILED (hrc))
     2689            RegCloseKey(hkeyNetwork);
     2690        if (FAILED(hrc))
    27492691            break;
    27502692
     
    27532695         * wait until we encounter the right device instance ID
    27542696         */
    2755 
    27562697        HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE;
    2757 
    2758         do
    2759         {
    2760             BOOL ok;
     2698        do /* break-only, not-a-loop */
     2699        {
     2700            BOOL  ok;
     2701
     2702            /* initialize the structure size */
     2703            SP_DEVINFO_DATA DeviceInfoData = { sizeof(DeviceInfoData) };
     2704
     2705            /* copy the net class GUID */
    27612706            GUID netGuid;
    2762             SP_DEVINFO_DATA DeviceInfoData;
    2763             DWORD index = 0;
    2764             BOOL found = FALSE;
    2765             DWORD size = 0;
    2766 
    2767             /* initialize the structure size */
    2768             DeviceInfoData.cbSize = sizeof (SP_DEVINFO_DATA);
    2769 
    2770             /* copy the net class GUID */
    2771             memcpy(&netGuid, &GUID_DEVCLASS_NET, sizeof (GUID_DEVCLASS_NET));
     2707            memcpy(&netGuid, &GUID_DEVCLASS_NET, sizeof(GUID_DEVCLASS_NET));
    27722708
    27732709            /* return a device info set contains all installed devices of the Net class */
    27742710            hDeviceInfo = SetupDiGetClassDevs(&netGuid, NULL, NULL, DIGCF_PRESENT);
    2775 
    27762711            if (hDeviceInfo == INVALID_HANDLE_VALUE)
    27772712                SetErrBreak(("SetupDiGetClassDevs failed (0x%08X)", GetLastError()));
    27782713
    2779             /* enumerate the driver info list */
    2780             while (TRUE)
    2781             {
    2782                 TCHAR *deviceHwid;
    2783 
    2784                 ok = SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData);
    2785 
    2786                 if (!ok)
     2714            /* Enumerate the driver info list. */
     2715            bool fFound = false;
     2716            for (DWORD index = 0; !fFound; index++)
     2717            {
     2718                if (!SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData))
    27872719                {
    27882720                    if (GetLastError() == ERROR_NO_MORE_ITEMS)
    27892721                        break;
    2790                     else
    2791                     {
    2792                         index++;
    2793                         continue;
    2794                     }
     2722                    continue;
    27952723                }
    27962724
    27972725                /* try to get the hardware ID registry property */
    2798                 ok = SetupDiGetDeviceRegistryProperty(hDeviceInfo,
     2726                DWORD cbValue = 0;
     2727                if (SetupDiGetDeviceRegistryPropertyW(hDeviceInfo,
    27992728                                                      &DeviceInfoData,
    28002729                                                      SPDRP_HARDWAREID,
     
    28022731                                                      NULL,
    28032732                                                      0,
    2804                                                       &size);
    2805                 if (!ok)
    2806                 {
    2807                     if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    2808                     {
    2809                         index++;
    2810                         continue;
    2811                     }
    2812 
    2813                     deviceHwid = (TCHAR *) malloc(size);
    2814                     ok = SetupDiGetDeviceRegistryProperty(hDeviceInfo,
    2815                                                           &DeviceInfoData,
    2816                                                           SPDRP_HARDWAREID,
    2817                                                           NULL,
    2818                                                           (PBYTE)deviceHwid,
    2819                                                           size,
    2820                                                           NULL);
    2821                     if (!ok)
    2822                     {
    2823                         free(deviceHwid);
    2824                         deviceHwid = NULL;
    2825                         index++;
    2826                         continue;
    2827                     }
    2828                 }
    2829                 else
    2830                 {
    2831                     /* something is wrong.  This shouldn't have worked with a NULL buffer */
    2832                     index++;
     2733                                                      &cbValue))
     2734                    continue; /* Something is wrong.  This shouldn't have worked with a NULL buffer! */
     2735                if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    28332736                    continue;
    2834                 }
    2835 
    2836                 for (TCHAR *t = deviceHwid;
    2837                      t && *t && t < &deviceHwid[size / sizeof(TCHAR)];
    2838                      t += _tcslen(t) + 1)
    2839                 {
    2840                     if (!_tcsicmp(DRIVERHWID, t))
    2841                     {
    2842                           /* get the device instance ID */
    2843                           TCHAR devId[MAX_DEVICE_ID_LEN];
    2844                           if (CM_Get_Device_ID(DeviceInfoData.DevInst,
    2845                                                devId, MAX_DEVICE_ID_LEN, 0) == CR_SUCCESS)
    2846                           {
    2847                               /* compare to what we determined before */
    2848                               if (wcscmp(devId, lszPnPInstanceId) == 0)
    2849                               {
    2850                                   found = TRUE;
    2851                                   break;
    2852                               }
    2853                           }
    2854                     }
    2855                 }
    2856 
    2857                 if (deviceHwid)
    2858                 {
    2859                     free (deviceHwid);
    2860                     deviceHwid = NULL;
    2861                 }
    2862 
    2863                 if (found)
     2737
     2738                WCHAR *pwszzDeviceHwId = (WCHAR *)RTMemAllocZ(cbValue + sizeof(WCHAR) * 2);
     2739                if (!pwszzDeviceHwId)
    28642740                    break;
    2865 
    2866                 index++;
    2867             }
    2868 
    2869             if (found == FALSE)
    2870                 SetErrBreak (("Host Interface Network driver not found (0x%08X)",
    2871                               GetLastError()));
    2872 
    2873             ok = SetupDiSetSelectedDevice (hDeviceInfo, &DeviceInfoData);
     2741                if (SetupDiGetDeviceRegistryPropertyW(hDeviceInfo,
     2742                                                      &DeviceInfoData,
     2743                                                      SPDRP_HARDWAREID,
     2744                                                      NULL,
     2745                                                      (PBYTE)pwszzDeviceHwId,
     2746                                                      cbValue,
     2747                                                      &cbValue))
     2748                {
     2749                    /* search the string list. */
     2750                    for (WCHAR *pwszCurHwId = pwszzDeviceHwId;
     2751                         (uintptr_t)pwszCurHwId - (uintptr_t)pwszzDeviceHwId < cbValue && *pwszCurHwId != L'\0';
     2752                         pwszCurHwId += RTUtf16Len(pwszCurHwId) + 1)
     2753                        if (RTUtf16ICmp(DRIVERHWID, pwszCurHwId) == 0)
     2754                        {
     2755                            /* get the device instance ID */
     2756                            WCHAR wszDevId[MAX_DEVICE_ID_LEN];
     2757                            if (CM_Get_Device_IDW(DeviceInfoData.DevInst, wszDevId, MAX_DEVICE_ID_LEN, 0) == CR_SUCCESS)
     2758                            {
     2759                                /* compare to what we determined before */
     2760                                if (RTUtf16Cmp(wszDevId, wszPnPInstanceId) == 0)
     2761                                {
     2762                                    fFound = true;
     2763                                    break;
     2764                                }
     2765                            }
     2766                        }
     2767                }
     2768                RTMemFree(pwszzDeviceHwId);
     2769            }
     2770
     2771            if (!fFound)
     2772                SetErrBreak(("Host Interface Network driver not found (0x%08X)", GetLastError()));
     2773
     2774            ok = SetupDiSetSelectedDevice(hDeviceInfo, &DeviceInfoData);
    28742775            if (!ok)
    2875                 SetErrBreak (("SetupDiSetSelectedDevice failed (0x%08X)",
    2876                               GetLastError()));
    2877 
    2878             ok = SetupDiCallClassInstaller (DIF_REMOVE, hDeviceInfo, &DeviceInfoData);
     2776                SetErrBreak(("SetupDiSetSelectedDevice failed (0x%08X)", GetLastError()));
     2777
     2778            ok = SetupDiCallClassInstaller(DIF_REMOVE, hDeviceInfo, &DeviceInfoData);
    28792779            if (!ok)
    2880                 SetErrBreak (("SetupDiCallClassInstaller (DIF_REMOVE) failed (0x%08X)",
    2881                               GetLastError()));
    2882         }
    2883         while (0);
     2780                SetErrBreak(("SetupDiCallClassInstaller (DIF_REMOVE) failed (0x%08X)", GetLastError()));
     2781        } while (0);
    28842782
    28852783        /* clean up the device info set */
    28862784        if (hDeviceInfo != INVALID_HANDLE_VALUE)
    28872785            SetupDiDestroyDeviceInfoList (hDeviceInfo);
    2888 
    2889         if (FAILED (hrc))
    2890             break;
    2891     }
    2892     while (0);
    2893 
    2894     if (pErrMsg && bstrError.length())
    2895         *pErrMsg = bstrError.Detach();
    2896 
     2786    } while (0);
     2787
     2788    if (pBstrErrMsg)
     2789    {
     2790        *pBstrErrMsg = NULL;
     2791        if (bstrError.isNotEmpty())
     2792            bstrError.detachToEx(pBstrErrMsg);
     2793    }
    28972794    return hrc;
    28982795}
    28992796
    2900 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinUpdateHostOnlyNetworkInterface(LPCWSTR pcsxwInf, BOOL *pbRebootRequired, LPCWSTR pcsxwId)
    2901 {
    2902     return VBoxDrvCfgDrvUpdate(pcsxwId, pcsxwInf, pbRebootRequired);
     2797VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinUpdateHostOnlyNetworkInterface(LPCWSTR pcsxwInf, BOOL *pfRebootRequired, LPCWSTR pcsxwId)
     2798{
     2799    return VBoxDrvCfgDrvUpdate(pcsxwId, pcsxwInf, pfRebootRequired);
    29032800}
    29042801
     
    29072804    switch (dwState)
    29082805    {
    2909         case SERVICE_STOPPED: return "is not running";
    2910         case SERVICE_STOP_PENDING: return "is stopping";
    2911         case SERVICE_CONTINUE_PENDING: return "continue is pending";
    2912         case SERVICE_PAUSE_PENDING: return "pause is pending";
    2913         case SERVICE_PAUSED: return "is paused";
    2914         case SERVICE_RUNNING: return "is running";
    2915         case SERVICE_START_PENDING: return "is starting";
     2806        case SERVICE_STOPPED:           return "is not running";
     2807        case SERVICE_STOP_PENDING:      return "is stopping";
     2808        case SERVICE_CONTINUE_PENDING:  return "continue is pending";
     2809        case SERVICE_PAUSE_PENDING:     return "pause is pending";
     2810        case SERVICE_PAUSED:            return "is paused";
     2811        case SERVICE_RUNNING:           return "is running";
     2812        case SERVICE_START_PENDING:     return "is starting";
    29162813    }
    29172814    return "state is invalid";
     
    29412838}
    29422839
    2943 typedef struct {
     2840typedef struct
     2841{
    29442842    BSTR bstrName;
    29452843    GUID *pGuid;
     
    29632861}
    29642862
    2965 /* We assume the following name matches the device description in vboxnetadp6.inf */
    2966 #define HOSTONLY_ADAPTER_NAME "VirtualBox Host-Only Ethernet Adapter"
    2967 
    2968 /*
     2863/**
    29692864 * Enumerate all host-only adapters collecting their names into a set, then
    29702865 * come up with the next available name by taking the first unoccupied index.
    29712866 */
    2972 static HRESULT vboxNetCfgWinNextAvailableDevName(bstr_t& bstrName)
    2973 {
    2974     SP_DEVINFO_DATA DeviceInfoData;
    2975     /* initialize the structure size */
    2976     DeviceInfoData.cbSize = sizeof (SP_DEVINFO_DATA);
    2977 
    2978     HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT);
    2979     if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    2980         return GetLastError();
    2981 
    2982     DWORD i;
    2983     std::set<bstr_t> aExistingNames;
    2984     for (i = 0; SetupDiEnumDeviceInfo(DeviceInfoSet, i, &DeviceInfoData); ++i)
     2867static HRESULT vboxNetCfgWinNextAvailableDevName(com::Bstr *pbstrName)
     2868{
     2869    SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
     2870    HDEVINFO hDeviceInfoSet = SetupDiGetClassDevsW(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT);
     2871    if (hDeviceInfoSet == INVALID_HANDLE_VALUE)
     2872        return HRESULT_FROM_WIN32(GetLastError());
     2873
     2874    typedef struct VBOXDEVNAMEENTRY
     2875    {
     2876        RTLISTNODE  ListEntry;
     2877        WCHAR       wszDevName[64];
     2878        WCHAR       wcZeroParanoia;
     2879    } VBOXDEVNAMEENTRY;
     2880
     2881#if 0
     2882    /*
     2883     * Build a list of names starting with HOSTONLY_ADAPTER_NAME_WSZ belonging to our device.
     2884     */
     2885    RTLISTANCHOR Head; /* VBOXDEVNAMEENTRY */
     2886    RTListInit(&Head);
     2887    HRESULT      hrc = S_OK;
     2888#else
     2889    /*
     2890     * Build a bitmap of in-use index values of devices starting with HOSTONLY_ADAPTER_NAME_WSZ.
     2891     * Reserving 0 for one w/o a suffix, and marking 1 as unusable.
     2892     */
     2893    uint64_t bmIndexes[_32K / 64]; /* 4KB - 32767 device should be sufficient. */
     2894    RT_ZERO(bmIndexes);
     2895    ASMBitSet(&bmIndexes, 1);
     2896#endif
     2897    for (DWORD i = 0; SetupDiEnumDeviceInfo(hDeviceInfoSet, i, &DeviceInfoData); ++i)
    29852898    {
    29862899        /* Should be more than enough for both our device id and our device name, we do not care about the rest */
    2987         WCHAR wszDevName[64];
    2988         if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID,
    2989                                               NULL, (PBYTE)wszDevName, sizeof(wszDevName), NULL))
     2900        VBOXDEVNAMEENTRY Entry = { { 0, 0 }, L"", 0 }; /* (initialize it to avoid the wrath of asan) */
     2901        if (!SetupDiGetDeviceRegistryPropertyW(hDeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID,
     2902                                               NULL, (PBYTE)Entry.wszDevName, sizeof(Entry.wszDevName), NULL))
    29902903            continue;
     2904
    29912905        /* Ignore everything except our host-only adapters */
    2992         if (_wcsicmp(wszDevName, DRIVERHWID))
    2993             continue;
    2994         if (   SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_FRIENDLYNAME,
    2995                                                 NULL, (PBYTE)wszDevName, sizeof(wszDevName), NULL)
    2996             || SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_DEVICEDESC,
    2997                                                 NULL, (PBYTE)wszDevName, sizeof(wszDevName), NULL))
    2998             aExistingNames.insert(bstr_t(wszDevName));
    2999     }
    3000     /* Try the name without index first */
    3001     bstrName = HOSTONLY_ADAPTER_NAME;
    3002     if (aExistingNames.find(bstrName) != aExistingNames.end())
    3003     {
    3004         WCHAR wszSuffix[16];
    3005         /* Try indexed names until we find unused one */
    3006         for (i = 2;; ++i)
    3007         {
    3008             wsprintf(wszSuffix, L" #%u", i);
    3009             if (aExistingNames.find(bstrName + wszSuffix) == aExistingNames.end())
    3010             {
    3011                 bstrName += wszSuffix;
     2906        if (RTUtf16ICmp(Entry.wszDevName, DRIVERHWID) == 0)
     2907        {
     2908            if (   SetupDiGetDeviceRegistryPropertyW(hDeviceInfoSet, &DeviceInfoData, SPDRP_FRIENDLYNAME,
     2909                                                     NULL, (PBYTE)Entry.wszDevName, sizeof(Entry.wszDevName), NULL)
     2910                || SetupDiGetDeviceRegistryPropertyW(hDeviceInfoSet, &DeviceInfoData, SPDRP_DEVICEDESC,
     2911                                                     NULL, (PBYTE)Entry.wszDevName, sizeof(Entry.wszDevName), NULL))
     2912            {
     2913                /* We can ignore any host-only adapter with a non-standard name. */
     2914                if (RTUtf16NICmp(Entry.wszDevName, HOSTONLY_ADAPTER_NAME_WSZ,
     2915                                 RT_ELEMENTS(HOSTONLY_ADAPTER_NAME_WSZ) - 1) == 0)
     2916                {
     2917#if 0
     2918                    VBOXDEVNAMEENTRY *pEntry = (VBOXDEVNAMEENTRY *)RTMemDup(&Entry, sizeof(Entry));
     2919                    if (pEntry)
     2920                        RTListAppend(&Head, &pEntry->ListEntry);
     2921                    else
     2922                    {
     2923                        hrc = E_OUTOFMEMORY;
     2924                        break;
     2925                    }
     2926#else
     2927                    WCHAR const *pwc = &Entry.wszDevName[RT_ELEMENTS(HOSTONLY_ADAPTER_NAME_WSZ) - 1];
     2928
     2929                    /* skip leading space */
     2930                    WCHAR wc = *pwc;
     2931                    while (wc == L' ' || wc == L'\t' || wc == L'\n' || wc == L'\r')
     2932                        wc = *++pwc;
     2933
     2934                    /* If end of string, use index 0. */
     2935                    if (wc == L'\0')
     2936                        ASMBitSet(bmIndexes, 0);
     2937
     2938                    /* Hash and digit? */
     2939                    else if (wc == L'#')
     2940                    {
     2941                        wc = *++pwc;
     2942                        while (wc == L' ' || wc == L'\t' || wc == L'\n' || wc == L'\r') /* just in case */
     2943                            wc = *++pwc;
     2944                        if (wc >= L'0' && wc <= L'9')
     2945                        {
     2946                            /* Convert what we can to a number and mark it as allocated in the bitmap. */
     2947                            uint64_t uIndex = wc - L'0';
     2948                            while ((wc = *++pwc) >= L'0' && wc <= L'9')
     2949                                uIndex = uIndex * 10 + wc - L'0';
     2950                            if (uIndex < sizeof(bmIndexes) * 8 && uIndex > 0)
     2951                                ASMBitSet(bmIndexes, (int32_t)uIndex);
     2952                        }
     2953                    }
     2954#endif
     2955                }
     2956            }
     2957        }
     2958    }
     2959#if 0
     2960    if (SUCCEEDED(hrc))
     2961    {
     2962        /*
     2963         * First try a name w/o an index, then try index #2 and up.
     2964         *
     2965         * Note! We have to use ASCII/UTF-8 strings here as Bstr will confuse WCHAR
     2966         *       with BSTR/OLECHAR strings and use SysAllocString to duplicate it .
     2967         */
     2968        char         szName[sizeof(HOSTONLY_ADAPTER_NAME_SZ " #4294967296") + 32] = HOSTONLY_ADAPTER_NAME_SZ;
     2969        size_t const cchBase = sizeof(HOSTONLY_ADAPTER_NAME_SZ) - 1;
     2970        for (DWORD idx = 2;; idx++)
     2971        {
     2972            bool              fFound = false;
     2973            VBOXDEVNAMEENTRY *pCur;
     2974            RTListForEach(&Head, pCur, VBOXDEVNAMEENTRY, ListEntry)
     2975            {
     2976                fFound = RTUtf16ICmpAscii(pCur->wszDevName, szName) == 0;
     2977                if (fFound)
     2978                {
     2979                    hrc = pbstrName->assignEx(szName);
     2980                    break;
     2981                }
     2982            }
     2983            if (fFound)
    30122984                break;
    3013             }
    3014         }
    3015     }
    3016 
    3017     if (DeviceInfoSet)
    3018         SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    3019     return S_OK;
    3020 }
    3021 
    3022 static HRESULT vboxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile, IN BSTR bstrDesiredName,
    3023                                                            OUT GUID *pGuid, OUT BSTR *lppszName, OUT BSTR *pErrMsg)
    3024 {
    3025     HRESULT hrc = S_OK;
    3026 
    3027     HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE;
    3028     SP_DEVINFO_DATA DeviceInfoData;
    3029     PVOID pQueueCallbackContext = NULL;
    3030     DWORD ret = 0;
    3031     BOOL registered = FALSE;
    3032     BOOL destroyList = FALSE;
    3033     WCHAR pWCfgGuidString [50];
    3034     WCHAR DevName[256];
    3035     HKEY hkey = (HKEY)INVALID_HANDLE_VALUE;
    3036     bstr_t bstrError;
    3037     bstr_t bstrNewInterfaceName;
    3038 
    3039     if (SysStringLen(bstrDesiredName) != 0)
    3040         bstrNewInterfaceName = bstrDesiredName;
     2985            RTStrPrintf(&szName[cchBase], sizeof(szName) - cchBase, " #%u", idx);
     2986        }
     2987    }
     2988
     2989    VBOXDEVNAMEENTRY *pFirst;
     2990    while ((pFirst = RTListRemoveFirst(&Head, VBOXDEVNAMEENTRY, ListEntry)) != NULL)
     2991        RTMemFree(pFirst);
     2992
     2993#else
     2994    /*
     2995     * Find an unused index value and format the corresponding name.
     2996     */
     2997    HRESULT hrc;
     2998    int32_t iBit = ASMBitFirstClear(bmIndexes, sizeof(bmIndexes) * 8);
     2999    if (iBit >= 0)
     3000    {
     3001        if (iBit == 0)
     3002            hrc = pbstrName->assignEx(HOSTONLY_ADAPTER_NAME_SZ); /* Not _WSZ! */
     3003        else
     3004            hrc = pbstrName->printfNoThrow(HOSTONLY_ADAPTER_NAME_SZ " #%u", iBit);
     3005    }
    30413006    else
    30423007    {
    3043         hrc = vboxNetCfgWinNextAvailableDevName(bstrNewInterfaceName);
     3008        NonStandardLogFlow(("vboxNetCfgWinNextAvailableDevName: no unused index in the first 32K!\n"));
     3009        hrc = E_FAIL;
     3010    }
     3011#endif
     3012
     3013    if (hDeviceInfoSet)
     3014        SetupDiDestroyDeviceInfoList(hDeviceInfoSet);
     3015    return hrc;
     3016}
     3017
     3018static HRESULT vboxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pwszInfPath, IN bool fIsInfPathFile,
     3019                                                           IN BSTR pBstrDesiredName,
     3020                                                           OUT GUID *pGuid, OUT BSTR *pBstrName, OUT BSTR *pBstrErrMsg)
     3021{
     3022    com::Bstr bstrError;
     3023
     3024    /* Determine the interface name. We make a copy of the input here for
     3025       renaming reasons, see futher down. */
     3026    com::Bstr bstrNewInterfaceName;
     3027    HRESULT   hrc;
     3028    if (SysStringLen(pBstrDesiredName) != 0)
     3029        hrc = bstrNewInterfaceName.assignEx(pBstrDesiredName);
     3030    else
     3031    {
     3032        hrc = vboxNetCfgWinNextAvailableDevName(&bstrNewInterfaceName);
    30443033        if (FAILED(hrc))
    30453034            NonStandardLogFlow(("vboxNetCfgWinNextAvailableDevName failed with 0x%x\n", hrc));
    30463035    }
    3047 
    3048     do
    3049     {
    3050         BOOL found = FALSE;
     3036    if (FAILED(hrc))
     3037        return hrc;
     3038
     3039    WCHAR           wszCfgGuidString[50]  = {0};
     3040    WCHAR           wszDevName[256 + 1]   = {0};
     3041    SP_DEVINFO_DATA DeviceInfoData        = { sizeof(DeviceInfoData) };
     3042    HDEVINFO        hDeviceInfo           = INVALID_HANDLE_VALUE;
     3043    PVOID           pQueueCallbackContext = NULL;
     3044    BOOL            fRegistered           = FALSE;
     3045    BOOL            destroyList           = FALSE;
     3046    HKEY            hkey                  = (HKEY)INVALID_HANDLE_VALUE;
     3047    LSTATUS         lrcRet                = ERROR_SUCCESS; /* the */
     3048
     3049    do /* non-loop, for breaking. */
     3050    {
     3051        /* copy the net class GUID */
    30513052        GUID netGuid;
    3052         SP_DRVINFO_DATA DriverInfoData;
    3053         SP_DEVINSTALL_PARAMS DeviceInstallParams;
    3054         TCHAR className [MAX_PATH];
    3055         DWORD index = 0;
    3056         PSP_DRVINFO_DETAIL_DATA pDriverInfoDetail;
    3057         /* for our purposes, 2k buffer is more
    3058          * than enough to obtain the hardware ID
    3059          * of the VBoxNetAdp driver. */
    3060         DWORD detailBuf [2048];
    3061 
    3062         DWORD cbSize;
    3063         DWORD dwValueType;
    3064 
    3065         /* initialize the structure size */
    3066         DeviceInfoData.cbSize = sizeof (SP_DEVINFO_DATA);
    3067         DriverInfoData.cbSize = sizeof (SP_DRVINFO_DATA);
    3068 
    3069         /* copy the net class GUID */
    30703053        memcpy(&netGuid, &GUID_DEVCLASS_NET, sizeof(GUID_DEVCLASS_NET));
    30713054
    3072         /* create an empty device info set associated with the net class GUID */
     3055        /* Create an empty device info set associated with the net class GUID: */
    30733056        hDeviceInfo = SetupDiCreateDeviceInfoList(&netGuid, NULL);
    30743057        if (hDeviceInfo == INVALID_HANDLE_VALUE)
    3075             SetErrBreak (("SetupDiCreateDeviceInfoList failed (0x%08X)",
    3076                           GetLastError()));
    3077 
    3078         /* get the class name from GUID */
    3079         BOOL fResult = SetupDiClassNameFromGuid (&netGuid, className, MAX_PATH, NULL);
    3080         if (!fResult)
    3081             SetErrBreak (("SetupDiClassNameFromGuid failed (0x%08X)",
    3082                           GetLastError()));
    3083 
    3084         /* create a device info element and add the new device instance
    3085          * key to registry */
    3086         fResult = SetupDiCreateDeviceInfo (hDeviceInfo, className, &netGuid, NULL, NULL,
    3087                                      DICD_GENERATE_ID, &DeviceInfoData);
    3088         if (!fResult)
    3089             SetErrBreak (("SetupDiCreateDeviceInfo failed (0x%08X)",
    3090                           GetLastError()));
    3091 
    3092         /* select the newly created device info to be the currently
    3093            selected member */
    3094         fResult = SetupDiSetSelectedDevice (hDeviceInfo, &DeviceInfoData);
    3095         if (!fResult)
    3096             SetErrBreak (("SetupDiSetSelectedDevice failed (0x%08X)",
    3097                           GetLastError()));
    3098 
    3099         if (pInfPath)
     3058            SetErrBreak(("SetupDiCreateDeviceInfoList failed (%Rwc)", GetLastError()));
     3059
     3060        /* Translate the GUID to a class name: */
     3061        WCHAR wszClassName[MAX_PATH];
     3062        if (!SetupDiClassNameFromGuid(&netGuid, wszClassName, MAX_PATH, NULL))
     3063            SetErrBreak(("SetupDiClassNameFromGuid failed (%Rwc)", GetLastError()));
     3064
     3065        /* Create a device info element and add the new device instance key to registry: */
     3066        if (!SetupDiCreateDeviceInfo(hDeviceInfo, wszClassName, &netGuid, NULL, NULL, DICD_GENERATE_ID, &DeviceInfoData))
     3067            SetErrBreak(("SetupDiCreateDeviceInfo failed (%Rwc)", GetLastError()));
     3068
     3069        /* Select the newly created device info to be the currently selected member: */
     3070        if (!SetupDiSetSelectedDevice(hDeviceInfo, &DeviceInfoData))
     3071            SetErrBreak(("SetupDiSetSelectedDevice failed (%Rwc)", GetLastError()));
     3072
     3073        SP_DEVINSTALL_PARAMS DeviceInstallParams;
     3074        if (pwszInfPath)
    31003075        {
    31013076            /* get the device install parameters and disable filecopy */
    31023077            DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
    3103             fResult = SetupDiGetDeviceInstallParams (hDeviceInfo, &DeviceInfoData,
    3104                                                 &DeviceInstallParams);
    3105             if (fResult)
     3078            if (SetupDiGetDeviceInstallParams(hDeviceInfo, &DeviceInfoData, &DeviceInstallParams))
    31063079            {
    31073080                memset(DeviceInstallParams.DriverPath, 0, sizeof(DeviceInstallParams.DriverPath));
    3108                 size_t pathLenght = wcslen(pInfPath) + 1/* null terminator */;
     3081                size_t pathLenght = wcslen(pwszInfPath) + 1/* null terminator */;
    31093082                if (pathLenght < sizeof(DeviceInstallParams.DriverPath)/sizeof(DeviceInstallParams.DriverPath[0]))
    31103083                {
    3111                     memcpy(DeviceInstallParams.DriverPath, pInfPath, pathLenght*sizeof(DeviceInstallParams.DriverPath[0]));
    3112 
    3113                     if (bIsInfPathFile)
     3084                    memcpy(DeviceInstallParams.DriverPath, pwszInfPath, pathLenght*sizeof(DeviceInstallParams.DriverPath[0]));
     3085
     3086                    if (fIsInfPathFile)
     3087                        DeviceInstallParams.Flags |= DI_ENUMSINGLEINF;
     3088
     3089                    if (!SetupDiSetDeviceInstallParams(hDeviceInfo, &DeviceInfoData, &DeviceInstallParams))
    31143090                    {
    3115                         DeviceInstallParams.Flags |= DI_ENUMSINGLEINF;
    3116                     }
    3117 
    3118                     fResult = SetupDiSetDeviceInstallParams(hDeviceInfo, &DeviceInfoData,
    3119                                                        &DeviceInstallParams);
    3120                     if (!fResult)
    3121                     {
    3122                         DWORD winEr = GetLastError();
    3123                         NonStandardLogFlow(("SetupDiSetDeviceInstallParams failed, winEr (%d)\n", winEr));
     3091                        NonStandardLogFlow(("SetupDiSetDeviceInstallParams failed (%Rwc)\n", GetLastError()));
    31243092                        break;
    31253093                    }
     
    31323100            }
    31333101            else
    3134             {
    3135                 DWORD winEr = GetLastError();
    3136                 NonStandardLogFlow(("SetupDiGetDeviceInstallParams failed, winEr (%d)\n", winEr));
    3137             }
     3102                NonStandardLogFlow(("SetupDiGetDeviceInstallParams failed (%Rwc)\n", GetLastError()));
    31383103        }
    31393104
    31403105        /* build a list of class drivers */
    3141         fResult = SetupDiBuildDriverInfoList (hDeviceInfo, &DeviceInfoData,
    3142                                               SPDIT_CLASSDRIVER);
    3143         if (!fResult)
    3144             SetErrBreak (("SetupDiBuildDriverInfoList failed (0x%08X)",
    3145                           GetLastError()));
     3106        if (!SetupDiBuildDriverInfoList(hDeviceInfo, &DeviceInfoData, SPDIT_CLASSDRIVER))
     3107            SetErrBreak(("SetupDiBuildDriverInfoList failed (%Rwc)", GetLastError()));
    31463108
    31473109        destroyList = TRUE;
    31483110
    3149         /* enumerate the driver info list */
    3150         while (TRUE)
    3151         {
    3152             BOOL fRet = SetupDiEnumDriverInfo(hDeviceInfo, &DeviceInfoData, SPDIT_CLASSDRIVER, index, &DriverInfoData);
    3153 
    3154             /* if the function failed and GetLastError() returns
    3155              * ERROR_NO_MORE_ITEMS, then we have reached the end of the
    3156              * list.  Otherwise there was something wrong with this
    3157              * particular driver. */
    3158             if (!fRet)
     3111        /*
     3112         * Enumerate the driver info list.
     3113         */
     3114        /* For our purposes, 2k buffer is more than enough to obtain the
     3115           hardware ID of the VBoxNetAdp driver. */ /** @todo r=bird: The buffer isn't 2KB, it's 8KB, but whatever. */
     3116        DWORD           detailBuf[2048];
     3117        SP_DRVINFO_DATA DriverInfoData = { sizeof(DriverInfoData) };
     3118        bool            fFound         = false;
     3119        for (DWORD index = 0; !fFound; index++)
     3120        {
     3121            /* If the function fails with last error set to ERROR_NO_MORE_ITEMS,
     3122               then we have reached the end of the list.  Otherwise there was
     3123               something wrong with this particular driver. */
     3124            if (!SetupDiEnumDriverInfo(hDeviceInfo, &DeviceInfoData, SPDIT_CLASSDRIVER, index, &DriverInfoData))
    31593125            {
    31603126                if (GetLastError() == ERROR_NO_MORE_ITEMS)
    31613127                    break;
    3162                 index++;
    31633128                continue;
    31643129            }
    3165 
    3166             pDriverInfoDetail = (PSP_DRVINFO_DETAIL_DATA) detailBuf;
    3167             pDriverInfoDetail->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
    31683130
    31693131            /* if we successfully find the hardware ID and it turns out to
    31703132             * be the one for the loopback driver, then we are done. */
    3171             if (SetupDiGetDriverInfoDetail (hDeviceInfo,
     3133            PSP_DRVINFO_DETAIL_DATA_W pDriverInfoDetail = (PSP_DRVINFO_DETAIL_DATA_W)detailBuf;
     3134            pDriverInfoDetail->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
     3135            DWORD cbValue = 0;
     3136            if (SetupDiGetDriverInfoDetailW(hDeviceInfo,
    31723137                                            &DeviceInfoData,
    31733138                                            &DriverInfoData,
    31743139                                            pDriverInfoDetail,
    3175                                             sizeof (detailBuf),
    3176                                             NULL))
    3177             {
    3178                 TCHAR * t;
    3179 
    3180                 /* pDriverInfoDetail->HardwareID is a MULTISZ string.  Go through the
    3181                  * whole list and see if there is a match somewhere. */
    3182                 t = pDriverInfoDetail->HardwareID;
    3183                 while (t && *t && t < (TCHAR *) &detailBuf [RT_ELEMENTS(detailBuf)])
    3184                 {
    3185                     if (!_tcsicmp(t, DRIVERHWID))
     3140                                            sizeof(detailBuf) - sizeof(detailBuf[0]),
     3141                                            &cbValue))
     3142            {
     3143                /* Sure that the HardwareID string list is properly zero terminated (paranoia). */
     3144                detailBuf[RT_ELEMENTS(detailBuf) - 1] = 0; AssertCompile(sizeof(detailBuf[0]) == sizeof(WCHAR) * 2);
     3145
     3146                /* pDriverInfoDetail->HardwareID is a MULTISZ string.  Go through the whole
     3147                   list and see if there is a match somewhere: */
     3148                for (WCHAR *pwszCurHwId = pDriverInfoDetail->HardwareID;
     3149                     (uintptr_t)pwszCurHwId - (uintptr_t)pDriverInfoDetail < cbValue && *pwszCurHwId != L'\0';
     3150                     pwszCurHwId += RTUtf16Len(pwszCurHwId) + 1)
     3151                    if (RTUtf16ICmp(DRIVERHWID, pwszCurHwId) == 0)
     3152                    {
     3153                        fFound = true;
    31863154                        break;
    3187 
    3188                     t += _tcslen(t) + 1;
    3189                 }
    3190 
    3191                 if (t && *t && t < (TCHAR *) &detailBuf [RT_ELEMENTS(detailBuf)])
    3192                 {
    3193                     found = TRUE;
    3194                     break;
    3195                 }
    3196             }
    3197 
    3198             index ++;
    3199         }
    3200 
    3201         if (!found)
     3155                    }
     3156            }
     3157        }
     3158
     3159        if (!fFound)
    32023160            SetErrBreak(("Could not find Host Interface Networking driver! Please reinstall"));
    32033161
    32043162        /* set the loopback driver to be the currently selected */
    3205         fResult = SetupDiSetSelectedDriver (hDeviceInfo, &DeviceInfoData,
    3206                                        &DriverInfoData);
    3207         if (!fResult)
    3208             SetErrBreak(("SetupDiSetSelectedDriver failed (0x%08X)",
    3209                          GetLastError()));
     3163        if (!SetupDiSetSelectedDriver(hDeviceInfo, &DeviceInfoData, &DriverInfoData))
     3164            SetErrBreak(("SetupDiSetSelectedDriver failed (%u)", GetLastError()));
    32103165
    32113166        /* register the phantom device to prepare for install */
    3212         fResult = SetupDiCallClassInstaller (DIF_REGISTERDEVICE, hDeviceInfo,
    3213                                              &DeviceInfoData);
    3214         if (!fResult)
    3215         {
    3216             DWORD err = GetLastError();
    3217             SetErrBreak (("SetupDiCallClassInstaller failed (0x%08X)",
    3218                           err));
    3219         }
     3167        if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, hDeviceInfo, &DeviceInfoData))
     3168            SetErrBreak(("SetupDiCallClassInstaller failed (%u)", GetLastError()));
    32203169
    32213170        /* registered, but remove if errors occur in the following code */
    3222         registered = TRUE;
     3171        fRegistered = TRUE;
    32233172
    32243173        /* ask the installer if we can install the device */
    3225         fResult = SetupDiCallClassInstaller (DIF_ALLOW_INSTALL, hDeviceInfo,
    3226                                              &DeviceInfoData);
    3227         if (!fResult)
     3174        if (!SetupDiCallClassInstaller(DIF_ALLOW_INSTALL, hDeviceInfo, &DeviceInfoData))
    32283175        {
    32293176            if (GetLastError() != ERROR_DI_DO_DEFAULT)
    3230                 SetErrBreak (("SetupDiCallClassInstaller (DIF_ALLOW_INSTALL) failed (0x%08X)",
    3231                               GetLastError()));
     3177                SetErrBreak(("SetupDiCallClassInstaller (DIF_ALLOW_INSTALL) failed (%u)", GetLastError()));
    32323178            /* that's fine */
    32333179        }
     
    32353181        /* get the device install parameters and disable filecopy */
    32363182        DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
    3237         fResult = SetupDiGetDeviceInstallParams (hDeviceInfo, &DeviceInfoData,
    3238                                                  &DeviceInstallParams);
    3239         if (fResult)
     3183        if (SetupDiGetDeviceInstallParams(hDeviceInfo, &DeviceInfoData, &DeviceInstallParams))
    32403184        {
    32413185            pQueueCallbackContext = SetupInitDefaultQueueCallback(NULL);
     
    32443188                DeviceInstallParams.InstallMsgHandlerContext = pQueueCallbackContext;
    32453189                DeviceInstallParams.InstallMsgHandler = (PSP_FILE_CALLBACK)vboxNetCfgWinPspFileCallback;
    3246                 fResult = SetupDiSetDeviceInstallParams (hDeviceInfo, &DeviceInfoData,
    3247                                                     &DeviceInstallParams);
    3248                 if (!fResult)
     3190                if (!SetupDiSetDeviceInstallParamsW(hDeviceInfo, &DeviceInfoData, &DeviceInstallParams))
    32493191                {
    32503192                    DWORD winEr = GetLastError();
    3251                     NonStandardLogFlow(("SetupDiSetDeviceInstallParams failed, winEr (%d)\n", winEr));
    3252                 }
    3253                 Assert(fResult);
     3193                    NonStandardLogFlow(("SetupDiSetDeviceInstallParamsW failed, winEr (%d)\n", winEr));
     3194                    Assert(0);
     3195                }
    32543196            }
    32553197            else
     
    32663208
    32673209        /* install the files first */
    3268         fResult = SetupDiCallClassInstaller (DIF_INSTALLDEVICEFILES, hDeviceInfo,
    3269                                         &DeviceInfoData);
    3270         if (!fResult)
    3271             SetErrBreak (("SetupDiCallClassInstaller (DIF_INSTALLDEVICEFILES) failed (0x%08X)",
    3272                           GetLastError()));
     3210        if (!SetupDiCallClassInstaller(DIF_INSTALLDEVICEFILES, hDeviceInfo, &DeviceInfoData))
     3211            SetErrBreak(("SetupDiCallClassInstaller (DIF_INSTALLDEVICEFILES) failed (%Rwc)", GetLastError()));
     3212
    32733213        /* get the device install parameters and disable filecopy */
    32743214        DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
    3275         fResult = SetupDiGetDeviceInstallParams (hDeviceInfo, &DeviceInfoData,
    3276                                             &DeviceInstallParams);
    3277         if (fResult)
     3215        if (SetupDiGetDeviceInstallParams(hDeviceInfo, &DeviceInfoData, &DeviceInstallParams))
    32783216        {
    32793217            DeviceInstallParams.Flags |= DI_NOFILECOPY;
    3280             fResult = SetupDiSetDeviceInstallParams(hDeviceInfo, &DeviceInfoData,
    3281                                                     &DeviceInstallParams);
    3282             if (!fResult)
    3283                 SetErrBreak (("SetupDiSetDeviceInstallParams failed (0x%08X)",
    3284                               GetLastError()));
    3285         }
     3218            if (!SetupDiSetDeviceInstallParamsW(hDeviceInfo, &DeviceInfoData, &DeviceInstallParams))
     3219                SetErrBreak(("SetupDiSetDeviceInstallParamsW failed (%Rwc)", GetLastError()));
     3220        }
     3221        /** @todo r=bird: Why isn't SetupDiGetDeviceInstallParams failure fatal here? */
    32863222
    32873223        /*
    32883224         * Register any device-specific co-installers for this device,
    32893225         */
    3290         fResult = SetupDiCallClassInstaller(DIF_REGISTER_COINSTALLERS,
    3291                                             hDeviceInfo,
    3292                                             &DeviceInfoData);
    3293         if (!fResult)
    3294             SetErrBreak (("SetupDiCallClassInstaller (DIF_REGISTER_COINSTALLERS) failed (0x%08X)",
    3295                           GetLastError()));
     3226        if (!SetupDiCallClassInstaller(DIF_REGISTER_COINSTALLERS, hDeviceInfo, &DeviceInfoData))
     3227            SetErrBreak(("SetupDiCallClassInstaller (DIF_REGISTER_COINSTALLERS) failed (%Rwc)", GetLastError()));
    32963228
    32973229        /*
     
    32993231         * and then do the real install
    33003232         */
    3301         fResult = SetupDiCallClassInstaller(DIF_INSTALLINTERFACES,
    3302                                             hDeviceInfo,
    3303                                             &DeviceInfoData);
    3304         if (!fResult)
    3305             SetErrBreak (("SetupDiCallClassInstaller (DIF_INSTALLINTERFACES) failed (0x%08X)",
    3306                           GetLastError()));
    3307 
    3308         fResult = SetupDiCallClassInstaller(DIF_INSTALLDEVICE,
    3309                                             hDeviceInfo,
    3310                                             &DeviceInfoData);
    3311         if (!fResult)
    3312             SetErrBreak (("SetupDiCallClassInstaller (DIF_INSTALLDEVICE) failed (0x%08X)",
    3313                           GetLastError()));
    3314 
    3315         /* Query the instance ID; on Windows 10, the registry key may take a short
     3233        if (!SetupDiCallClassInstaller(DIF_INSTALLINTERFACES, hDeviceInfo, &DeviceInfoData))
     3234            SetErrBreak(("SetupDiCallClassInstaller (DIF_INSTALLINTERFACES) failed (%Rwc)", GetLastError()));
     3235
     3236        if (!SetupDiCallClassInstaller(DIF_INSTALLDEVICE, hDeviceInfo, &DeviceInfoData))
     3237            SetErrBreak(("SetupDiCallClassInstaller (DIF_INSTALLDEVICE) failed (%Rwc)", GetLastError()));
     3238
     3239        /*
     3240         * Query the instance ID; on Windows 10, the registry key may take a short
    33163241         * while to appear. Microsoft recommends waiting for up to 5 seconds, but
    33173242         * we want to be on the safe side, so let's wait for 20 seconds. Waiting
     
    33243249
    33253250            /* Figure out NetCfgInstanceId */
    3326             hkey = SetupDiOpenDevRegKey(hDeviceInfo,
    3327                                         &DeviceInfoData,
    3328                                         DICS_FLAG_GLOBAL,
    3329                                         0,
    3330                                         DIREG_DRV,
    3331                                         KEY_READ);
     3251            hkey = SetupDiOpenDevRegKey(hDeviceInfo, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ);
    33323252            if (hkey == INVALID_HANDLE_VALUE)
    33333253                break;
    33343254
    3335             cbSize = sizeof(pWCfgGuidString);
    3336             ret = RegQueryValueExW (hkey, L"NetCfgInstanceId", NULL,
    3337                                    &dwValueType, (LPBYTE) pWCfgGuidString, &cbSize);
     3255            DWORD cbSize       = sizeof(wszCfgGuidString);
     3256            DWORD dwValueType = 0;
     3257            lrcRet = RegQueryValueExW(hkey, L"NetCfgInstanceId", NULL, &dwValueType, (LPBYTE)wszCfgGuidString, &cbSize);
    33383258            /* As long as the return code is FILE_NOT_FOUND, sleep and retry. */
    3339             if (ret != ERROR_FILE_NOT_FOUND)
     3259            if (lrcRet != ERROR_FILE_NOT_FOUND)
    33403260                break;
    33413261
    3342             RegCloseKey (hkey);
     3262            RegCloseKey(hkey);
    33433263            hkey = (HKEY)INVALID_HANDLE_VALUE;
    33443264        }
    33453265
    3346         if (ret == ERROR_FILE_NOT_FOUND)
     3266        if (lrcRet == ERROR_FILE_NOT_FOUND)
    33473267        {
    33483268            hrc = E_ABORT;
     
    33513271
    33523272        /*
    3353          * We need to check 'hkey' after we check 'ret' to distinguish the case
     3273         * We need to check 'hkey' after we check 'lrcRet' to distinguish the case
    33543274         * of failed SetupDiOpenDevRegKey from the case when we timed out.
    33553275         */
    33563276        if (hkey == INVALID_HANDLE_VALUE)
    3357             SetErrBreak(("SetupDiOpenDevRegKey failed (0x%08X)", GetLastError()));
    3358 
    3359         if (ret != ERROR_SUCCESS)
    3360             SetErrBreak(("Querying NetCfgInstanceId failed (0x%08X)", ret));
     3277            SetErrBreak(("SetupDiOpenDevRegKey failed (%Rwc)", GetLastError()));
     3278
     3279        if (lrcRet != ERROR_SUCCESS)
     3280            SetErrBreak(("Querying NetCfgInstanceId failed (%Rwc)", lrcRet));
    33613281
    33623282        NET_LUID luid;
    3363         HRESULT hSMRes = vboxNetCfgWinGetInterfaceLUID(hkey, &luid);
     3283        HRESULT hrcSMRes = vboxNetCfgWinGetInterfaceLUID(hkey, &luid);
    33643284
    33653285        /* Close the key as soon as possible. See @bugref{7973}. */
    3366         RegCloseKey (hkey);
     3286        RegCloseKey(hkey);
    33673287        hkey = (HKEY)INVALID_HANDLE_VALUE;
    33683288
    3369         if (FAILED(hSMRes))
     3289        if (FAILED(hrcSMRes))
    33703290        {
    33713291            /*
    3372             The setting of Metric is not very important functionality,
    3373             So we will not break installation process due to this error.
    3374             */
    3375             NonStandardLogFlow(("vboxNetCfgWinCreateHostOnlyNetworkInterface Warning! "
    3376                                 "vboxNetCfgWinGetInterfaceLUID failed, default metric "
    3377                                 "for new interface will not be set, hr (0x%x)\n", hSMRes));
     3292             * The setting of Metric is not very important functionality,
     3293             * So we will not break installation process due to this error.
     3294             */
     3295            NonStandardLogFlow(("vboxNetCfgWinCreateHostOnlyNetworkInterface: Warning! "
     3296                                "vboxNetCfgWinGetInterfaceLUID failed, default metric for new interface will not be set: %Rhrc\n",
     3297                                hrcSMRes));
    33783298        }
    33793299        else
    33803300        {
    33813301            /*
    3382              *   Set default metric value of interface to fix multicast issue
    3383              *   See @bugref{6379} for details.
     3302             * Set default metric value of interface to fix multicast issue
     3303             * See @bugref{6379} for details.
    33843304             */
    3385             hSMRes = vboxNetCfgWinSetupMetric(&luid);
    3386             if (FAILED(hSMRes))
     3305            hrcSMRes = vboxNetCfgWinSetupMetric(&luid);
     3306            if (FAILED(hrcSMRes))
    33873307            {
    33883308                /*
    3389                  *   The setting of Metric is not very important functionality,
    3390                  *   So we will not break installation process due to this error.
     3309                 * The setting of Metric is not very important functionality,
     3310                 * So we will not break installation process due to this error.
    33913311                 */
    3392                 NonStandardLogFlow(("vboxNetCfgWinCreateHostOnlyNetworkInterface Warning! "
    3393                                     "vboxNetCfgWinSetupMetric failed, default metric "
    3394                                     "for new interface will not be set, hr (0x%x)\n", hSMRes));
    3395             }
    3396         }
    3397 
     3312                NonStandardLogFlow(("vboxNetCfgWinCreateHostOnlyNetworkInterface: Warning! "
     3313                                    "vboxNetCfgWinSetupMetric failed, default metric for new interface will not be set: %Rhrc\n",
     3314                                    hrcSMRes));
     3315            }
     3316        }
    33983317
    33993318        /*
     
    34043323                                               SPDRP_FRIENDLYNAME , /* IN DWORD Property,*/
    34053324                                               NULL, /*OUT PDWORD PropertyRegDataType, OPTIONAL*/
    3406                                                (PBYTE)DevName, /*OUT PBYTE PropertyBuffer,*/
    3407                                                sizeof(DevName), /* IN DWORD PropertyBufferSize,*/
    3408                                                NULL /*OUT PDWORD RequiredSize OPTIONAL*/))
    3409         {
    3410             int err = GetLastError();
    3411             if (err != ERROR_INVALID_DATA)
    3412             {
    3413                 SetErrBreak (("SetupDiGetDeviceRegistryProperty failed (0x%08X)",
    3414                               err));
    3415             }
    3416 
     3325                                               (PBYTE)wszDevName, /*OUT PBYTE PropertyBuffer,*/
     3326                                               sizeof(wszDevName) - sizeof(WCHAR), /* IN DWORD PropertyBufferSize,*/
     3327                                               NULL /*OUT PDWORD RequiredSize OPTIONAL*/ ))
     3328        {
     3329            DWORD dwErr = GetLastError();
     3330            if (dwErr != ERROR_INVALID_DATA)
     3331                SetErrBreak(("SetupDiGetDeviceRegistryProperty failed (%Rwc)", dwErr));
     3332
     3333            RT_ZERO(wszDevName);
    34173334            if (!SetupDiGetDeviceRegistryPropertyW(hDeviceInfo, &DeviceInfoData,
    3418                               SPDRP_DEVICEDESC, /* IN DWORD Property,*/
    3419                               NULL, /*OUT PDWORD PropertyRegDataType, OPTIONAL*/
    3420                               (PBYTE)DevName, /*OUT PBYTE PropertyBuffer,*/
    3421                               sizeof(DevName), /* IN DWORD PropertyBufferSize,*/
    3422                               NULL /*OUT PDWORD RequiredSize OPTIONAL*/
    3423                             ))
    3424             {
    3425                 err = GetLastError();
    3426                 SetErrBreak (("SetupDiGetDeviceRegistryProperty failed (0x%08X)",
    3427                                               err));
    3428             }
    3429         }
     3335                                                   SPDRP_DEVICEDESC, /* IN DWORD Property,*/
     3336                                                   NULL, /*OUT PDWORD PropertyRegDataType, OPTIONAL*/
     3337                                                   (PBYTE)wszDevName, /*OUT PBYTE PropertyBuffer,*/
     3338                                                   sizeof(wszDevName) - sizeof(WCHAR), /* IN DWORD PropertyBufferSize,*/
     3339                                                   NULL /*OUT PDWORD RequiredSize OPTIONAL*/ ))
     3340                SetErrBreak(("SetupDiGetDeviceRegistryProperty failed (%Rwc)", GetLastError()));
     3341        }
     3342
    34303343        /* No need to rename the device if the names match. */
    3431         if (!wcscmp(bstrNewInterfaceName.GetBSTR(), DevName))
    3432             bstrNewInterfaceName.Assign(NULL);
     3344        if (RTUtf16Cmp(bstrNewInterfaceName.raw(), wszDevName) == 0)
     3345            bstrNewInterfaceName.setNull();
     3346
    34333347#ifdef VBOXNETCFG_DELAYEDRENAME
    3434         /* Re-use DevName for device instance id retrieval. */
    3435         if (!SetupDiGetDeviceInstanceId(hDeviceInfo, &DeviceInfoData, DevName, RT_ELEMENTS(DevName), &cbSize))
    3436             SetErrBreak (("SetupDiGetDeviceInstanceId failed (0x%08X)",
    3437                           GetLastError()));
     3348        /* Re-use wszDevName for device instance id retrieval. */
     3349        DWORD cwcReturned = 0;
     3350        RT_ZERO(wszDevName);
     3351        if (!SetupDiGetDeviceInstanceIdW(hDeviceInfo, &DeviceInfoData, wszDevName, RT_ELEMENTS(wszDevName) - 1, &cwcReturned))
     3352            SetErrBreak(("SetupDiGetDeviceInstanceId failed (%Rwc)", GetLastError()));
    34383353#endif /* VBOXNETCFG_DELAYEDRENAME */
    3439     }
    3440     while (0);
     3354    } while (0);
    34413355
    34423356    /*
    3443      * cleanup
     3357     * Cleanup.
    34443358     */
    34453359    if (hkey != INVALID_HANDLE_VALUE)
    3446         RegCloseKey (hkey);
     3360        RegCloseKey(hkey);
    34473361
    34483362    if (pQueueCallbackContext)
     
    34523366    {
    34533367        /* an error has occurred, but the device is registered, we must remove it */
    3454         if (ret != 0 && registered)
     3368        if (lrcRet != ERROR_SUCCESS && fRegistered)
    34553369            SetupDiCallClassInstaller(DIF_REMOVE, hDeviceInfo, &DeviceInfoData);
    34563370
     
    34583372
    34593373        /* destroy the driver info list */
     3374#if 0
     3375        /* I've remove this, as I was consistently getting crashes in
     3376         * SetupDiDestroyDeviceInfoList otherwise during MSI installation
     3377         * (W10 build 19044, VBox r153431 + nocrt changes).
     3378         *
     3379         * Some details from windbg:
     3380         *
     3381         * (175e8.1596c): Access violation - code c0000005 (first chance)
     3382         * First chance exceptions are reported before any exception handling.
     3383         * This exception may be expected and handled.
     3384         * SETUPAPI!DereferenceClassDriverList+0x4e:
     3385         * 00007ffa`83e2a42a 834008ff        add     dword ptr [rax+8],0FFFFFFFFh ds:00000000`00000008=????????
     3386         * 0:006> k
     3387         *  # Child-SP          RetAddr           Call Site
     3388         * 00 0000007e`ccd7c070 00007ffa`83e2a287 SETUPAPI!DereferenceClassDriverList+0x4e
     3389         * 01 0000007e`ccd7c0a0 00007ffa`56b96bd3 SETUPAPI!SetupDiDestroyDriverInfoList+0x117
     3390         * 02 0000007e`ccd7c0f0 00007ffa`56b982a3 MSIF170!vboxNetCfgWinCreateHostOnlyNetworkInterface+0xb23 [E:\vbox\svn\trunk\src\VBox\HostDrivers\VBoxNetFlt\win\cfg\VBoxNetCfg.cpp @ 3378]
     3391         * 03 0000007e`ccd7ef10 00007ffa`56b92cb8 MSIF170!VBoxNetCfgWinCreateHostOnlyNetworkInterface+0x53 [E:\vbox\svn\trunk\src\VBox\HostDrivers\VBoxNetFlt\win\cfg\VBoxNetCfg.cpp @ 3479]
     3392         * 04 0000007e`ccd7efc0 00007ffa`610f59d3 MSIF170!_createHostOnlyInterface+0x218 [E:\vbox\svn\trunk\src\VBox\Installer\win\InstallHelper\VBoxInstallHelper.cpp @ 1453]
     3393         * 05 0000007e`ccd7f260 00007ffa`610d80ac msi!CallCustomDllEntrypoint+0x2b
     3394         * 06 0000007e`ccd7f2d0 00007ffa`84567034 msi!CMsiCustomAction::CustomActionThread+0x34c
     3395         * 07 0000007e`ccd7f8c0 00007ffa`849a2651 KERNEL32!BaseThreadInitThunk+0x14
     3396         * 08 0000007e`ccd7f8f0 00000000`00000000 ntdll!RtlUserThreadStart+0x21
     3397         * 0:006> r
     3398         * rax=0000000000000000 rbx=0000025f4f03af90 rcx=00007ffa83f23b40
     3399         * rdx=0000025f4f03af90 rsi=0000025f5108be50 rdi=0000025f4f066f10
     3400         * rip=00007ffa83e2a42a rsp=0000007eccd7c070 rbp=00007ffa83f23000
     3401         *  r8=0000007eccd7c0a8  r9=0000007eccd7c1f0 r10=0000000000000000
     3402         * r11=0000007eccd7c020 r12=0000007eccd7c3d0 r13=00007ffa83f23000
     3403         * r14=0000000000000000 r15=0000025f4f03af90
     3404         * iopl=0         nv up ei pl nz na po nc
     3405         * cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206
     3406         * SETUPAPI!DereferenceClassDriverList+0x4e:
     3407         * 00007ffa`83e2a42a 834008ff        add     dword ptr [rax+8],0FFFFFFFFh ds:00000000`00000008=????????
     3408         *
     3409         */
    34603410        if (destroyList)
    3461             SetupDiDestroyDriverInfoList(hDeviceInfo, &DeviceInfoData,
    3462                                          SPDIT_CLASSDRIVER);
     3411            SetupDiDestroyDriverInfoList(hDeviceInfo, &DeviceInfoData, SPDIT_CLASSDRIVER);
     3412#else
     3413        RT_NOREF(destroyList);
     3414#endif
     3415
    34633416        /* clean up the device info set */
    3464         SetupDiDestroyDeviceInfoList (hDeviceInfo);
    3465     }
    3466 
    3467     /* return the network connection GUID on success */
     3417        SetupDiDestroyDeviceInfoList(hDeviceInfo);
     3418    }
     3419
     3420    /*
     3421     * Return the network connection GUID on success.
     3422     */
    34683423    if (SUCCEEDED(hrc))
    34693424    {
    3470         HRESULT hr;
    3471         INetCfg *pNetCfg = NULL;
    3472         LPWSTR lpszApp = NULL;
    3473 
     3425        /** @todo r=bird: Some please explain this mess. It's not just returning a
     3426         *        GUID here, it's a bit more than that. */
    34743427        RENAMING_CONTEXT context;
    34753428        context.hr = E_FAIL;
     
    34773430        if (pGuid)
    34783431        {
    3479             hrc = CLSIDFromString(pWCfgGuidString, (LPCLSID)pGuid);
     3432            hrc = CLSIDFromString(wszCfgGuidString, (LPCLSID)pGuid);
    34803433            if (FAILED(hrc))
    34813434                NonStandardLogFlow(("CLSIDFromString failed, hrc (0x%x)\n", hrc));
    34823435        }
    34833436
    3484         hr = VBoxNetCfgWinQueryINetCfg(&pNetCfg, TRUE, L"VirtualBox Host-Only Creation",
    3485                                        30 * 1000, /* on Vista we often get 6to4svc.dll holding the lock, wait for 30 sec.  */
    3486                                        /** @todo special handling for 6to4svc.dll ???, i.e. several retrieves */
    3487                                        &lpszApp);
    3488         if (hr == S_OK)
    3489         {
    3490             if (!!bstrNewInterfaceName)
     3437        INetCfg *pNetCfg = NULL;
     3438        LPWSTR   pwszApp = NULL;
     3439        HRESULT hrc2 = VBoxNetCfgWinQueryINetCfg(&pNetCfg, TRUE, L"VirtualBox Host-Only Creation",
     3440                                                 30 * 1000, /* on Vista we often get 6to4svc.dll holding the lock, wait for 30 sec.  */
     3441                                                 /** @todo special handling for 6to4svc.dll ???, i.e. several retrieves */
     3442                                                 &pwszApp);
     3443        if (hrc2 == S_OK)
     3444        {
     3445            if (bstrNewInterfaceName.isNotEmpty())
    34913446            {
    34923447                /* The assigned name does not match the desired one, rename the device */
    3493                 context.bstrName = bstrNewInterfaceName.GetBSTR();
    3494                 context.pGuid = pGuid;
    3495                 hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3496                                                        &GUID_DEVCLASS_NET,
    3497                                                        vboxNetCfgWinRenameHostOnlyNetworkInterface,
    3498                                                        &context);
    3499             }
    3500             if (SUCCEEDED(hr))
    3501                 hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3502                                                        &GUID_DEVCLASS_NETSERVICE,
    3503                                                        vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
    3504                                                        pGuid);
    3505             if (SUCCEEDED(hr))
    3506                 hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3507                                                        &GUID_DEVCLASS_NETTRANS,
    3508                                                        vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
    3509                                                        pGuid);
    3510             if (SUCCEEDED(hr))
    3511                 hr = vboxNetCfgWinEnumNetCfgComponents(pNetCfg,
    3512                                                        &GUID_DEVCLASS_NETCLIENT,
    3513                                                        vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority,
    3514                                                        pGuid);
    3515             if (SUCCEEDED(hr))
    3516             {
    3517                 hr = pNetCfg->Apply();
    3518             }
     3448                context.bstrName = bstrNewInterfaceName.raw();
     3449                context.pGuid    = pGuid;
     3450                hrc2 = vboxNetCfgWinEnumNetCfgComponents(pNetCfg, &GUID_DEVCLASS_NET,
     3451                                                         vboxNetCfgWinRenameHostOnlyNetworkInterface, &context);
     3452            }
     3453            if (SUCCEEDED(hrc2))
     3454                hrc2 = vboxNetCfgWinEnumNetCfgComponents(pNetCfg, &GUID_DEVCLASS_NETSERVICE,
     3455                                                         vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority, pGuid);
     3456            if (SUCCEEDED(hrc2))
     3457                hrc2 = vboxNetCfgWinEnumNetCfgComponents(pNetCfg, &GUID_DEVCLASS_NETTRANS,
     3458                                                         vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority, pGuid);
     3459            if (SUCCEEDED(hrc2))
     3460                hrc2 = vboxNetCfgWinEnumNetCfgComponents(pNetCfg, &GUID_DEVCLASS_NETCLIENT,
     3461                                                         vboxNetCfgWinAdjustHostOnlyNetworkInterfacePriority, pGuid);
     3462            if (SUCCEEDED(hrc2))
     3463                hrc2 = pNetCfg->Apply();
    35193464            else
    3520                 NonStandardLogFlow(("Enumeration failed, hr 0x%x\n", hr));
     3465                NonStandardLogFlow(("Enumeration failed, hrc2=%Rhrc\n", hrc2));
     3466
    35213467            VBoxNetCfgWinReleaseINetCfg(pNetCfg, TRUE);
    35223468        }
    3523         else if (hr == NETCFG_E_NO_WRITE_LOCK && lpszApp)
    3524         {
    3525             NonStandardLogFlow(("Application %ws is holding the lock, failed\n", lpszApp));
    3526             CoTaskMemFree(lpszApp);
     3469        else if (hrc2 == NETCFG_E_NO_WRITE_LOCK && pwszApp)
     3470        {
     3471            NonStandardLogFlow(("Application '%ls' is holding the lock, failed\n", pwszApp));
     3472            CoTaskMemFree(pwszApp);
     3473            pwszApp = NULL;
    35273474        }
    35283475        else
    3529             NonStandardLogFlow(("VBoxNetCfgWinQueryINetCfg failed, hr 0x%x\n", hr));
     3476            NonStandardLogFlow(("VBoxNetCfgWinQueryINetCfg failed, hrc2=%Rhrc\n", hrc2));
    35303477
    35313478#ifndef VBOXNETCFG_DELAYEDRENAME
    3532         if (SUCCEEDED(hr) && SUCCEEDED(context.hr))
    3533         {
    3534             /* The device has been successfully renamed, replace the name now. */
    3535             wcscpy_s(DevName, RT_ELEMENTS(DevName), bstrDesiredName);
    3536         }
    3537 
    3538         WCHAR ConnectionName[128];
    3539         ULONG cbName = sizeof(ConnectionName);
    3540 
    3541         hr = VBoxNetCfgWinGenHostonlyConnectionName(DevName, ConnectionName, &cbName);
    3542         if (SUCCEEDED(hr))
    3543             hr = VBoxNetCfgWinRenameConnection(pWCfgGuidString, ConnectionName);
     3479        /* If the device has been successfully renamed, replace the name now. */
     3480        if (SUCCEEDED(hrc2) && SUCCEEDED(context.hr))
     3481            RTUtf16Copy(wszDevName, RT_ELEMENTS(wszDevName), pBstrDesiredName);
     3482
     3483        WCHAR wszConnectionName[128];
     3484        hrc2 = VBoxNetCfgWinGenHostonlyConnectionName(wszDevName, wszConnectionName, RT_ELEMENTS(wszConnectionName), NULL);
     3485        if (SUCCEEDED(hrc2))
     3486            hrc2 = VBoxNetCfgWinRenameConnection(wszCfgGuidString, wszConnectionName);
    35443487#endif
    3545         if (lppszName)
    3546         {
    3547             *lppszName = SysAllocString((const OLECHAR *) DevName);
    3548             if (!*lppszName)
     3488
     3489        /*
     3490         * Now, return the network connection GUID/name.
     3491         */
     3492        if (pBstrName)
     3493        {
     3494            *pBstrName = SysAllocString((const OLECHAR *)wszDevName);
     3495            if (!*pBstrName)
    35493496            {
    35503497                NonStandardLogFlow(("SysAllocString failed\n"));
    3551                 hrc = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    3552             }
    3553         }
    3554     }
    3555 
    3556     if (pErrMsg && bstrError.length())
    3557         *pErrMsg = bstrError.Detach();
    3558 
     3498                hrc = E_OUTOFMEMORY;
     3499            }
     3500        }
     3501    }
     3502
     3503    if (pBstrErrMsg)
     3504    {
     3505        *pBstrErrMsg = NULL;
     3506        if (bstrError.isNotEmpty())
     3507            bstrError.detachToEx(pBstrErrMsg);
     3508    }
    35593509    return hrc;
    35603510}
    35613511
    3562 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile, IN BSTR pwsDesiredName,
    3563                                                                         OUT GUID *pGuid, OUT BSTR *lppszName, OUT BSTR *pErrMsg)
    3564 {
    3565     HRESULT hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pwsDesiredName, pGuid, lppszName, pErrMsg);
     3512VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pwszInfPath, IN bool fIsInfPathFile,
     3513                                                                        IN BSTR pwszDesiredName, OUT GUID *pGuid,
     3514                                                                        OUT BSTR *pBstrName, OUT BSTR *pBstrErrMsg)
     3515{
     3516    HRESULT hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pwszInfPath, fIsInfPathFile, pwszDesiredName,
     3517                                                              pGuid, pBstrName, pBstrErrMsg);
    35663518    if (hrc == E_ABORT)
    35673519    {
    35683520        NonStandardLogFlow(("Timed out while waiting for NetCfgInstanceId, try again immediately...\n"));
     3521
    35693522        /*
    35703523         * This is the first time we fail to obtain NetCfgInstanceId, let us
     
    35753528         * See @bugref{7973} for details.
    35763529         */
    3577         hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pwsDesiredName, pGuid, lppszName, pErrMsg);
     3530        hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pwszInfPath, fIsInfPathFile, pwszDesiredName,
     3531                                                          pGuid, pBstrName, pBstrErrMsg);
    35783532        if (hrc == E_ABORT)
    35793533        {
    35803534            NonStandardLogFlow(("Timed out again while waiting for NetCfgInstanceId, try again after a while...\n"));
     3535
    35813536            /*
    35823537             * This is the second time we fail to obtain NetCfgInstanceId, let us
     
    35853540             * conditions. See @bugref{7973} for details.
    35863541             */
    3587 
    3588             SC_HANDLE hSCM = NULL;
    3589             SC_HANDLE hService = NULL;
    3590 
    3591             hSCM = OpenSCManager(NULL, NULL, GENERIC_READ);
     3542            SC_HANDLE hSCM = OpenSCManagerW(NULL, NULL, GENERIC_READ);
    35923543            if (hSCM)
    35933544            {
    3594                 hService = OpenService(hSCM, _T("NetSetupSvc"), GENERIC_READ);
     3545                SC_HANDLE hService = OpenServiceW(hSCM, L"NetSetupSvc", GENERIC_READ);
    35953546                if (hService)
    35963547                {
     
    35983549                        Sleep(1000);
    35993550                    CloseServiceHandle(hService);
    3600                     hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pInfPath, bIsInfPathFile, pwsDesiredName, pGuid, lppszName, pErrMsg);
     3551                    hrc = vboxNetCfgWinCreateHostOnlyNetworkInterface(pwszInfPath, fIsInfPathFile, pwszDesiredName,
     3552                                                                      pGuid, pBstrName, pBstrErrMsg);
    36013553                }
    36023554                else
    3603                     NonStandardLogFlow(("OpenService failed (0x%x)\n", GetLastError()));
     3555                    NonStandardLogFlow(("OpenService failed (%Rwc)\n", GetLastError()));
    36043556                CloseServiceHandle(hSCM);
    36053557            }
    36063558            else
    3607                 NonStandardLogFlow(("OpenSCManager failed (0x%x)", GetLastError()));
     3559                NonStandardLogFlow(("OpenSCManager failed (%Rwc)", GetLastError()));
     3560
    36083561            /* Give up and report the error. */
    36093562            if (hrc == E_ABORT)
    36103563            {
    3611                 if (pErrMsg)
    3612                 {
    3613                     bstr_t bstrError = bstr_printf("Querying NetCfgInstanceId failed (0x%08X)", ERROR_FILE_NOT_FOUND);
    3614                     *pErrMsg = bstrError.Detach();
     3564                if (pBstrErrMsg)
     3565                {
     3566                    com::Bstr bstrError;
     3567                    bstrError.printfNoThrow("Querying NetCfgInstanceId failed (ERROR_FILE_NOT_FOUND)");
     3568                    bstrError.detachToEx(pBstrErrMsg);
    36153569                }
    36163570                hrc = E_FAIL;
     
    36213575}
    36223576
    3623 
    3624 HRESULT vboxLoadIpHelpFunctions(HINSTANCE& pIpHlpInstance)
    3625 {
    3626     Assert(pIpHlpInstance != NULL);
    3627 
    3628     pIpHlpInstance = loadSystemDll("Iphlpapi.dll");
    3629     if (pIpHlpInstance == NULL)
    3630         return E_FAIL;
    3631 
    3632     g_pfnInitializeIpInterfaceEntry =
    3633         (PFNINITIALIZEIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "InitializeIpInterfaceEntry");
    3634     Assert(g_pfnInitializeIpInterfaceEntry);
    3635 
    3636     if (g_pfnInitializeIpInterfaceEntry)
    3637     {
    3638         g_pfnGetIpInterfaceEntry =
    3639             (PFNGETIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "GetIpInterfaceEntry");
    3640         Assert(g_pfnGetIpInterfaceEntry);
    3641     }
    3642 
    3643     if (g_pfnGetIpInterfaceEntry)
    3644     {
    3645         g_pfnSetIpInterfaceEntry =
    3646             (PFNSETIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "SetIpInterfaceEntry");
    3647         Assert(g_pfnSetIpInterfaceEntry);
    3648     }
    3649 
    3650     if (g_pfnInitializeIpInterfaceEntry == NULL)
    3651     {
    3652         FreeLibrary(pIpHlpInstance);
    3653         pIpHlpInstance = NULL;
    3654         return E_FAIL;
    3655     }
    3656 
    3657     return S_OK;
    3658 }
    3659 
    3660 
    3661 HRESULT vboxNetCfgWinGetLoopbackMetric(OUT int* Metric)
    3662 {
    3663     HRESULT rc = S_OK;
    3664     MIB_IPINTERFACE_ROW row;
    3665 
     3577static HRESULT vboxNetCfgWinGetLoopbackMetric(OUT DWORD *Metric)
     3578{
    36663579    Assert(g_pfnInitializeIpInterfaceEntry != NULL);
    36673580    Assert(g_pfnGetIpInterfaceEntry != NULL);
    36683581
     3582    MIB_IPINTERFACE_ROW row;
     3583    RT_ZERO(row); /* paranoia */
    36693584    g_pfnInitializeIpInterfaceEntry(&row);
     3585
    36703586    row.Family = AF_INET;
    36713587    row.InterfaceLuid.Info.IfType = IF_TYPE_SOFTWARE_LOOPBACK;
    36723588
    3673     rc = g_pfnGetIpInterfaceEntry(&row);
    3674     if (rc != NO_ERROR)
    3675         return HRESULT_FROM_WIN32(rc);
    3676 
    3677     *Metric = row.Metric;
    3678 
    3679     return rc;
    3680 }
    3681 
    3682 
    3683 HRESULT vboxNetCfgWinSetInterfaceMetric(
    3684     IN NET_LUID* pInterfaceLuid,
    3685     IN DWORD metric)
    3686 {
    3687     MIB_IPINTERFACE_ROW newRow;
    3688 
     3589    NETIO_STATUS dwErr = g_pfnGetIpInterfaceEntry(&row);
     3590    if (dwErr == NO_ERROR)
     3591    {
     3592        *Metric = row.Metric;
     3593        return S_OK;
     3594    }
     3595    return HRESULT_FROM_WIN32(dwErr);
     3596}
     3597
     3598static HRESULT vboxNetCfgWinSetInterfaceMetric(IN NET_LUID *pInterfaceLuid, IN DWORD metric)
     3599{
    36893600    Assert(g_pfnInitializeIpInterfaceEntry != NULL);
    36903601    Assert(g_pfnSetIpInterfaceEntry != NULL);
    36913602
     3603    MIB_IPINTERFACE_ROW newRow;
     3604    RT_ZERO(newRow); /* paranoia */
    36923605    g_pfnInitializeIpInterfaceEntry(&newRow);
     3606
    36933607    // identificate the interface to change
    36943608    newRow.InterfaceLuid = *pInterfaceLuid;
    36953609    newRow.Family = AF_INET;
     3610
    36963611    // changed settings
    36973612    newRow.UseAutomaticMetric = false;
     
    36993614
    37003615    // change settings
    3701     return HRESULT_FROM_WIN32(g_pfnSetIpInterfaceEntry(&newRow));
    3702 }
    3703 
    3704 
    3705 HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID* pLUID)
    3706 {
    3707     HRESULT res = S_OK;
    3708     DWORD luidIndex = 0;
    3709     DWORD ifType = 0;
    3710     DWORD cbSize = sizeof(luidIndex);
    3711     DWORD dwValueType = REG_DWORD;
    3712 
     3616    NETIO_STATUS dwErr = g_pfnSetIpInterfaceEntry(&newRow);
     3617    if (dwErr == NO_ERROR)
     3618        return S_OK;
     3619    return HRESULT_FROM_WIN32(dwErr);
     3620}
     3621
     3622static HRESULT vboxNetCfgWinSetupMetric(IN NET_LUID* pLuid)
     3623{
     3624    HRESULT  hrc  = E_FAIL;
     3625    HMODULE  hmod = loadSystemDll(L"Iphlpapi.dll");
     3626    if (hmod)
     3627    {
     3628        g_pfnInitializeIpInterfaceEntry = (PFNINITIALIZEIPINTERFACEENTRY)GetProcAddress(hmod, "InitializeIpInterfaceEntry");
     3629        g_pfnGetIpInterfaceEntry        = (PFNGETIPINTERFACEENTRY)       GetProcAddress(hmod, "GetIpInterfaceEntry");
     3630        g_pfnSetIpInterfaceEntry        = (PFNSETIPINTERFACEENTRY)       GetProcAddress(hmod, "SetIpInterfaceEntry");
     3631        Assert(g_pfnInitializeIpInterfaceEntry);
     3632        Assert(g_pfnGetIpInterfaceEntry);
     3633        Assert(g_pfnSetIpInterfaceEntry);
     3634
     3635        if (   g_pfnInitializeIpInterfaceEntry
     3636            && g_pfnGetIpInterfaceEntry
     3637            && g_pfnSetIpInterfaceEntry)
     3638        {
     3639            DWORD loopbackMetric = 0;
     3640            hrc = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
     3641            if (SUCCEEDED(hrc))
     3642                hrc = vboxNetCfgWinSetInterfaceMetric(pLuid, loopbackMetric - 1);
     3643        }
     3644
     3645        g_pfnInitializeIpInterfaceEntry = NULL;
     3646        g_pfnSetIpInterfaceEntry        = NULL;
     3647        g_pfnGetIpInterfaceEntry        = NULL;
     3648
     3649        FreeLibrary(hmod);
     3650    }
     3651    return hrc;
     3652}
     3653
     3654static HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID *pLUID)
     3655{
    37133656    if (pLUID == NULL)
    37143657        return E_INVALIDARG;
    37153658
    3716     res = RegQueryValueExW(hKey, L"NetLuidIndex", NULL,
    3717         &dwValueType, (LPBYTE)&luidIndex, &cbSize);
    3718     if (res != 0)
    3719         return HRESULT_FROM_WIN32(res);
    3720 
    3721     cbSize = sizeof(ifType);
    3722     dwValueType = REG_DWORD;
    3723     res = RegQueryValueExW(hKey, L"*IfType", NULL,
    3724         &dwValueType, (LPBYTE)&ifType, &cbSize);
    3725     if (res != 0)
    3726         return HRESULT_FROM_WIN32(res);
    3727 
    3728     ZeroMemory(pLUID, sizeof(NET_LUID));
    3729     pLUID->Info.IfType = ifType;
    3730     pLUID->Info.NetLuidIndex = luidIndex;
    3731 
    3732     return res;
    3733 }
    3734 
    3735 
    3736 HRESULT vboxNetCfgWinSetupMetric(IN NET_LUID* pLuid)
    3737 {
    3738     HINSTANCE hModule = NULL;
    3739     HRESULT rc = vboxLoadIpHelpFunctions(hModule);
    3740     if (SUCCEEDED(rc))
    3741     {
    3742         int loopbackMetric;
    3743         rc = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
    3744         if (SUCCEEDED(rc))
    3745             rc = vboxNetCfgWinSetInterfaceMetric(pLuid, loopbackMetric - 1);
    3746     }
    3747 
    3748     g_pfnInitializeIpInterfaceEntry = NULL;
    3749     g_pfnSetIpInterfaceEntry = NULL;
    3750     g_pfnGetIpInterfaceEntry = NULL;
    3751 
    3752     FreeLibrary(hModule);
    3753     return rc;
    3754 }
     3659    DWORD dwLuidIndex = 0;
     3660    DWORD cbSize      = sizeof(dwLuidIndex);
     3661    DWORD dwValueType = REG_DWORD; /** @todo r=bird: This is output only. No checked after the call. So, only for debugging? */
     3662    LSTATUS lrc = RegQueryValueExW(hKey, L"NetLuidIndex", NULL, &dwValueType, (LPBYTE)&dwLuidIndex, &cbSize);
     3663    if (lrc == ERROR_SUCCESS)
     3664    {
     3665        DWORD dwIfType = 0;
     3666        cbSize         = sizeof(dwIfType);
     3667        dwValueType    = REG_DWORD; /** @todo r=bird: This is output only. No checked after the call. So, only for debugging? */
     3668        lrc = RegQueryValueExW(hKey, L"*IfType", NULL, &dwValueType, (LPBYTE)&dwIfType, &cbSize);
     3669        if (lrc == ERROR_SUCCESS)
     3670        {
     3671            RT_ZERO(*pLUID);
     3672            pLUID->Info.IfType       = dwIfType;
     3673            pLUID->Info.NetLuidIndex = dwLuidIndex;
     3674            return S_OK;
     3675        }
     3676    }
     3677
     3678    RT_ZERO(*pLUID);
     3679    return HRESULT_FROM_WIN32(lrc);
     3680}
     3681
     3682
    37553683#ifdef VBOXNETCFG_DELAYEDRENAME
    37563684VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameHostOnlyConnection(IN const GUID *pGuid, IN LPCWSTR pwszId, OUT BSTR *pDevName)
    37573685{
    3758     HRESULT hr = S_OK;
    3759     WCHAR wszDevName[256];
    3760     WCHAR wszConnectionNewName[128];
    3761     ULONG cbName = sizeof(wszConnectionNewName);
    3762 
     3686    if (pDevName)
     3687        *pDevName = NULL;
     3688
     3689    HRESULT  hr = S_OK; /** @todo r=bird: ODD return status for SetupDiCreateDeviceInfoList failures! */
    37633690    HDEVINFO hDevInfo = SetupDiCreateDeviceInfoList(&GUID_DEVCLASS_NET, NULL);
    37643691    if (hDevInfo != INVALID_HANDLE_VALUE)
    37653692    {
    3766         SP_DEVINFO_DATA DevInfoData;
    3767 
    3768         DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
     3693        SP_DEVINFO_DATA DevInfoData = { sizeof(SP_DEVINFO_DATA) };
    37693694        if (SetupDiOpenDeviceInfo(hDevInfo, pwszId, NULL, 0, &DevInfoData))
    37703695        {
     3696            WCHAR wszDevName[256 + 1] = {0};
    37713697            DWORD err = ERROR_SUCCESS;
    3772             if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo, &DevInfoData,
    3773                                                    SPDRP_FRIENDLYNAME, NULL,
    3774                                                    (PBYTE)wszDevName, RT_ELEMENTS(wszDevName), NULL))
     3698            if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo, &DevInfoData, SPDRP_FRIENDLYNAME, NULL /*PropertyRegDataType*/,
     3699                                                   (PBYTE)wszDevName, sizeof(wszDevName) - sizeof(WCHAR) /*yes, bytes*/,
     3700                                                   NULL /*RequiredSize*/))
    37753701            {
    37763702                err = GetLastError();
    37773703                if (err == ERROR_INVALID_DATA)
    37783704                {
    3779                     err = SetupDiGetDeviceRegistryPropertyW(hDevInfo, &DevInfoData,
    3780                                                             SPDRP_DEVICEDESC, NULL,
    3781                                                             (PBYTE)wszDevName, RT_ELEMENTS(wszDevName), NULL)
    3782                         ? ERROR_SUCCESS
    3783                         : GetLastError();
     3705                    RT_ZERO(wszDevName);
     3706                    if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &DevInfoData, SPDRP_DEVICEDESC, NULL /*PropertyRegDataType*/,
     3707                                                          (PBYTE)wszDevName, sizeof(wszDevName) - sizeof(WCHAR) /*yes, bytes*/,
     3708                                                          NULL /*RequiredSize*/))
     3709                        err = ERROR_SUCCESS;
     3710                    else
     3711                        err = GetLastError();
    37843712                }
    37853713            }
    37863714            if (err == ERROR_SUCCESS)
    37873715            {
    3788                 hr = VBoxNetCfgWinGenHostonlyConnectionName(wszDevName, wszConnectionNewName, &cbName);
     3716                WCHAR wszConnectionNewName[128] = {0};
     3717                hr = VBoxNetCfgWinGenHostonlyConnectionName(wszDevName, wszConnectionNewName,
     3718                                                            RT_ELEMENTS(wszConnectionNewName), NULL);
    37893719                if (SUCCEEDED(hr))
    37903720                {
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/nobj/VBoxNetFltNobj.cpp

    r96407 r96572  
    22/** @file
    33 * VBoxNetFltNobj.cpp - Notify Object for Bridged Networking Driver.
     4 *
    45 * Used to filter Bridged Networking Driver bindings
    56 */
     7
    68/*
    79 * Copyright (C) 2011-2022 Oracle and/or its affiliates.
     
    3436 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
    3537 */
     38
     39
     40/*********************************************************************************************************************************
     41*   Header Files                                                                                                                 *
     42*********************************************************************************************************************************/
    3643#include "VBoxNetFltNobj.h"
    3744#include <iprt/win/ntddndis.h>
    38 #include <assert.h>
    39 #include <stdio.h>
     45#include <iprt/win/windows.h>
     46#include <winreg.h>
     47#include <Olectl.h>
    4048
    4149#include <VBoxNetFltNobjT_i.c>
    4250
    43 #include <Olectl.h>
    44 
     51#include <iprt/assert.h>
     52#include <iprt/utf16.h>
     53#include <iprt/string.h>
     54
     55
     56/*********************************************************************************************************************************
     57*   Defined Constants And Macros                                                                                                 *
     58*********************************************************************************************************************************/
    4559//# define VBOXNETFLTNOTIFY_DEBUG_BIND
    4660
    4761#ifdef DEBUG
    48 # define NonStandardAssert(a) assert(a)
    49 # define NonStandardAssertBreakpoint() assert(0)
     62# define NonStandardAssert(a)           Assert(a)
     63# define NonStandardAssertBreakpoint()  AssertFailed()
    5064#else
    5165# define NonStandardAssert(a) do{}while (0)
     
    5367#endif
    5468
    55 VBoxNetFltNobj::VBoxNetFltNobj() :
    56     mpNetCfg(NULL),
    57     mpNetCfgComponent(NULL),
    58     mbInstalling(FALSE)
     69
     70/*********************************************************************************************************************************
     71*   Global Variables                                                                                                             *
     72*********************************************************************************************************************************/
     73static HMODULE g_hModSelf = (HMODULE)~(uintptr_t)0;
     74
     75
     76VBoxNetFltNobj::VBoxNetFltNobj()
     77    : mpNetCfg(NULL)
     78    , mpNetCfgComponent(NULL)
     79    , mbInstalling(FALSE)
    5980{
    6081}
     
    126147static HRESULT vboxNetFltWinQueryInstanceKey(IN INetCfgComponent *pComponent, OUT PHKEY phKey)
    127148{
    128     LPWSTR pPnpId;
    129     HRESULT hr = pComponent->GetPnpDevNodeId(&pPnpId);
    130     if (hr == S_OK)
    131     {
    132         WCHAR KeyName[MAX_PATH];
    133         wcscpy(KeyName, L"SYSTEM\\CurrentControlSet\\Enum\\");
    134         wcscat(KeyName,pPnpId);
    135 
    136         LONG winEr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyName,
    137           0, /*__reserved DWORD ulOptions*/
    138           KEY_READ, /*__in REGSAM samDesired*/
    139           phKey);
    140 
    141         if (winEr != ERROR_SUCCESS)
    142         {
    143             hr = HRESULT_FROM_WIN32(winEr);
     149    LPWSTR pwszPnpId;
     150    HRESULT hrc = pComponent->GetPnpDevNodeId(&pwszPnpId);
     151    if (hrc == S_OK)
     152    {
     153        WCHAR wszKeyName[MAX_PATH];
     154        RTUtf16Copy(wszKeyName, MAX_PATH, L"SYSTEM\\CurrentControlSet\\Enum\\");
     155        int rc = RTUtf16Cat(wszKeyName, MAX_PATH, pwszPnpId);
     156        if (RT_SUCCESS(rc))
     157        {
     158            LSTATUS lrc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wszKeyName, 0 /*ulOptions*/, KEY_READ, phKey);
     159            if (lrc != ERROR_SUCCESS)
     160            {
     161                hrc = HRESULT_FROM_WIN32(lrc);
     162                NonStandardAssertBreakpoint();
     163            }
     164        }
     165        else
     166            AssertRCStmt(rc, hrc = ERROR_BUFFER_OVERFLOW);
     167
     168        CoTaskMemFree(pwszPnpId);
     169    }
     170    else
     171        NonStandardAssertBreakpoint();
     172    return hrc;
     173}
     174
     175static HRESULT vboxNetFltWinQueryDriverKey(IN HKEY InstanceKey, OUT PHKEY phKey)
     176{
     177    HRESULT hrc = S_OK;
     178
     179    WCHAR   wszValue[MAX_PATH];
     180    DWORD   cbValue = sizeof(wszValue) - sizeof(WCHAR);
     181    DWORD   dwType  = REG_SZ;
     182    LSTATUS lrc = RegQueryValueExW(InstanceKey, L"Driver", NULL /*lpReserved*/, &dwType, (LPBYTE)wszValue, &cbValue);
     183    if (lrc == ERROR_SUCCESS)
     184    {
     185        if (dwType == REG_SZ)
     186        {
     187            wszValue[RT_ELEMENTS(wszValue) - 1] = '\0'; /* registry strings does not need to be zero terminated. */
     188
     189            WCHAR wszKeyName[MAX_PATH];
     190            RTUtf16Copy(wszKeyName, MAX_PATH, L"SYSTEM\\CurrentControlSet\\Control\\Class\\");
     191            int rc = RTUtf16Cat(wszKeyName, MAX_PATH, wszValue);
     192            if (RT_SUCCESS(rc))
     193            {
     194                lrc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wszKeyName, 0 /*ulOptions*/, KEY_READ, phKey);
     195                if (lrc != ERROR_SUCCESS)
     196                {
     197                    hrc = HRESULT_FROM_WIN32(lrc);
     198                    NonStandardAssertBreakpoint();
     199                }
     200            }
     201            else
     202                AssertRCStmt(rc, hrc = ERROR_BUFFER_OVERFLOW);
     203        }
     204        else
     205        {
     206            hrc = HRESULT_FROM_WIN32(ERROR_DATATYPE_MISMATCH);
    144207            NonStandardAssertBreakpoint();
    145208        }
    146 
    147         CoTaskMemFree(pPnpId);
    148209    }
    149210    else
    150211    {
    151         NonStandardAssertBreakpoint();
    152     }
    153 
    154     return hr;
    155 }
    156 
    157 static HRESULT vboxNetFltWinQueryDriverKey(IN HKEY InstanceKey, OUT PHKEY phKey)
    158 {
    159     DWORD Type = REG_SZ;
    160     WCHAR Value[MAX_PATH];
    161     DWORD cbValue = sizeof(Value);
    162     HRESULT hr = S_OK;
    163     LONG winEr = RegQueryValueExW(InstanceKey,
    164             L"Driver", /*__in_opt LPCTSTR lpValueName*/
    165             0, /*__reserved LPDWORD lpReserved*/
    166             &Type, /*__out_opt LPDWORD lpType*/
    167             (LPBYTE)Value, /*__out_opt LPBYTE lpData*/
    168             &cbValue/*__inout_opt LPDWORD lpcbData*/
    169             );
    170 
    171     if (winEr == ERROR_SUCCESS)
    172     {
    173         WCHAR KeyName[MAX_PATH];
    174         wcscpy(KeyName, L"SYSTEM\\CurrentControlSet\\Control\\Class\\");
    175         wcscat(KeyName,Value);
    176 
    177         winEr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyName,
    178           0, /*__reserved DWORD ulOptions*/
    179           KEY_READ, /*__in REGSAM samDesired*/
    180           phKey);
    181 
    182         if (winEr != ERROR_SUCCESS)
    183         {
    184             hr = HRESULT_FROM_WIN32(winEr);
     212        hrc = HRESULT_FROM_WIN32(lrc);
     213        NonStandardAssertBreakpoint();
     214    }
     215
     216    return hrc;
     217}
     218
     219static HRESULT vboxNetFltWinQueryDriverKey(IN INetCfgComponent *pComponent, OUT PHKEY phKey)
     220{
     221    HKEY    hKeyInstance = NULL;
     222    HRESULT hrc = vboxNetFltWinQueryInstanceKey(pComponent, &hKeyInstance);
     223    if (hrc == S_OK)
     224    {
     225        hrc = vboxNetFltWinQueryDriverKey(hKeyInstance, phKey);
     226        if (hrc != S_OK)
    185227            NonStandardAssertBreakpoint();
    186         }
     228        RegCloseKey(hKeyInstance);
    187229    }
    188230    else
    189     {
    190         hr = HRESULT_FROM_WIN32(winEr);
    191         NonStandardAssertBreakpoint();
    192     }
    193 
    194     return hr;
    195 }
    196 
    197 static HRESULT vboxNetFltWinQueryDriverKey(IN INetCfgComponent *pComponent, OUT PHKEY phKey)
    198 {
    199     HKEY InstanceKey;
    200     HRESULT hr = vboxNetFltWinQueryInstanceKey(pComponent, &InstanceKey);
    201     if (hr == S_OK)
    202     {
    203         hr = vboxNetFltWinQueryDriverKey(InstanceKey, phKey);
    204         if (hr != S_OK)
    205         {
    206             NonStandardAssertBreakpoint();
    207         }
    208         RegCloseKey(InstanceKey);
     231        NonStandardAssertBreakpoint();
     232    return hrc;
     233}
     234
     235static HRESULT vboxNetFltWinNotifyCheckNetAdp(IN INetCfgComponent *pComponent, OUT bool *pfShouldBind)
     236{
     237    *pfShouldBind = false;
     238
     239    LPWSTR  pwszDevId = NULL;
     240    HRESULT hrc = pComponent->GetId(&pwszDevId);
     241    if (hrc == S_OK)
     242    {
     243        /** @todo r=bird: This was _wcsnicmp(pwszDevId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2))
     244         * which includes the terminator, so it translates to a full compare. Goes way back. */
     245        if (RTUtf16ICmpAscii(pwszDevId, "sun_VBoxNetAdp") == 0)
     246            *pfShouldBind = false;
     247        else
     248            hrc = S_FALSE;
     249        CoTaskMemFree(pwszDevId);
    209250    }
    210251    else
    211     {
    212         NonStandardAssertBreakpoint();
    213     }
    214 
    215     return hr;
    216 }
    217 
    218 static HRESULT vboxNetFltWinNotifyCheckNetAdp(IN INetCfgComponent *pComponent, OUT bool * pbShouldBind)
    219 {
    220     HRESULT hr;
    221     LPWSTR pDevId;
    222     hr = pComponent->GetId(&pDevId);
    223     if (hr == S_OK)
    224     {
    225         if (!_wcsnicmp(pDevId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2))
    226         {
    227             *pbShouldBind = false;
    228         }
    229         else
    230         {
    231             hr = S_FALSE;
    232         }
    233         CoTaskMemFree(pDevId);
    234     }
    235     else
    236     {
    237         NonStandardAssertBreakpoint();
    238     }
    239 
    240     return hr;
    241 }
    242 
    243 static HRESULT vboxNetFltWinNotifyCheckMsLoop(IN INetCfgComponent *pComponent, OUT bool * pbShouldBind)
    244 {
    245     HRESULT hr;
    246     LPWSTR pDevId;
    247     hr = pComponent->GetId(&pDevId);
    248     if (hr == S_OK)
    249     {
    250         if (!_wcsnicmp(pDevId, L"*msloop", sizeof(L"*msloop")/2))
     252        NonStandardAssertBreakpoint();
     253
     254    return hrc;
     255}
     256
     257static HRESULT vboxNetFltWinNotifyCheckMsLoop(IN INetCfgComponent *pComponent, OUT bool *pfShouldBind)
     258{
     259    *pfShouldBind = false;
     260
     261    LPWSTR  pwszDevId = NULL;
     262    HRESULT hrc = pComponent->GetId(&pwszDevId);
     263    if (hrc == S_OK)
     264    {
     265        /** @todo r=bird: This was _wcsnicmp(pwszDevId, L"*msloop", sizeof(L"*msloop")/2)
     266         * which includes the terminator, making it a full compare. Goes way back. */
     267        if (RTUtf16ICmpAscii(pwszDevId, "*msloop") == 0)
    251268        {
    252269            /* we need to detect the medium the adapter is presenting
    253270             * to do that we could examine in the registry the *msloop params */
    254             HKEY DriverKey;
    255             hr = vboxNetFltWinQueryDriverKey(pComponent, &DriverKey);
    256             if (hr == S_OK)
     271            HKEY hKeyDriver;
     272            hrc = vboxNetFltWinQueryDriverKey(pComponent, &hKeyDriver);
     273            if (hrc == S_OK)
    257274            {
    258                 DWORD Type = REG_SZ;
    259                 WCHAR Value[64]; /* 2 should be enough actually, paranoid check for extra spaces */
    260                 DWORD cbValue = sizeof(Value);
    261                 LONG winEr = RegQueryValueExW(DriverKey,
    262                             L"Medium", /*__in_opt LPCTSTR lpValueName*/
    263                             0, /*__reserved LPDWORD lpReserved*/
    264                             &Type, /*__out_opt LPDWORD lpType*/
    265                             (LPBYTE)Value, /*__out_opt LPBYTE lpData*/
    266                             &cbValue/*__inout_opt LPDWORD lpcbData*/
    267                             );
    268                 if (winEr == ERROR_SUCCESS)
     275                WCHAR wszValue[64]; /* 2 should be enough actually, paranoid check for extra spaces */
     276                DWORD cbValue = sizeof(wszValue) - sizeof(WCHAR);
     277                DWORD dwType  = REG_SZ;
     278                LSTATUS lrc = RegQueryValueExW(hKeyDriver, L"Medium", NULL /*lpReserved*/, &dwType, (LPBYTE)wszValue, &cbValue);
     279                if (lrc == ERROR_SUCCESS)
    269280                {
    270                     PWCHAR endPrt;
    271                     ULONG enmMedium = wcstoul(Value,
    272                        &endPrt,
    273                        0 /* base*/);
    274 
    275                     winEr = errno;
    276                     if (winEr == ERROR_SUCCESS)
     281                    if (dwType == REG_SZ)
    277282                    {
    278                         if (enmMedium == 0) /* 0 is Ethernet */
     283                        wszValue[RT_ELEMENTS(wszValue) - 1] = '\0';
     284
     285                        char szUtf8[256];
     286                        char *pszUtf8 = szUtf8;
     287                        RTUtf16ToUtf8Ex(wszValue, RTSTR_MAX, &pszUtf8, sizeof(szUtf8), NULL);
     288                        pszUtf8 = RTStrStrip(pszUtf8);
     289
     290                        uint64_t uValue = 0;
     291                        int rc = RTStrToUInt64Ex(pszUtf8, NULL, 0, &uValue);
     292                        if (RT_SUCCESS(rc))
    279293                        {
    280                             *pbShouldBind = true;
     294                            if (uValue == 0) /* 0 is Ethernet */
     295                                *pfShouldBind = true;
     296                            else
     297                                *pfShouldBind = false;
    281298                        }
    282299                        else
    283300                        {
    284                             *pbShouldBind = false;
     301                            NonStandardAssertBreakpoint();
     302                            *pfShouldBind = true;
    285303                        }
    286304                    }
    287305                    else
    288                     {
    289306                        NonStandardAssertBreakpoint();
    290                         *pbShouldBind = true;
    291                     }
    292307                }
    293308                else
     
    295310                    /** @todo we should check the default medium in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\<driver_id>\Ndi\Params\Medium, REG_SZ "Default" value */
    296311                    NonStandardAssertBreakpoint();
    297                     *pbShouldBind = true;
     312                    *pfShouldBind = true;
    298313                }
    299314
    300                 RegCloseKey(DriverKey);
     315                RegCloseKey(hKeyDriver);
    301316            }
    302317            else
     318                NonStandardAssertBreakpoint();
     319        }
     320        else
     321            hrc = S_FALSE;
     322        CoTaskMemFree(pwszDevId);
     323    }
     324    else
     325        NonStandardAssertBreakpoint();
     326    return hrc;
     327}
     328
     329static HRESULT vboxNetFltWinNotifyCheckLowerRange(IN INetCfgComponent *pComponent, OUT bool *pfShouldBind)
     330{
     331    *pfShouldBind = false;
     332
     333    HKEY    hKeyDriver = NULL;
     334    HRESULT hrc = vboxNetFltWinQueryDriverKey(pComponent, &hKeyDriver);
     335    if (hrc == S_OK)
     336    {
     337        HKEY    hKeyInterfaces = NULL;
     338        LSTATUS lrc = RegOpenKeyExW(hKeyDriver, L"Ndi\\Interfaces", 0 /*ulOptions*/, KEY_READ, &hKeyInterfaces);
     339        if (lrc == ERROR_SUCCESS)
     340        {
     341            WCHAR wszValue[MAX_PATH];
     342            DWORD cbValue = sizeof(wszValue) - sizeof(WCHAR);
     343            DWORD dwType  = REG_SZ;
     344            lrc = RegQueryValueExW(hKeyInterfaces, L"LowerRange", NULL /*lpReserved*/, &dwType, (LPBYTE)wszValue, &cbValue);
     345            if (lrc == ERROR_SUCCESS)
    303346            {
    304                 NonStandardAssertBreakpoint();
    305             }
    306         }
    307         else
    308         {
    309             hr = S_FALSE;
    310         }
    311         CoTaskMemFree(pDevId);
    312     }
    313     else
    314     {
    315         NonStandardAssertBreakpoint();
    316     }
    317 
    318     return hr;
    319 }
    320 
    321 static HRESULT vboxNetFltWinNotifyCheckLowerRange(IN INetCfgComponent *pComponent, OUT bool * pbShouldBind)
    322 {
    323     HKEY DriverKey;
    324     HKEY InterfacesKey;
    325     HRESULT hr = vboxNetFltWinQueryDriverKey(pComponent, &DriverKey);
    326     if (hr == S_OK)
    327     {
    328         LONG winEr = RegOpenKeyExW(DriverKey, L"Ndi\\Interfaces",
    329                         0, /*__reserved DWORD ulOptions*/
    330                         KEY_READ, /*__in REGSAM samDesired*/
    331                         &InterfacesKey);
    332         if (winEr == ERROR_SUCCESS)
    333         {
    334             DWORD Type = REG_SZ;
    335             WCHAR Value[MAX_PATH];
    336             DWORD cbValue = sizeof(Value);
    337             winEr = RegQueryValueExW(InterfacesKey,
    338                     L"LowerRange", /*__in_opt LPCTSTR lpValueName*/
    339                     0, /*__reserved LPDWORD lpReserved*/
    340                     &Type, /*__out_opt LPDWORD lpType*/
    341                     (LPBYTE)Value, /*__out_opt LPBYTE lpData*/
    342                     &cbValue/*__inout_opt LPDWORD lpcbData*/
    343                     );
    344             if (winEr == ERROR_SUCCESS)
    345             {
    346                 if (wcsstr(Value,L"ethernet") || wcsstr(Value, L"wan"))
     347                if (dwType == REG_SZ)
    347348                {
    348                     *pbShouldBind = true;
    349                 }
    350                 else
    351                 {
    352                     *pbShouldBind = false;
     349                    if (RTUtf16FindAscii(wszValue, "ethernet") >= 0 || RTUtf16FindAscii(wszValue, "wan") >= 0)
     350                        *pfShouldBind = true;
     351                    else
     352                        *pfShouldBind = false;
    353353                }
    354354            }
     
    356356            {
    357357                /* do not set err status to it */
    358                 *pbShouldBind = false;
     358                *pfShouldBind = false;
    359359                NonStandardAssertBreakpoint();
    360360            }
    361361
    362             RegCloseKey(InterfacesKey);
     362            RegCloseKey(hKeyInterfaces);
    363363        }
    364364        else
    365365        {
    366             hr = HRESULT_FROM_WIN32(winEr);
     366            hrc = HRESULT_FROM_WIN32(lrc);
    367367            NonStandardAssertBreakpoint();
    368368        }
    369369
    370         RegCloseKey(DriverKey);
     370        RegCloseKey(hKeyDriver);
    371371    }
    372372    else
    373     {
    374         NonStandardAssertBreakpoint();
    375     }
    376 
    377     return hr;
    378 }
    379 
    380 static HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgComponent *pComponent, OUT bool *pbShouldBind)
    381 {
    382     DWORD fCharacteristics;
    383     HRESULT hr;
    384 
    385     do
    386     {
    387         /* filter out only physical adapters */
    388         hr = pComponent->GetCharacteristics(&fCharacteristics);
    389         if (hr != S_OK)
    390         {
    391             NonStandardAssertBreakpoint();
    392             break;
    393         }
    394 
    395 
    396         if (fCharacteristics & NCF_HIDDEN)
    397         {
    398             /* we are not binding to hidden adapters */
    399             *pbShouldBind = false;
    400             break;
    401         }
    402 
    403         hr = vboxNetFltWinNotifyCheckMsLoop(pComponent, pbShouldBind);
    404         if (hr == S_OK)
    405         {
    406             /* this is a loopback adapter,
    407              * the pbShouldBind already contains the result */
    408             break;
    409         }
    410         else if (hr != S_FALSE)
    411         {
    412             /* error occurred */
    413             break;
    414         }
    415 
    416         hr = vboxNetFltWinNotifyCheckNetAdp(pComponent, pbShouldBind);
    417         if (hr == S_OK)
    418         {
    419             /* this is a VBoxNetAdp adapter,
    420              * the pbShouldBind already contains the result */
    421             break;
    422         }
    423         else if (hr != S_FALSE)
    424         {
    425             /* error occurred */
    426             break;
    427         }
    428 
    429         /* hr == S_FALSE means this is not a loopback adpater, set it to S_OK */
    430         hr = S_OK;
    431 
    432 //        if (!(fCharacteristics & NCF_PHYSICAL))
    433 //        {
    434 //            /* we are binding to physical adapters only */
    435 //            *pbShouldBind = false;
    436 //            break;
    437 //        }
    438 
    439         hr = vboxNetFltWinNotifyCheckLowerRange(pComponent, pbShouldBind);
    440         if (hr == S_OK)
    441         {
    442             /* the vboxNetFltWinNotifyCheckLowerRange ccucceeded,
    443              * the pbShouldBind already contains the result */
    444             break;
    445         }
    446         /* we are here because of the fail, nothing else to do */
    447     } while (0);
    448 
    449     return hr;
    450 }
    451 
    452 
    453 static HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgBindingInterface *pIf, OUT bool *pbShouldBind)
    454 {
    455     INetCfgComponent * pAdapterComponent;
    456     HRESULT hr = pIf->GetLowerComponent(&pAdapterComponent);
    457     if (hr == S_OK)
    458     {
    459         hr = vboxNetFltWinNotifyShouldBind(pAdapterComponent, pbShouldBind);
     373        NonStandardAssertBreakpoint();
     374    return hrc;
     375}
     376
     377static HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgComponent *pComponent, OUT bool *pfShouldBind)
     378{
     379    *pfShouldBind = false;
     380
     381    /* filter out only physical adapters */
     382    DWORD fCharacteristics = 0;
     383    HRESULT hrc = pComponent->GetCharacteristics(&fCharacteristics);
     384    if (hrc != S_OK)
     385    {
     386        NonStandardAssertBreakpoint();
     387        return hrc;
     388    }
     389
     390    /* we are not binding to hidden adapters */
     391    if (fCharacteristics & NCF_HIDDEN)
     392        return S_OK;
     393
     394    hrc = vboxNetFltWinNotifyCheckMsLoop(pComponent, pfShouldBind);
     395    if (   hrc == S_OK /* this is a loopback adapter, the pfShouldBind already contains the result */
     396        || hrc != S_FALSE /* error occurred */)
     397        return hrc;
     398
     399    hrc = vboxNetFltWinNotifyCheckNetAdp(pComponent, pfShouldBind);
     400    if (   hrc == S_OK /* this is a VBoxNetAdp adapter, the pfShouldBind already contains the result */
     401        || hrc != S_FALSE /* error occurred */)
     402        return hrc;
     403
     404    //if (!(fCharacteristics & NCF_PHYSICAL))
     405    //{
     406    //    *pfShouldBind = false; /* we are binding to physical adapters only */
     407    //    return S_OK;
     408    //}
     409
     410    return vboxNetFltWinNotifyCheckLowerRange(pComponent, pfShouldBind);
     411}
     412
     413
     414static HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgBindingInterface *pIf, OUT bool *pfShouldBind)
     415{
     416    INetCfgComponent *pAdapterComponent = NULL;
     417    HRESULT hrc = pIf->GetLowerComponent(&pAdapterComponent);
     418    if (hrc == S_OK)
     419    {
     420        hrc = vboxNetFltWinNotifyShouldBind(pAdapterComponent, pfShouldBind);
    460421
    461422        pAdapterComponent->Release();
     
    464425    {
    465426        NonStandardAssertBreakpoint();
    466     }
    467 
    468     return hr;
    469 }
    470 
    471 static HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgBindingPath *pPath, OUT bool *pbDoBind)
    472 {
    473     IEnumNetCfgBindingInterface *pEnumBindingIf;
    474     HRESULT hr = pPath->EnumBindingInterfaces(&pEnumBindingIf);
    475     if (hr == S_OK)
    476     {
    477         hr = pEnumBindingIf->Reset();
    478         if (hr == S_OK)
    479         {
    480             ULONG ulCount;
    481             INetCfgBindingInterface *pBindingIf;
    482             do
     427        *pfShouldBind = false;
     428    }
     429    return hrc;
     430}
     431
     432static HRESULT vboxNetFltWinNotifyShouldBind(IN INetCfgBindingPath *pPath, OUT bool *pfShouldBind)
     433{
     434    *pfShouldBind = false;
     435
     436    IEnumNetCfgBindingInterface *pIEnumBinding = NULL;
     437    HRESULT hrc = pPath->EnumBindingInterfaces(&pIEnumBinding);
     438    if (hrc == S_OK)
     439    {
     440        hrc = pIEnumBinding->Reset();
     441        if (hrc == S_OK)
     442        {
     443            for (;;)
    483444            {
    484                 hr = pEnumBindingIf->Next(1, &pBindingIf, &ulCount);
    485                 if (hr == S_OK)
     445                ULONG                    uCount    = 0;
     446                INetCfgBindingInterface *pIBinding = NULL;
     447                hrc = pIEnumBinding->Next(1, &pIBinding, &uCount);
     448                if (hrc == S_OK)
    486449                {
    487                     hr = vboxNetFltWinNotifyShouldBind(pBindingIf, pbDoBind);
    488 
    489                     pBindingIf->Release();
    490 
    491                     if (hr == S_OK)
    492                     {
    493                         if (!(*pbDoBind))
    494                         {
    495                             break;
    496                         }
    497                     }
    498                     else
    499                     {
    500                         /* break on failure */
     450                    hrc = vboxNetFltWinNotifyShouldBind(pIBinding, pfShouldBind);
     451                    pIBinding->Release();
     452
     453                    if (hrc != S_OK)
     454                        break; /* break on failure. */
     455                    if (!*pfShouldBind)
    501456                        break;
    502                     }
    503457                }
    504                 else if (hr == S_FALSE)
     458                else if (hrc == S_FALSE)
    505459                {
    506460                    /* no more elements */
    507                     hr = S_OK;
     461                    hrc = S_OK;
    508462                    break;
    509463                }
     
    514468                    break;
    515469                }
    516             } while (true);
     470            }
    517471        }
    518472        else
    519         {
    520473            NonStandardAssertBreakpoint();
    521         }
    522 
    523         pEnumBindingIf->Release();
     474
     475        pIEnumBinding->Release();
    524476    }
    525477    else
    526     {
    527         NonStandardAssertBreakpoint();
    528     }
    529 
    530     return hr;
     478        NonStandardAssertBreakpoint();
     479    return hrc;
    531480}
    532481
     
    536485    return VBOXNETFLTNOTIFY_DEBUG_BIND;
    537486#else
    538     bool bShouldBind;
    539     HRESULT hr = vboxNetFltWinNotifyShouldBind(pPath, &bShouldBind) ;
    540     if (hr != S_OK)
    541     {
    542         bShouldBind = VBOXNETFLTNOTIFY_ONFAIL_BINDDEFAULT;
    543     }
    544 
    545     return bShouldBind;
     487    bool fShouldBind;
     488    HRESULT hrc = vboxNetFltWinNotifyShouldBind(pPath, &fShouldBind);
     489    if (hrc != S_OK)
     490        fShouldBind = VBOXNETFLTNOTIFY_ONFAIL_BINDDEFAULT;
     491
     492    return fShouldBind;
    546493#endif
    547494}
     
    571518END_OBJECT_MAP()
    572519
     520
    573521extern "C"
    574522BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
     
    576524    if (dwReason == DLL_PROCESS_ATTACH)
    577525    {
     526        g_hModSelf = (HMODULE)hInstance;
     527
    578528        _Module.Init(ObjectMap, hInstance);
    579529        DisableThreadLibraryCalls(hInstance);
     
    586536}
    587537
    588 STDAPI DllCanUnloadNow()
    589 {
    590     return (_Module.GetLockCount() == 0) ? S_OK : S_FALSE;
    591 }
    592 
    593 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
     538STDAPI DllCanUnloadNow(void)
     539{
     540    return _Module.GetLockCount() == 0 ? S_OK : S_FALSE;
     541}
     542
     543STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
    594544{
    595545    return _Module.GetClassObject(rclsid, riid, ppv);
    596546}
     547
    597548
    598549/*
     
    602553 */
    603554
     555#ifdef RT_EXCEPTIONS_ENABLED
    604556/* Someday we may want to log errors. */
    605557class AdHocRegError
     
    608560    AdHocRegError(LSTATUS rc) { RT_NOREF1(rc); };
    609561};
    610 
    611 /* A simple wrapper on Windows registry functions. */
     562#endif
     563
     564/**
     565 * A simple wrapper on Windows registry functions.
     566 */
    612567class AdHocRegKey
    613568{
     
    617572    ~AdHocRegKey() { RegCloseKey(m_hKey); };
    618573
    619     AdHocRegKey *create(LPCWSTR pcwszSubkey, LPCWSTR pcwszDefaultValue = NULL);
    620     void remove(LPCWSTR pcwszSubkey);
    621     void setValue(LPCWSTR pcwszName, LPCWSTR pcwszValue);
     574    AdHocRegKey *create(LPCWSTR pcwszSubkey);
     575    LSTATUS setValue(LPCWSTR pcwszName, LPCWSTR pcwszValue);
    622576    HKEY getKey(void) { return m_hKey; };
    623577private:
     
    625579};
    626580
    627 AdHocRegKey::AdHocRegKey(LPCWSTR pcwszName, HKEY hParent)
     581AdHocRegKey::AdHocRegKey(LPCWSTR pcwszName, HKEY hParent) : m_hKey(NULL)
    628582{
    629583    LSTATUS rc = RegOpenKeyExW(hParent, pcwszName, 0, KEY_ALL_ACCESS, &m_hKey);
    630584    if (rc != ERROR_SUCCESS)
     585#ifdef RT_EXCEPTIONS_ENABLED
    631586        throw AdHocRegError(rc);
    632 }
    633 
    634 void AdHocRegKey::remove(LPCWSTR pcwszSubkey)
    635 {
    636     LSTATUS rc;
    637     WCHAR wszName[256];
    638     DWORD dwName;
    639 
    640     /* Remove all subkeys of subkey first */
    641     AdHocRegKey *subkey = new AdHocRegKey(pcwszSubkey, m_hKey);
    642     for (;;)
    643     {
    644         /* Always ask for the first subkey, because we remove it before calling RegEnumKeyEx again */
    645         dwName = 255;
    646         rc = RegEnumKeyExW(subkey->getKey(), 0, wszName, &dwName, NULL, NULL, NULL, NULL);
    647         if (rc != ERROR_SUCCESS)
    648             break;
    649         subkey->remove(wszName);
    650     }
    651     delete subkey;
    652 
    653     /* Remove the subkey itself */
    654     rc = RegDeleteKeyW(m_hKey, pcwszSubkey);
    655     if (rc != ERROR_SUCCESS)
    656         throw AdHocRegError(rc);
    657 }
    658 
    659 AdHocRegKey *AdHocRegKey::create(LPCWSTR pcwszSubkey, LPCWSTR pcwszDefaultValue)
     587#else
     588        m_hKey = NULL;
     589#endif
     590}
     591
     592AdHocRegKey *AdHocRegKey::create(LPCWSTR pcwszSubkey)
    660593{
    661594    HKEY hSubkey;
     
    664597                                 KEY_ALL_ACCESS, NULL /*pSecAttr*/, &hSubkey, NULL /*pdwDisposition*/);
    665598    if (rc != ERROR_SUCCESS)
     599#ifdef RT_EXCEPTIONS_ENABLED
    666600        throw AdHocRegError(rc);
     601#else
     602        return NULL;
     603#endif
    667604    AdHocRegKey *pSubkey = new AdHocRegKey(hSubkey);
    668     if (pcwszDefaultValue)
    669         pSubkey->setValue(NULL, pcwszDefaultValue);
     605    if (!pSubkey)
     606        RegCloseKey(hSubkey);
    670607    return pSubkey;
    671608}
    672609
    673 void AdHocRegKey::setValue(LPCWSTR pcwszName, LPCWSTR pcwszValue)
     610LSTATUS AdHocRegKey::setValue(LPCWSTR pcwszName, LPCWSTR pcwszValue)
    674611{
    675612    LSTATUS rc = RegSetValueExW(m_hKey, pcwszName, 0, REG_SZ, (const BYTE *)pcwszValue,
    676                                 (DWORD)((wcslen(pcwszValue) + 1) * sizeof(WCHAR)));
     613                                (DWORD)((RTUtf16Len(pcwszValue) + 1) * sizeof(WCHAR)));
     614#ifdef RT_EXCEPTIONS_ENABLED
    677615    if (rc != ERROR_SUCCESS)
    678616        throw AdHocRegError(rc);
    679 }
    680 
    681 /*
     617#endif
     618    return rc;
     619}
     620
     621/**
    682622 * Auxiliary class that facilitates automatic destruction of AdHocRegKey objects
    683623 * allocated in heap. No reference counting here!
     
    687627public:
    688628    AdHocRegKeyPtr(AdHocRegKey *pKey) : m_pKey(pKey) {};
    689     ~AdHocRegKeyPtr() { delete m_pKey; };
    690 
    691     AdHocRegKey *create(LPCWSTR pcwszSubkey, LPCWSTR pcwszDefaultValue = NULL)
    692         { return m_pKey->create(pcwszSubkey, pcwszDefaultValue); };
    693     void remove(LPCWSTR pcwszSubkey)
    694         { return m_pKey->remove(pcwszSubkey); };
    695     void setValue(LPCWSTR pcwszName, LPCWSTR pcwszValue)
    696         { return m_pKey->setValue(pcwszName, pcwszValue); };
     629    ~AdHocRegKeyPtr()
     630    {
     631        if (m_pKey)
     632        {
     633            delete m_pKey;
     634            m_pKey = NULL;
     635        }
     636    }
     637
     638    AdHocRegKey *create(LPCWSTR pcwszSubkey)
     639    { return m_pKey ? m_pKey->create(pcwszSubkey) : NULL; };
     640
     641    LSTATUS setValue(LPCWSTR pcwszName, LPCWSTR pcwszValue)
     642    { return m_pKey ? m_pKey->setValue(pcwszName, pcwszValue) : ERROR_INVALID_STATE; };
     643
    697644private:
    698645    AdHocRegKey *m_pKey;
     
    703650
    704651
    705 STDAPI DllRegisterServer()
    706 {
     652STDAPI DllRegisterServer(void)
     653{
     654    /* Get the path to the DLL we're running inside. */
    707655    WCHAR wszModule[MAX_PATH + 1];
    708     if (GetModuleFileNameW(GetModuleHandleW(L"VBoxNetFltNobj"), wszModule, MAX_PATH) == 0)
     656    UINT  cwcModule = GetModuleFileNameW(g_hModSelf, wszModule, MAX_PATH);
     657    if (cwcModule == 0 || cwcModule > MAX_PATH)
    709658        return SELFREG_E_CLASS;
    710 
    711     try {
     659    wszModule[MAX_PATH] = '\0';
     660
     661    /*
     662     * Create registry keys and values.  When exceptions are disabled, we depend
     663     * on setValue() to propagate fail key creation failures.
     664     */
     665#ifdef RT_EXCEPTIONS_ENABLED
     666    try
     667#endif
     668    {
    712669        AdHocRegKey keyCLSID(L"CLSID");
    713         AdHocRegKeyPtr pkeyNobjClass(keyCLSID.create(L"{f374d1a0-bf08-4bdc-9cb2-c15ddaeef955}",
    714                                                      L"VirtualBox Bridged Networking Driver Notify Object v1.1"));
    715         AdHocRegKeyPtr pkeyNobjSrv(pkeyNobjClass.create(L"InProcServer32", wszModule));
    716         pkeyNobjSrv.setValue(L"ThreadingModel", L"Both");
    717     }
    718     catch (AdHocRegError)
    719     {
    720         return SELFREG_E_CLASS;
    721     }
    722 
    723     try {
     670        AdHocRegKeyPtr pkeyNobjClass(keyCLSID.create(L"{f374d1a0-bf08-4bdc-9cb2-c15ddaeef955}"));
     671        LSTATUS lrc = pkeyNobjClass.setValue(NULL, L"VirtualBox Bridged Networking Driver Notify Object v1.1");
     672        if (lrc != ERROR_SUCCESS)
     673            return SELFREG_E_CLASS;
     674
     675        AdHocRegKeyPtr pkeyNobjSrv(pkeyNobjClass.create(L"InProcServer32"));
     676        lrc = pkeyNobjSrv.setValue(NULL, wszModule);
     677        if (lrc != ERROR_SUCCESS)
     678            return SELFREG_E_CLASS;
     679        lrc = pkeyNobjSrv.setValue(L"ThreadingModel", L"Both");
     680        if (lrc != ERROR_SUCCESS)
     681            return SELFREG_E_CLASS;
     682    }
     683#ifdef RT_EXCEPTIONS_ENABLED
     684    catch (AdHocRegError) { return SELFREG_E_CLASS; }
     685#endif
     686
     687#ifdef RT_EXCEPTIONS_ENABLED
     688    try
     689#endif
     690    {
    724691        AdHocRegKey keyTypeLib(L"TypeLib");
    725         AdHocRegKeyPtr pkeyNobjLib(keyTypeLib.create(L"{2A0C94D1-40E1-439C-8FE8-24107CAB0840}\\1.1",
    726                                                      L"VirtualBox Bridged Networking Driver Notify Object v1.1 Type Library"));
    727         AdHocRegKeyPtr pkeyNobjLib0(pkeyNobjLib.create(L"0\\win64", wszModule));
    728         AdHocRegKeyPtr pkeyNobjLibFlags(pkeyNobjLib.create(L"FLAGS", L"0"));
     692        AdHocRegKeyPtr pkeyNobjLib(keyTypeLib.create(L"{2A0C94D1-40E1-439C-8FE8-24107CAB0840}\\1.1"));
     693        LSTATUS lrc = pkeyNobjLib.setValue(NULL, L"VirtualBox Bridged Networking Driver Notify Object v1.1 Type Library");
     694        if (lrc != ERROR_SUCCESS)
     695            return SELFREG_E_TYPELIB;
     696
     697        AdHocRegKeyPtr pkeyNobjLib0(pkeyNobjLib.create(L"0\\win64"));
     698        lrc = pkeyNobjLib0.setValue(NULL, wszModule);
     699        if (lrc != ERROR_SUCCESS)
     700            return SELFREG_E_TYPELIB;
     701        AdHocRegKeyPtr pkeyNobjLibFlags(pkeyNobjLib.create(L"FLAGS"));
     702        lrc = pkeyNobjLibFlags.setValue(NULL, L"0");
     703        if (lrc != ERROR_SUCCESS)
     704            return SELFREG_E_TYPELIB;
     705
    729706        if (GetSystemDirectoryW(wszModule, MAX_PATH) == 0)
    730707            return SELFREG_E_TYPELIB;
    731         AdHocRegKeyPtr pkeyNobjLibHelpDir(pkeyNobjLib.create(L"HELPDIR", wszModule));
    732     }
    733     catch (AdHocRegError)
    734     {
    735         return SELFREG_E_CLASS;
    736     }
     708        AdHocRegKeyPtr pkeyNobjLibHelpDir(pkeyNobjLib.create(L"HELPDIR"));
     709        lrc = pkeyNobjLibHelpDir.setValue(NULL, wszModule);
     710        if (lrc != ERROR_SUCCESS)
     711            return SELFREG_E_TYPELIB;
     712    }
     713#ifdef RT_EXCEPTIONS_ENABLED
     714    catch (AdHocRegError) { return SELFREG_E_TYPELIB; }
     715#endif
    737716
    738717    return S_OK;
    739718}
    740719
    741 STDAPI DllUnregisterServer()
    742 {
    743     try {
    744         AdHocRegKey keyTypeLib(L"TypeLib");
    745         keyTypeLib.remove(L"{2A0C94D1-40E1-439C-8FE8-24107CAB0840}");
    746     }
    747     catch (AdHocRegError) { return SELFREG_E_TYPELIB; }
    748 
    749     try {
    750         AdHocRegKey keyCLSID(L"CLSID");
    751         keyCLSID.remove(L"{f374d1a0-bf08-4bdc-9cb2-c15ddaeef955}");
    752     }
    753     catch (AdHocRegError) { return SELFREG_E_CLASS; }
     720
     721STDAPI DllUnregisterServer(void)
     722{
     723    static struct { HKEY hKeyRoot; wchar_t const *pwszParentKey; wchar_t const *pwszKeyToDelete; HRESULT hrcFail; }
     724    s_aKeys[] =
     725    {
     726        { HKEY_CLASSES_ROOT, L"TypeLib", L"{2A0C94D1-40E1-439C-8FE8-24107CAB0840}", SELFREG_E_TYPELIB },
     727        { HKEY_CLASSES_ROOT, L"CLSID",   L"{f374d1a0-bf08-4bdc-9cb2-c15ddaeef955}", SELFREG_E_CLASS },
     728    };
     729
     730    HRESULT hrc = S_OK;
     731    for (size_t i = 0; i < RT_ELEMENTS(s_aKeys); i++)
     732    {
     733        HKEY hKey = NULL;
     734        LSTATUS lrc = RegOpenKeyExW(s_aKeys[i].hKeyRoot, s_aKeys[i].pwszParentKey, 0, KEY_ALL_ACCESS, &hKey);
     735        if (lrc == ERROR_SUCCESS)
     736        {
     737            lrc = RegDeleteTreeW(hKey, s_aKeys[i].pwszKeyToDelete); /* Vista and later */
     738            RegCloseKey(hKey);
     739        }
     740
     741        if (lrc != ERROR_SUCCESS && lrc != ERROR_FILE_NOT_FOUND && hrc == S_OK)
     742            hrc = s_aKeys[i].hrcFail;
     743    }
    754744
    755745    return S_OK;
    756746}
     747
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/nobj/VBoxNetFltNobj.h

    r96407 r96572  
    5353 * Needed to make our driver bind to "real" host adapters only
    5454 */
    55 class ATL_NO_VTABLE VBoxNetFltNobj :
    56     public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>,
    57     public ATL::CComCoClass<VBoxNetFltNobj, &CLSID_VBoxNetFltNobj>,
    58     public INetCfgComponentControl,
    59     public INetCfgComponentNotifyBinding
     55class ATL_NO_VTABLE VBoxNetFltNobj
     56    : public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>
     57    , public ATL::CComCoClass<VBoxNetFltNobj, &CLSID_VBoxNetFltNobj>
     58    , public INetCfgComponentControl
     59    , public INetCfgComponentNotifyBinding
    6060{
    6161public:
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetAdpInstall.cpp

    r96407 r96572  
    4141#include <VBox/VBoxNetCfg-win.h>
    4242#include <VBox/VBoxDrvCfg-win.h>
    43 #include <stdio.h>
    4443#include <devguid.h>
     44
     45#include <iprt/initterm.h>
     46#include <iprt/message.h>
     47#include <iprt/process.h>
     48#include <iprt/stream.h>
    4549
    4650
     
    6064static DECLCALLBACK(void) winNetCfgLogger(const char *pszString)
    6165{
    62     printf("%s\n", pszString);
     66    RTMsgInfo("%s", pszString);
    6367}
    6468
     
    109113static int VBoxNetAdpInstall(void)
    110114{
    111     VBoxNetCfgWinSetLogging(winNetCfgLogger);
    112 
    113     HRESULT hr = CoInitialize(NULL);
    114     if (SUCCEEDED(hr))
    115     {
    116         wprintf(L"adding host-only interface..\n");
    117 
     115    RTMsgInfo("Adding host-only interface...");
     116    VBoxNetCfgWinSetLogging(winNetCfgLogger);
     117
     118    HRESULT hr = CoInitialize(NULL);
     119    if (SUCCEEDED(hr))
     120    {
    118121        WCHAR wszInfFile[MAX_PATH];
    119122        DWORD cwcInfFile = MyGetfullPathNameW(VBOX_NETADP_INF, RT_ELEMENTS(wszInfFile), wszInfFile);
     
    129132
    130133                if (hr == S_OK)
    131                     wprintf(L"installed successfully\n");
     134                    RTMsgInfo("Installed successfully!");
    132135                else
    133                     wprintf(L"error installing VBoxNetAdp (%#lx)\n", hr);
     136                    RTMsgError("failed to install VBoxNetAdp: %Rhrc", hr);
    134137
    135138                VBoxNetCfgWinReleaseINetCfg(pnc, TRUE);
    136139            }
    137140            else
    138                 wprintf(L"VBoxNetCfgWinQueryINetCfg failed: hr=%#lx\n", hr);
     141                RTMsgError("VBoxNetCfgWinQueryINetCfg failed: %Rhrc", hr);
    139142            /*
    140143            hr = VBoxDrvCfgInfInstall(MpInf);
     
    171174        {
    172175            DWORD dwErr = GetLastError();
    173             wprintf(L"GetFullPathNameW failed: winEr = %lu\n", dwErr);
     176            RTMsgError("MyGetfullPathNameW failed: %Rwc", dwErr);
    174177            hr = HRESULT_FROM_WIN32(dwErr);
    175178        }
     
    177180    }
    178181    else
    179         wprintf(L"Error initializing COM (%#lx)\n", hr);
     182        RTMsgError("Failed initializing COM: %Rhrc", hr);
    180183
    181184    VBoxNetCfgWinSetLogging(NULL);
     
    186189static int VBoxNetAdpUninstall(void)
    187190{
    188     VBoxNetCfgWinSetLogging(winNetCfgLogger);
    189 
    190     printf("uninstalling all host-only interfaces..\n");
     191    RTMsgInfo("Uninstalling all host-only interfaces...");
     192    VBoxNetCfgWinSetLogging(winNetCfgLogger);
    191193
    192194    HRESULT hr = CoInitialize(NULL);
     
    198200            hr = VBoxDrvCfgInfUninstallAllSetupDi(&GUID_DEVCLASS_NET, L"Net", VBOX_NETADP_HWID, 0/* could be SUOI_FORCEDELETE */);
    199201            if (SUCCEEDED(hr))
    200                 printf("uninstallation successful\n");
     202                RTMsgInfo("Uninstallation successful!");
    201203            else
    202                 printf("uninstalled successfully, but failed to remove infs\n");
    203         }
    204         else
    205             printf("uninstall failed, hr=%#lx\n", hr);
    206         CoUninitialize();
    207     }
    208     else
    209         printf("Error initializing COM (%#lx)\n", hr);
     204                RTMsgWarning("uninstalled successfully, but failed to remove infs (%Rhrc)\n", hr);
     205        }
     206        else
     207            RTMsgError("uninstall failed: %Rhrc", hr);
     208        CoUninitialize();
     209    }
     210    else
     211        RTMsgError("Failed initializing COM: %Rhrc", hr);
    210212
    211213    VBoxNetCfgWinSetLogging(NULL);
     
    216218static int VBoxNetAdpUpdate(void)
    217219{
    218     VBoxNetCfgWinSetLogging(winNetCfgLogger);
    219 
    220     printf("uninstalling all host-only interfaces..\n");
     220    RTMsgInfo("Uninstalling all host-only interfaces...");
     221    VBoxNetCfgWinSetLogging(winNetCfgLogger);
    221222
    222223    HRESULT hr = CoInitialize(NULL);
     
    235236        {
    236237            if (fRebootRequired)
    237                 printf("!!REBOOT REQUIRED!!\n");
    238             printf("updated successfully\n");
    239         }
    240         else
    241             printf("update failed, hr=%#lx\n", hr);
    242 
    243         CoUninitialize();
    244     }
    245     else
    246         printf("Error initializing COM (%#lx)\n", hr);
     238                RTMsgWarning("!!REBOOT REQUIRED!!");
     239            RTMsgInfo("Updated successfully!");
     240        }
     241        else
     242            RTMsgError("update failed: %Rhrc", hr);
     243
     244        CoUninitialize();
     245    }
     246    else
     247        RTMsgError("Failed initializing COM: %Rhrc", hr);
    247248
    248249    VBoxNetCfgWinSetLogging(NULL);
     
    253254static int VBoxNetAdpDisable(void)
    254255{
    255     VBoxNetCfgWinSetLogging(winNetCfgLogger);
    256 
    257     printf("disabling all host-only interfaces..\n");
     256    RTMsgInfo("Disabling all host-only interfaces...");
     257    VBoxNetCfgWinSetLogging(winNetCfgLogger);
    258258
    259259    HRESULT hr = CoInitialize(NULL);
     
    262262        hr = VBoxNetCfgWinPropChangeAllNetDevicesOfId(VBOX_NETADP_HWID, VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE);
    263263        if (SUCCEEDED(hr))
    264             printf("disabling successful\n");
    265         else
    266             printf("disable failed, hr=%#lx\n", hr);
    267 
    268         CoUninitialize();
    269     }
    270     else
    271         printf("Error initializing COM (%#lx)\n", hr);
     264            RTMsgInfo("Disabling successful");
     265        else
     266            RTMsgError("disable failed: %Rhrc", hr);
     267
     268        CoUninitialize();
     269    }
     270    else
     271        RTMsgError("Failed initializing COM: %Rhrc", hr);
    272272
    273273    VBoxNetCfgWinSetLogging(NULL);
     
    278278static int VBoxNetAdpEnable(void)
    279279{
    280     VBoxNetCfgWinSetLogging(winNetCfgLogger);
    281 
    282     printf("enabling all host-only interfaces..\n");
     280    RTMsgInfo("Enabling all host-only interfaces...");
     281    VBoxNetCfgWinSetLogging(winNetCfgLogger);
    283282
    284283    HRESULT hr = CoInitialize(NULL);
     
    287286        hr = VBoxNetCfgWinPropChangeAllNetDevicesOfId(VBOX_NETADP_HWID, VBOXNECTFGWINPROPCHANGE_TYPE_ENABLE);
    288287        if (SUCCEEDED(hr))
    289             printf("enabling successful\n");
    290         else
    291             printf("enabling failed, hr=%#lx\n", hr);
    292 
    293         CoUninitialize();
    294     }
    295     else
    296         printf("Error initializing COM (%#lx)\n", hr);
     288            RTMsgInfo("Enabling successful!");
     289        else
     290            RTMsgError("enabling failed: %hrc", hr);
     291
     292        CoUninitialize();
     293    }
     294    else
     295        RTMsgError("Failed initializing COM: %Rhrc", hr);
    297296
    298297    VBoxNetCfgWinSetLogging(NULL);
     
    303302static void printUsage(void)
    304303{
    305     printf("host-only network adapter configuration tool\n"
    306             "  Usage: VBoxNetAdpInstall [cmd]\n"
    307             "    cmd can be one of the following values:\n"
    308             "       i  - install a new host-only interface (default command)\n"
    309             "       u  - uninstall all host-only interfaces\n"
    310             "       a  - update the host-only driver\n"
    311             "       d  - disable all host-only interfaces\n"
    312             "       e  - enable all host-only interfaces\n"
    313             "       h  - print this message\n");
     304    RTPrintf("host-only network adapter configuration tool\n"
     305             "  Usage: %s [cmd]\n"
     306             "    cmd can be one of the following values:\n"
     307             "       i  - install a new host-only interface (default command)\n"
     308             "       u  - uninstall all host-only interfaces\n"
     309             "       a  - update the host-only driver\n"
     310             "       d  - disable all host-only interfaces\n"
     311             "       e  - enable all host-only interfaces\n"
     312             "       h  - print this message\n",
     313             RTProcShortName());
    314314}
    315315
    316316int __cdecl main(int argc, char **argv)
    317317{
     318    RTR3InitExe(argc, &argv, 0);
     319
    318320    if (argc < 2)
    319321        return VBoxNetAdpInstall();
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetAdpUninstall.cpp

    r96407 r96572  
    3535 */
    3636
     37
     38/*********************************************************************************************************************************
     39*   Header Files                                                                                                                 *
     40*********************************************************************************************************************************/
    3741#include <VBox/VBoxNetCfg-win.h>
    3842#include <VBox/VBoxDrvCfg-win.h>
    39 #include <stdio.h>
    4043
    4144#include <devguid.h>
    4245
     46#include <iprt/initterm.h>
     47#include <iprt/message.h>
     48
     49
     50/*********************************************************************************************************************************
     51*   Defined Constants And Macros                                                                                                 *
     52*********************************************************************************************************************************/
    4353#ifdef NDIS60
    4454# define VBOX_NETADP_HWID L"sun_VBoxNetAdp6"
     
    4757#endif
    4858
     59
    4960static DECLCALLBACK(void) winNetCfgLogger(const char *pszString)
    5061{
    51     printf("%s", pszString);
     62    RTMsgInfo("%s", pszString);
    5263}
    5364
    5465static int VBoxNetAdpUninstall(void)
    5566{
     67    RTMsgInfo("Uninstalling all Host-Only interfaces ...");
     68
    5669    int rcExit = RTEXITCODE_FAILURE;
    5770    VBoxNetCfgWinSetLogging(winNetCfgLogger);
    58 
    59     printf("uninstalling all Host-Only interfaces..\n");
    6071
    6172    HRESULT hr = CoInitialize(NULL);
     
    6778            hr = VBoxDrvCfgInfUninstallAllSetupDi(&GUID_DEVCLASS_NET, L"Net", VBOX_NETADP_HWID, 0/* could be SUOI_FORCEDELETE */);
    6879            if (hr == S_OK)
    69                 printf("uninstalled successfully\n");
     80                RTMsgInfo("Uninstalled successfully!");
    7081            else
    71                 printf("uninstalled successfully, but failed to remove infs\n");
     82                RTMsgError("uninstalled successfully, but failed to remove infs (%Rhrc)\n", hr);
    7283            rcExit = RTEXITCODE_SUCCESS;
    7384        }
    7485        else
    75             printf("uninstall failed, hr=%#lx\n", hr);
     86            RTMsgError("uninstall failed: %Rhrc", hr);
    7687
    7788        CoUninitialize();
    7889    }
    7990    else
    80         wprintf(L"Error initializing COM (%#lx)\n", hr);
     91        RTMsgError("Failed initializing COM: %Rhrc", hr);
    8192
    8293    VBoxNetCfgWinSetLogging(NULL);
     
    8798int __cdecl main(int argc, char **argv)
    8899{
    89     RT_NOREF2(argc, argv);
     100    RTR3InitExeNoArguments(0);
     101    if (argc != 1)
     102        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments\n");
     103    NOREF(argv);
     104
    90105    return VBoxNetAdpUninstall();
    91106}
     107
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetFltInstall.cpp

    r96407 r96572  
    3535 */
    3636
     37
     38/*********************************************************************************************************************************
     39*   Header Files                                                                                                                 *
     40*********************************************************************************************************************************/
    3741#include <VBox/VBoxNetCfg-win.h>
    3842#include <devguid.h>
    3943#include <stdio.h>
    4044
     45#include <iprt/initterm.h>
     46#include <iprt/message.h>
     47
     48
     49/*********************************************************************************************************************************
     50*   Header Files                                                                                                                 *
     51*********************************************************************************************************************************/
    4152#define NETFLT_ID L"sun_VBoxNetFlt"
    4253#define VBOX_NETCFG_APP_NAME L"NetFltInstall"
     
    181192int __cdecl main(int argc, char **argv)
    182193{
    183     RT_NOREF2(argc, argv);
     194    RTR3InitExeNoArguments(0);
     195    if (argc != 1)
     196        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments\n");
     197    NOREF(argv);
     198
    184199    return VBoxNetFltInstall();
    185200}
     201
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetFltUninstall.cpp

    r96407 r96572  
    3535 */
    3636
     37
     38/*********************************************************************************************************************************
     39*   Header Files                                                                                                                 *
     40*********************************************************************************************************************************/
    3741#include <VBox/VBoxNetCfg-win.h>
    3842#include <stdio.h>
    3943
     44#include <iprt/initterm.h>
     45#include <iprt/message.h>
     46
     47
     48/*********************************************************************************************************************************
     49*   Defined Constants And Macros                                                                                                 *
     50*********************************************************************************************************************************/
    4051#define NETFLT_ID L"sun_VBoxNetFlt"
    4152#define VBOX_NETCFG_APP_NAME L"NetFltUninstall"
     
    4354#define VBOX_NETFLT_MP_INF L".\\VBoxNetFltM.inf"
    4455#define VBOX_NETFLT_RETRIES 10
     56
    4557
    4658static DECLCALLBACK(void) winNetCfgLogger(const char *pszString)
     
    112124int __cdecl main(int argc, char **argv)
    113125{
    114     RT_NOREF2(argc, argv);
     126    RTR3InitExeNoArguments(0);
     127    if (argc != 1)
     128        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments\n");
     129    NOREF(argv);
     130
    115131    return VBoxNetFltUninstall();
    116132}
     133
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetLwfInstall.cpp

    r96407 r96572  
    3535 */
    3636
     37
     38/*********************************************************************************************************************************
     39*   Header Files                                                                                                                 *
     40*********************************************************************************************************************************/
    3741#include <VBox/VBoxNetCfg-win.h>
    3842#include <devguid.h>
    39 #include <stdio.h>
    4043
     44#include <iprt/initterm.h>
     45#include <iprt/message.h>
     46#include <iprt/utf16.h>
     47
     48
     49/*********************************************************************************************************************************
     50*   Defined Constants And Macros                                                                                                 *
     51*********************************************************************************************************************************/
    4152#define VBOX_NETCFG_APP_NAME L"NetLwfInstall"
    4253#define VBOX_NETLWF_INF L".\\VBoxNetLwf.inf"
     
    4657static DECLCALLBACK(void) winNetCfgLogger(const char *pszString)
    4758{
    48     printf("%s", pszString);
     59    RTMsgInfo("%s", pszString);
    4960}
    5061
     
    116127                    if (hr == S_OK)
    117128                    {
    118                         wprintf(L"installed successfully\n");
     129                        RTMsgInfo("Installed successfully!");
    119130                        rcExit = RTEXITCODE_SUCCESS;
    120131                    }
    121132                    else
    122                         wprintf(L"error installing VBoxNetLwf (%#lx)\n", hr);
     133                        RTMsgError("Failed installing VBoxNetLwf: %Rhrc", hr);
    123134                }
    124135                else
    125136                {
    126137                    hr = HRESULT_FROM_WIN32(GetLastError());
    127                     wprintf(L"error getting full inf path for VBoxNetLwf.inf (%#lx)\n", hr);
     138                    RTMsgError("Failed getting full inf path for VBoxNetLwf.inf: %Rhrc", hr);
    128139                }
    129140
     
    134145            if (hr == NETCFG_E_NO_WRITE_LOCK && pwszLockedBy)
    135146            {
    136                 if (i < VBOX_NETLWF_RETRIES && !wcscmp(pwszLockedBy, L"6to4svc.dll"))
     147                if (i < VBOX_NETLWF_RETRIES && RTUtf16ICmpAscii(pwszLockedBy, "6to4svc.dll") == 0)
    137148                {
    138                     wprintf(L"6to4svc.dll is holding the lock, retrying %d out of %d\n", i + 1, VBOX_NETLWF_RETRIES);
     149                    RTMsgInfo("6to4svc.dll is holding the lock - retrying %d out of %d\n", i + 1, VBOX_NETLWF_RETRIES);
    139150                    CoTaskMemFree(pwszLockedBy);
    140151                }
    141152                else
    142153                {
    143                     wprintf(L"Error: write lock is owned by another application (%s), close the application and retry installing\n",
    144                             pwszLockedBy);
     154                    RTMsgError("write lock is owned by another application (%ls), close the application and retry installing",
     155                               pwszLockedBy);
    145156                    CoTaskMemFree(pwszLockedBy);
    146157                    break;
     
    149160            else
    150161            {
    151                 wprintf(L"Error getting the INetCfg interface (%#lx)\n", hr);
     162                RTMsgError("Failed getting the INetCfg interface: %Rhrc", hr);
    152163                break;
    153164            }
     
    157168    }
    158169    else
    159         wprintf(L"Error initializing COM (%#lx)\n", hr);
     170        RTMsgError("Failed initializing COM: %Rhrc", hr);
    160171
    161172    VBoxNetCfgWinSetLogging(NULL);
     
    166177int __cdecl main(int argc, char **argv)
    167178{
    168     RT_NOREF2(argc, argv);
     179    RTR3InitExeNoArguments(0);
     180    if (argc != 1)
     181        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments\n");
     182    NOREF(argv);
     183
    169184    return VBoxNetLwfInstall();
    170185}
     186
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetLwfUninstall.cpp

    r96407 r96572  
    3535 */
    3636
     37
     38/*********************************************************************************************************************************
     39*   Header Files                                                                                                                 *
     40*********************************************************************************************************************************/
    3741#include <VBox/VBoxNetCfg-win.h>
    38 #include <stdio.h>
    3942
     43#include <iprt/initterm.h>
     44#include <iprt/message.h>
     45#include <iprt/utf16.h>
     46
     47
     48/*********************************************************************************************************************************
     49*   Defined Constants And Macros                                                                                                 *
     50*********************************************************************************************************************************/
    4051#define VBOX_NETCFG_APP_NAME L"NetLwfUninstall"
    4152#define VBOX_NETLWF_RETRIES 10
    4253
     54
    4355static DECLCALLBACK(void) winNetCfgLogger(const char *pszString)
    4456{
    45     printf("%s", pszString);
     57    RTMsgInfo("%s", pszString);
    4658}
    4759
    4860static int VBoxNetLwfUninstall()
    4961{
    50     INetCfg *pnc;
    5162    int rcExit = RTEXITCODE_FAILURE;
    5263
     
    5970        {
    6071            LPWSTR pwszLockedBy = NULL;
     72            INetCfg *pnc = NULL;
    6173            hr = VBoxNetCfgWinQueryINetCfg(&pnc, TRUE, VBOX_NETCFG_APP_NAME, 10000, &pwszLockedBy);
    6274            if (hr == S_OK)
     
    6577                if (hr == S_OK)
    6678                {
    67                     wprintf(L"uninstalled successfully\n");
     79                    RTMsgInfo("uninstalled successfully!");
    6880                    rcExit = RTEXITCODE_SUCCESS;
    6981                }
    7082                else
    71                     wprintf(L"error uninstalling VBoxNetLwf (%#lx)\n", hr);
     83                    RTMsgError("error uninstalling VBoxNetLwf: %Rhrc");
    7284
    7385                VBoxNetCfgWinReleaseINetCfg(pnc, TRUE);
     
    7789            if (hr == NETCFG_E_NO_WRITE_LOCK && pwszLockedBy)
    7890            {
    79                 if (i < VBOX_NETLWF_RETRIES && !wcscmp(pwszLockedBy, L"6to4svc.dll"))
     91                if (i < VBOX_NETLWF_RETRIES && RTUtf16ICmpAscii(pwszLockedBy, "6to4svc.dll") == 0)
    8092                {
    81                     wprintf(L"6to4svc.dll is holding the lock, retrying %d out of %d\n", i + 1, VBOX_NETLWF_RETRIES);
     93                    RTMsgInfo("6to4svc.dll is holding the lock - retry %d out of %d ...", i + 1, VBOX_NETLWF_RETRIES);
    8294                    CoTaskMemFree(pwszLockedBy);
    8395                }
    8496                else
    8597                {
    86                     wprintf(L"Error: write lock is owned by another application (%s), close the application and retry uninstalling\n",
    87                              pwszLockedBy);
     98                    RTMsgError("Write lock is owned by another application (%ls), close the application and retry uninstalling",
     99                               pwszLockedBy);
    88100                    CoTaskMemFree(pwszLockedBy);
    89101                    break;
     
    92104            else
    93105            {
    94                 wprintf(L"Error getting the INetCfg interface (%#lx)\n", hr);
     106                RTMsgError("Failed getting the INetCfg interface: %Rhrc", hr);
    95107                break;
    96108            }
     
    100112    }
    101113    else
    102         wprintf(L"Error initializing COM (%#lx)\n", hr);
     114        RTMsgError("Failed initializing COM: %Rhrc", hr);
    103115
    104116    VBoxNetCfgWinSetLogging(NULL);
     
    109121int __cdecl main(int argc, char **argv)
    110122{
    111     RT_NOREF2(argc, argv);
     123    RTR3InitExeNoArguments(0);
     124    if (argc != 1)
     125        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments\n");
     126    NOREF(argv);
     127
    112128    return VBoxNetLwfUninstall();
    113129}
     130
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