Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp	(revision 60619)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp	(revision 60620)
@@ -61,4 +61,22 @@
 #define VBOX_NETCFG_LOCK_TIME_OUT     5000  /** @todo r=bird: What does this do? */
 
+
+/*
+* Wrappers for HelpAPI functions
+*/
+typedef void FNINITIALIZEIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
+typedef FNINITIALIZEIPINTERFACEENTRY *PFNINITIALIZEIPINTERFACEENTRY;
+
+typedef NETIOAPI_API FNGETIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
+typedef FNGETIPINTERFACEENTRY *PFNGETIPINTERFACEENTRY;
+
+typedef NETIOAPI_API FNSETIPINTERFACEENTRY( _Inout_ PMIB_IPINTERFACE_ROW row);
+typedef FNSETIPINTERFACEENTRY *PFNSETIPINTERFACEENTRY;
+
+static  PFNINITIALIZEIPINTERFACEENTRY   g_pfnInitializeIpInterfaceEntry = NULL;
+static  PFNGETIPINTERFACEENTRY          g_pfnGetIpInterfaceEntry        = NULL;
+static  PFNSETIPINTERFACEENTRY          g_pfnSetIpInterfaceEntry        = NULL;
+
+
 /*
 * Forward declaration for using vboxNetCfgWinSetupMetric()
@@ -66,4 +84,5 @@
 HRESULT vboxNetCfgWinSetupMetric(IN HKEY hKey);
 HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID* pLUID);
+
 
 /*
@@ -298,5 +317,4 @@
         {
             HKEY hkey;
-            NET_LUID luid;
             HRESULT res;
 
@@ -3357,20 +3375,60 @@
 
 
+HRESULT vboxLoadIpHelpFunctions(HINSTANCE& pIpHlpInstance)
+{
+    Assert(pIpHlpInstance != NULL);
+
+    pIpHlpInstance = loadSystemDll("Iphlpapi.dll");
+    if (pIpHlpInstance == NULL)
+        return E_FAIL;
+    
+    g_pfnInitializeIpInterfaceEntry = 
+        (PFNINITIALIZEIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "InitializeIpInterfaceEntry");
+    Assert(g_pfnInitializeIpInterfaceEntry);
+
+    if (g_pfnInitializeIpInterfaceEntry)
+    {
+        g_pfnGetIpInterfaceEntry = 
+            (PFNGETIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "GetIpInterfaceEntry");
+        Assert(g_pfnGetIpInterfaceEntry);
+    }
+
+    if (g_pfnGetIpInterfaceEntry)
+    {
+        g_pfnSetIpInterfaceEntry = 
+            (PFNSETIPINTERFACEENTRY)GetProcAddress(pIpHlpInstance, "SetIpInterfaceEntry");
+        Assert(g_pfnSetIpInterfaceEntry);
+    }
+
+    if (g_pfnInitializeIpInterfaceEntry == NULL)
+    {
+        FreeLibrary(pIpHlpInstance);
+        pIpHlpInstance = NULL;
+        return E_FAIL;
+    }
+
+    return S_OK;
+}
+
+
 HRESULT vboxNetCfgWinGetLoopbackMetric(OUT int* Metric)
 {
-    HRESULT status = S_OK;
+    HRESULT rc = S_OK;
     MIB_IPINTERFACE_ROW row;
 
-    InitializeIpInterfaceEntry(&row);
+    Assert(g_pfnInitializeIpInterfaceEntry != NULL);
+    Assert(g_pfnGetIpInterfaceEntry != NULL);
+
+    g_pfnInitializeIpInterfaceEntry(&row);
     row.Family = AF_INET;
     row.InterfaceLuid.Info.IfType = IF_TYPE_SOFTWARE_LOOPBACK;
 
-    status = GetIpInterfaceEntry(&row);
-    if (status != 0)
+    rc = g_pfnGetIpInterfaceEntry(&row);
+    if (rc != 0)
         return E_FAIL;
 
     *Metric = row.Metric;
 
-    return status;
+    return rc;
 }
 
@@ -3381,5 +3439,9 @@
 {
     MIB_IPINTERFACE_ROW newRow;
-    InitializeIpInterfaceEntry(&newRow);
+
+    Assert(g_pfnInitializeIpInterfaceEntry != NULL);
+    Assert(g_pfnSetIpInterfaceEntry != NULL);
+
+    g_pfnInitializeIpInterfaceEntry(&newRow);
     // identificate the interface to change
     newRow.InterfaceLuid = *pInterfaceLuid;
@@ -3390,5 +3452,5 @@
 
     // change settings
-    return SetIpInterfaceEntry(&newRow);
+    return g_pfnSetIpInterfaceEntry(&newRow);
 }
 
@@ -3427,22 +3489,27 @@
 HRESULT vboxNetCfgWinSetupMetric(IN HKEY hKey)
 {
-    HRESULT status = S_OK;
+    HRESULT rc = S_OK;
+    HINSTANCE hModule = NULL;
     NET_LUID luid;
     int loopbackMetric;
-
-    status = vboxNetCfgWinGetInterfaceLUID(hKey, &luid);
-    if (FAILED(status))
-        return status;
-
-    status = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
-    if (FAILED(status))
-        return status;
-
-    status = vboxNetCfgWinSetInterfaceMetric(&luid, loopbackMetric - 1);
-
-    return status;
-}
-
-
+    
+    rc = vboxLoadIpHelpFunctions(hModule);
+
+    if(SUCCEEDED(rc))
+        rc = vboxNetCfgWinGetInterfaceLUID(hKey, &luid);
+
+    if(SUCCEEDED(rc))
+        rc = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
+
+    if(SUCCEEDED(rc))
+        rc = vboxNetCfgWinSetInterfaceMetric(&luid, loopbackMetric - 1);
+
+    g_pfnInitializeIpInterfaceEntry = NULL;
+    g_pfnSetIpInterfaceEntry = NULL;
+    g_pfnGetIpInterfaceEntry = NULL;
+
+    FreeLibrary(hModule);
+    return rc;
+}
 #ifdef VBOXNETCFG_DELAYEDRENAME
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameHostOnlyConnection(IN const GUID *pGuid, IN LPCWSTR pwszId, OUT BSTR *pDevName)
