Index: /trunk/include/VBox/VBoxDrvCfg-win.h
===================================================================
--- /trunk/include/VBox/VBoxDrvCfg-win.h	(revision 40992)
+++ /trunk/include/VBox/VBoxDrvCfg-win.h	(revision 40993)
@@ -70,4 +70,6 @@
 VBOXDRVCFG_DECL(HRESULT) VBoxDrvCfgSvcStart(LPCWSTR lpszSvcName);
 
+HRESULT VBoxDrvCfgDrvUpdate(LPCWSTR pcszwHwId, LPCWSTR pcsxwInf, BOOL *pbRebootRequired);
+
 RT_C_DECLS_END
 
Index: /trunk/include/VBox/VBoxNetCfg-win.h
===================================================================
--- /trunk/include/VBox/VBoxNetCfg-win.h	(revision 40992)
+++ /trunk/include/VBox/VBoxNetCfg-win.h	(revision 40993)
@@ -69,6 +69,16 @@
                                                                         OUT GUID *pGuid, OUT BSTR *lppszName,
                                                                         OUT BSTR *pErrMsg);
+VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinUpdateHostOnlyNetworkInterface(LPCWSTR pcsxwInf, BOOL *pbRebootRequired);
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveHostOnlyNetworkInterface(IN const GUID *pGUID, OUT BSTR *pErrMsg);
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveAllNetDevicesOfId(IN LPCWSTR lpszPnPId);
+
+typedef enum
+{
+    VBOXNECTFGWINPROPCHANGE_TYPE_UNDEFINED = 0,
+    VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE,
+    VBOXNECTFGWINPROPCHANGE_TYPE_ENABLE
+} VBOXNECTFGWINPROPCHANGE_TYPE;
+
+VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinPropChangeAllNetDevicesOfId(IN LPCWSTR lpszPnPId, VBOXNECTFGWINPROPCHANGE_TYPE enmPcType);
 
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostOnlyNetworkNetworkIp(OUT PULONG pNetIp, OUT PULONG pNetMask);
Index: /trunk/src/VBox/Devices/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Devices/Makefile.kmk	(revision 40992)
+++ /trunk/src/VBox/Devices/Makefile.kmk	(revision 40993)
@@ -87,5 +87,6 @@
  	$(PATH_STAGE_LIB)/USBLib$(VBOX_SUFF_LIB)
   VBoxDDU_LIBS.win       += \
- 	$(PATH_STAGE_LIB)/VBoxDrvCfg$(VBOX_SUFF_LIB)
+ 	$(PATH_STAGE_LIB)/VBoxDrvCfg$(VBOX_SUFF_LIB) \
+ 	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib
  endif
  ifeq ($(KBUILD_TARGET),l4)
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk	(revision 40992)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk	(revision 40993)
@@ -160,4 +160,5 @@
  	$(WinNetConfig_1_TARGET) \
  	$(VBoxDrvCfg_1_TARGET) \
+ 	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
   	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
  	$(PATH_SDK_WINPSDK_LIB)/WbemUuid.Lib
@@ -174,4 +175,5 @@
  	$(WinNetConfig_1_TARGET) \
  	$(VBoxDrvCfg_1_TARGET) \
+ 	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
   	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
  	$(PATH_SDK_WINPSDK_LIB)/WbemUuid.Lib
@@ -187,4 +189,5 @@
  	$(WinNetConfig_1_TARGET) \
  	$(VBoxDrvCfg_1_TARGET) \
+ 	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
   	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
  	$(PATH_SDK_WINPSDK_LIB)/WbemUuid.Lib
@@ -201,4 +204,5 @@
  	$(WinNetConfig_1_TARGET) \
  	$(VBoxDrvCfg_1_TARGET) \
+ 	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
   	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
  	$(PATH_SDK_WINPSDK_LIB)/WbemUuid.Lib
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp	(revision 40992)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp	(revision 40993)
@@ -448,4 +448,77 @@
 }
 
