Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp	(revision 57936)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp	(revision 57937)
@@ -119,5 +119,5 @@
 static int vboxNetFltWinAttachToInterface(PVBOXNETFLTINS pThis, void * pContext, bool fRediscovery);
 static int vboxNetFltWinConnectIt(PVBOXNETFLTINS pThis);
-static int vboxNetFltWinTryFiniIdc();
+static int vboxNetFltWinFiniIdc();
 static void vboxNetFltWinFiniNetFltBase();
 static int vboxNetFltWinInitNetFltBase();
@@ -1667,5 +1667,5 @@
     LogFlow((__FUNCTION__" ==> DO (0x%x)\n", DriverObject));
 
-    rc = vboxNetFltWinTryFiniIdc();
+    rc = vboxNetFltWinFiniIdc();
     if (RT_FAILURE(rc))
     {
@@ -1673,5 +1673,5 @@
         AssertFailed();
 
-        Log((__FUNCTION__": vboxNetFltWinTryFiniIdc - failed, busy.\n"));
+        Log((__FUNCTION__": vboxNetFltWinFiniIdc - failed, busy.\n"));
     }
 
@@ -2450,7 +2450,14 @@
 }
 
-static int vboxNetFltWinTryFiniIdc()
+/*
+ * Defines max timeout for waiting for driver unloading
+ * (3000 * 100 ms = 5 minutes)
+ */
+#define MAX_UNLOAD_PROBES 3000
+
+static int vboxNetFltWinFiniIdc()
 {
     int rc;
+    int i;
 
     vboxNetFltWinStopInitIdcProbing();
@@ -2458,5 +2465,22 @@
     if (g_bVBoxIdcInitialized)
     {
-        rc = vboxNetFltTryDeleteIdc(&g_VBoxNetFltGlobals);
+         for (i = 0; (rc = vboxNetFltTryDeleteIdc(&g_VBoxNetFltGlobals)) == VERR_WRONG_ORDER
+            && i < MAX_UNLOAD_PROBES; i++)
+        {
+            RTThreadSleep(100);
+        }
+        if (i == MAX_UNLOAD_PROBES)
+        {
+            // seems something hungs in driver
+            LogFlow(("vboxNetFltWinFiniIdc - Can't delete Idc. pInH=%p cFRefs=%d fIDcOpen=%s",
+                        g_VBoxNetFltGlobals.pInstanceHead, g_VBoxNetFltGlobals.cFactoryRefs,
+                        g_VBoxNetFltGlobals.fIDCOpen ? "true" : "false"));
+            LogFlow(("vboxNetFltWinFiniIdc g_VBoxNetFltGlobalsWin cDvRefs=%d hDev=%x pDev=%p Mp=%x \n",
+                        g_VBoxNetFltGlobalsWin.cDeviceRefs, g_VBoxNetFltGlobalsWin.hDevice,
+                        g_VBoxNetFltGlobalsWin.pDevObj, g_VBoxNetFltGlobalsWin.Mp.hMiniport));
+            Assert(i == MAX_UNLOAD_PROBES);
+            return VERR_WRONG_ORDER;
+        }
+
         if (RT_SUCCESS(rc))
         {
@@ -2474,5 +2498,5 @@
 static int vboxNetFltWinFiniNetFlt()
 {
-    int rc = vboxNetFltWinTryFiniIdc();
+    int rc = vboxNetFltWinFiniIdc();
     if (RT_SUCCESS(rc))
     {
