VirtualBox

Ignore:
Timestamp:
Sep 29, 2015 11:33:00 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
102911
Message:

HostDrivers/NetFlt: added timeout in filter unload for unregistration of factory

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetFltRt-win.cpp

    r56874 r57937  
    119119static int vboxNetFltWinAttachToInterface(PVBOXNETFLTINS pThis, void * pContext, bool fRediscovery);
    120120static int vboxNetFltWinConnectIt(PVBOXNETFLTINS pThis);
    121 static int vboxNetFltWinTryFiniIdc();
     121static int vboxNetFltWinFiniIdc();
    122122static void vboxNetFltWinFiniNetFltBase();
    123123static int vboxNetFltWinInitNetFltBase();
     
    16671667    LogFlow((__FUNCTION__" ==> DO (0x%x)\n", DriverObject));
    16681668
    1669     rc = vboxNetFltWinTryFiniIdc();
     1669    rc = vboxNetFltWinFiniIdc();
    16701670    if (RT_FAILURE(rc))
    16711671    {
     
    16731673        AssertFailed();
    16741674
    1675         Log((__FUNCTION__": vboxNetFltWinTryFiniIdc - failed, busy.\n"));
     1675        Log((__FUNCTION__": vboxNetFltWinFiniIdc - failed, busy.\n"));
    16761676    }
    16771677
     
    24502450}
    24512451
    2452 static int vboxNetFltWinTryFiniIdc()
     2452/*
     2453 * Defines max timeout for waiting for driver unloading
     2454 * (3000 * 100 ms = 5 minutes)
     2455 */
     2456#define MAX_UNLOAD_PROBES 3000
     2457
     2458static int vboxNetFltWinFiniIdc()
    24532459{
    24542460    int rc;
     2461    int i;
    24552462
    24562463    vboxNetFltWinStopInitIdcProbing();
     
    24582465    if (g_bVBoxIdcInitialized)
    24592466    {
    2460         rc = vboxNetFltTryDeleteIdc(&g_VBoxNetFltGlobals);
     2467         for (i = 0; (rc = vboxNetFltTryDeleteIdc(&g_VBoxNetFltGlobals)) == VERR_WRONG_ORDER
     2468            && i < MAX_UNLOAD_PROBES; i++)
     2469        {
     2470            RTThreadSleep(100);
     2471        }
     2472        if (i == MAX_UNLOAD_PROBES)
     2473        {
     2474            // seems something hungs in driver
     2475            LogFlow(("vboxNetFltWinFiniIdc - Can't delete Idc. pInH=%p cFRefs=%d fIDcOpen=%s",
     2476                        g_VBoxNetFltGlobals.pInstanceHead, g_VBoxNetFltGlobals.cFactoryRefs,
     2477                        g_VBoxNetFltGlobals.fIDCOpen ? "true" : "false"));
     2478            LogFlow(("vboxNetFltWinFiniIdc g_VBoxNetFltGlobalsWin cDvRefs=%d hDev=%x pDev=%p Mp=%x \n",
     2479                        g_VBoxNetFltGlobalsWin.cDeviceRefs, g_VBoxNetFltGlobalsWin.hDevice,
     2480                        g_VBoxNetFltGlobalsWin.pDevObj, g_VBoxNetFltGlobalsWin.Mp.hMiniport));
     2481            Assert(i == MAX_UNLOAD_PROBES);
     2482            return VERR_WRONG_ORDER;
     2483        }
     2484
    24612485        if (RT_SUCCESS(rc))
    24622486        {
     
    24742498static int vboxNetFltWinFiniNetFlt()
    24752499{
    2476     int rc = vboxNetFltWinTryFiniIdc();
     2500    int rc = vboxNetFltWinFiniIdc();
    24772501    if (RT_SUCCESS(rc))
    24782502    {
Note: See TracChangeset for help on using the changeset viewer.

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