+typedef struct VBOXNECTFGWINPROPCHANGE
+{
+    VBOXNECTFGWINPROPCHANGE_TYPE enmPcType;
+    HRESULT hr;
+} VBOXNECTFGWINPROPCHANGE ,*PVBOXNECTFGWINPROPCHANGE;
+
+static BOOL vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext)
+{
+    PVBOXNECTFGWINPROPCHANGE pPc = (PVBOXNECTFGWINPROPCHANGE)pContext;
+    HRESULT hr = S_OK;
+    SP_PROPCHANGE_PARAMS PcParams;
+    memset (&PcParams, 0, sizeof (PcParams));
+
+    PcParams.ClassInstallHeader.cbSize = sizeof (SP_CLASSINSTALL_HEADER);
+    PcParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
+    PcParams.Scope = DICS_FLAG_GLOBAL;
+    PcParams.HwProfile = 0;
+    switch(pPc->enmPcType)
+    {
+        case VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE:
+            PcParams.StateChange = DICS_DISABLE;
+            break;
+        case VBOXNECTFGWINPROPCHANGE_TYPE_ENABLE:
+            PcParams.StateChange = DICS_ENABLE;
+            break;
+        default:
+            NonStandardLogFlow(("unexpected prop change type: %d\n", pPc->enmPcType));
+            pPc->hr = E_INVALIDARG;
+            return FALSE;
+    }
+
+
+    if (SetupDiSetClassInstallParams(hDevInfo, pDev, &PcParams.ClassInstallHeader, sizeof (PcParams)))
+    {
+        if (SetupDiSetSelectedDevice(hDevInfo, pDev))
+        {
+            if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, pDev))
+            {
+                SP_DEVINSTALL_PARAMS devParams;
+                devParams.cbSize = sizeof(devParams);
+                if (SetupDiGetDeviceInstallParams(hDevInfo,pDev,&devParams))
+                {
+                    if (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))
+                    {
+                        hr = S_FALSE;
+                        NonStandardLogFlow(("PropChange: !!!REBOOT REQUIRED!!!\n"));
+                    }
+                }
+            }
+            else
+            {
+                DWORD dwErr = GetLastError();
+                NonStandardLogFlow(("SetupDiCallClassInstaller failed with %ld\n", dwErr));
+                hr = HRESULT_FROM_WIN32(dwErr);
+            }
+        }
+        else
+        {
+            DWORD dwErr = GetLastError();
+            NonStandardLogFlow(("SetupDiSetSelectedDevice failed with %ld\n", dwErr));
+            hr = HRESULT_FROM_WIN32(dwErr);
+        }
+    }
+    else
+    {
+        DWORD dwErr = GetLastError();
+        NonStandardLogFlow(("SetupDiSetClassInstallParams failed with %ld\n", dwErr));
+        hr = HRESULT_FROM_WIN32(dwErr);
+    }
+
+    return TRUE;
+}
+
 typedef BOOL (*VBOXNETCFGWIN_NETENUM_CALLBACK) (HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext);
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinEnumNetDevices(LPCWSTR pPnPId, VBOXNETCFGWIN_NETENUM_CALLBACK callback, PVOID pContext)
@@ -553,4 +626,12 @@
 {
     return VBoxNetCfgWinEnumNetDevices(lpszPnPId, vboxNetCfgWinRemoveAllNetDevicesOfIdCallback, NULL);
+}
+
+VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinPropChangeAllNetDevicesOfId(IN LPCWSTR lpszPnPId, VBOXNECTFGWINPROPCHANGE_TYPE enmPcType)
+{
+    VBOXNECTFGWINPROPCHANGE Pc;
+    Pc.enmPcType = enmPcType;
+    Pc.hr = S_OK;
+    return VBoxNetCfgWinEnumNetDevices(lpszPnPId, vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback, &Pc);
 }
 
@@ -2349,4 +2430,9 @@
 }
 
+VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinUpdateHostOnlyNetworkInterface(LPCWSTR pcsxwInf, BOOL *pbRebootRequired)
+{
+    return VBoxDrvCfgDrvUpdate(DRIVERHWID, pcsxwInf, pbRebootRequired);
+}
+
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinCreateHostOnlyNetworkInterface(IN LPCWSTR pInfPath, IN bool bIsInfPathFile,
                                                                         OUT GUID *pGuid, OUT BSTR *lppszName, OUT BSTR *pErrMsg)
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetAdpInstall.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetAdpInstall.cpp	(revision 40992)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetAdpInstall.cpp	(revision 40993)
@@ -17,5 +17,8 @@
 
 #include <VBox/VBoxNetCfg-win.h>
+#include <VBox/VBoxDrvCfg-win.h>
 #include <stdio.h>
+
+#include <devguid.h>
 
 #define VBOX_NETADP_INF L".\\VBoxNetAdp.inf"
@@ -94,6 +97,184 @@
 }
 
+static int VBoxNetAdpUninstall()
+{
+    int r = 1;
+    VBoxNetCfgWinSetLogging(winNetCfgLogger);
+
+    printf("uninstalling all Host-Only interfaces..\n");
+
+    HRESULT hr = CoInitialize(NULL);
+    if(hr == S_OK)
+    {
+        hr = VBoxNetCfgWinRemoveAllNetDevicesOfId(L"sun_VBoxNetAdp");
+        if(hr == S_OK)
+        {
+            hr = VBoxDrvCfgInfUninstallAllSetupDi(&GUID_DEVCLASS_NET, L"Net", L"sun_VBoxNetAdp", 0/* could be SUOI_FORCEDELETE */);
+            if(hr == S_OK)
+            {
+                printf("uninstalled successfully\n");
+            }
+            else
+            {
+                printf("uninstalled successfully, but failed to remove infs\n");
+            }
+            r = 0;
+        }
+        else
+        {
+            printf("uninstall failed, hr = 0x%x\n", hr);
+        }
+
+        CoUninitialize();
+    }
+    else
+    {
+        wprintf(L"Error initializing COM (0x%x)\n", hr);
+    }
+
+    VBoxNetCfgWinSetLogging(NULL);
+
+    return r;
+}
+
+static int VBoxNetAdpUpdate()
+{
+    int r = 1;
+    VBoxNetCfgWinSetLogging(winNetCfgLogger);
+
+    printf("uninstalling all Host-Only interfaces..\n");
+
+    HRESULT hr = CoInitialize(NULL);
+    if(hr == S_OK)
+    {
+        BOOL fRebootRequired = FALSE;
+        hr = VBoxNetCfgWinUpdateHostOnlyNetworkInterface(VBOX_NETADP_INF, &fRebootRequired);
+        if(hr == S_OK)
+        {
+            if (fRebootRequired)
+                printf("!!REBOOT REQUIRED!!\n");
+            printf("updated successfully\n");
+            r = 0;
+        }
+        else
+        {
+            printf("update failed, hr = 0x%x\n", hr);
+        }
+
+        CoUninitialize();
+    }
+    else
+    {
+        wprintf(L"Error initializing COM (0x%x)\n", hr);
+    }
+
+    VBoxNetCfgWinSetLogging(NULL);
+
+    return r;
+}
+
+static int VBoxNetAdpDisable()
+{
+    int r = 1;
+    VBoxNetCfgWinSetLogging(winNetCfgLogger);
+
+    printf("disabling all Host-Only interfaces..\n");
+
+    HRESULT hr = CoInitialize(NULL);
+    if(hr == S_OK)
+    {
+        hr = VBoxNetCfgWinPropChangeAllNetDevicesOfId(L"sun_VBoxNetAdp", VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE);
+        if(hr == S_OK)
+        {
+            printf("disable succeeded!\n");
+            r = 0;
+        }
+        else
+        {
+            printf("disable failed, hr = 0x%x\n", hr);
+        }
+
+        CoUninitialize();
+    }
+    else
+    {
+        wprintf(L"Error initializing COM (0x%x)\n", hr);
+    }
+
+    VBoxNetCfgWinSetLogging(NULL);
+
+    return r;
+}
+
+static int VBoxNetAdpEnable()
+{
+    int r = 1;
+    VBoxNetCfgWinSetLogging(winNetCfgLogger);
+
+    printf("enabling all Host-Only interfaces..\n");
+
+    HRESULT hr = CoInitialize(NULL);
+    if(hr == S_OK)
+    {
+        hr = VBoxNetCfgWinPropChangeAllNetDevicesOfId(L"sun_VBoxNetAdp", VBOXNECTFGWINPROPCHANGE_TYPE_ENABLE);
+        if(hr == S_OK)
+        {
+            printf("disable succeeded!\n");
+            r = 0;
+        }
+        else
+        {
+            printf("disable failed, hr = 0x%x\n", hr);
+        }
+
+        CoUninitialize();
+    }
+    else
+    {
+        wprintf(L"Error initializing COM (0x%x)\n", hr);
+    }
+
+    VBoxNetCfgWinSetLogging(NULL);
+
+    return r;
+}
+
+static void printUsage()
+{
+    printf("Host-Only network adapter configuration tool\n"
+            "  Usage: VBoxNetAdpInstall [cmd]\n"
+            "    cmd can be one of the following values:\n"
+            "       i  - install a new host-only interface\n"
+            "       u  - uninstall all host-only interfaces\n"
+            "       a  - update the host-only driver\n"
+            "       d  - disable all host-only interfaces\n"
+            "       e  - enable all host-only interfaces\n"
+            "       h  - print this message\n");
+}
+
 int __cdecl main(int argc, char **argv)
 {
-    return VBoxNetAdpInstall();
-}
+    if (argc < 2)
+        return VBoxNetAdpInstall();
+    if (argc > 2)
+    {
+        printUsage();
+        return 1;
+    }
+
+    __debugbreak();
+
+    if (!strcmp(argv[1], "i"))
+        return VBoxNetAdpInstall();
+    if (!strcmp(argv[1], "u"))
+        return VBoxNetAdpUninstall();
+    if (!strcmp(argv[1], "a"))
+        return VBoxNetAdpUpdate();
+    if (!strcmp(argv[1], "d"))
+        return VBoxNetAdpDisable();
+    if (!strcmp(argv[1], "e"))
+        return VBoxNetAdpEnable();
+
+    printUsage();
+    return !strcmp(argv[1], "h");
+}
Index: /trunk/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp	(revision 40992)
+++ /trunk/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp	(revision 40993)
@@ -24,4 +24,6 @@
 #include <malloc.h>
 #include <stdio.h>
+
+#include <Newdev.h>
 
 static PFNVBOXDRVCFG_LOG g_pfnVBoxDrvCfgLog;
@@ -811,2 +813,41 @@
     return hr;
 }
+
+
+HRESULT VBoxDrvCfgDrvUpdate(LPCWSTR pcszwHwId, LPCWSTR pcsxwInf, BOOL *pbRebootRequired)
+{
+    if (pbRebootRequired)
+        *pbRebootRequired = FALSE;
+    BOOL bRebootRequired = FALSE;
+    WCHAR InfFullPath[MAX_PATH];
+    DWORD dwChars = GetFullPathNameW(pcsxwInf,
+            sizeof (InfFullPath) / sizeof (InfFullPath[0]),
+            InfFullPath,
+            NULL /* LPTSTR *lpFilePart */
+            );
+    if (!dwChars || dwChars >= MAX_PATH)
+    {
+        NonStandardLogCrap(("GetFullPathNameW failed, WinEr(%d), dwChars(%d)\n", GetLastError(), dwChars));
+        return E_INVALIDARG;
+    }
+
+
+    if (!UpdateDriverForPlugAndPlayDevicesW(NULL, /* HWND hwndParent */
+            pcszwHwId,
+            InfFullPath,
+            INSTALLFLAG_FORCE,
+            &bRebootRequired))
+    {
+        NonStandardLogCrap(("UpdateDriverForPlugAndPlayDevicesW failed, WinEr(%d)\n", GetLastError(), dwChars));
+        return E_FAIL;
+    }
+
+
+    if (bRebootRequired)
+        NonStandardLogCrap(("!!Driver Update: REBOOT REQUIRED!!\n", GetLastError(), dwChars));
+
+    if (pbRebootRequired)
+        *pbRebootRequired = bRebootRequired;
+
+    return S_OK;
+}
Index: /trunk/src/VBox/Installer/win/InstallHelper/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Installer/win/InstallHelper/Makefile.kmk	(revision 40992)
+++ /trunk/src/VBox/Installer/win/InstallHelper/Makefile.kmk	(revision 40993)
@@ -40,4 +40,5 @@
 	$(PATH_STAGE_LIB)/WinNetConfig.lib \
 	$(PATH_STAGE_LIB)/VBoxDrvCfg.lib \
+	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
  	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
  	$(PATH_SDK_WINPSDK_LIB)/WbemUuid.Lib
Index: /trunk/src/VBox/Main/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Main/Makefile.kmk	(revision 40992)
+++ /trunk/src/VBox/Main/Makefile.kmk	(revision 40993)
@@ -389,4 +389,5 @@
 	$(PATH_STAGE_LIB)/WinNetConfig$(VBOX_SUFF_LIB) \
 	$(PATH_STAGE_LIB)/VBoxDrvCfg$(VBOX_SUFF_LIB) \
+	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
 	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
 	$(PATH_SDK_WINPSDK_LIB)/WbemUuid.Lib
@@ -579,4 +580,5 @@
  VBoxC_LIBS.win += \
  	$(PATH_STAGE_LIB)/VBoxDrvCfg$(VBOX_SUFF_LIB) \
+ 	$(PATH_SDK_W2K3DDK_LIB)/Newdev.lib \
  	$(PATH_STAGE_LIB)/WinNetConfig$(VBOX_SUFF_LIB) \
  	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/comsupp.lib \
