VirtualBox

Ignore:
Timestamp:
Sep 12, 2011 11:58:43 AM (13 years ago)
Author:
vboxsync
Message:

VBoxUsbLib-win.cpp: Don't close hMonitor (or anything else) twice when init failed! Two r=bird comments. Cleanups.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxUSB/win/lib/VBoxUsbLib-win.cpp

    r38713 r38714  
    11701170}
    11711171
    1172 static void usbLibOnDeviceChange()
     1172static void usbLibOnDeviceChange(void)
    11731173{
    11741174    /* we're getting series of events like that especially on device re-attach
     
    11831183        {
    11841184            DWORD winEr = GetLastError();
    1185             AssertMsg(winEr == ERROR_IO_PENDING, (__FUNCTION__": DeleteTimerQueueTimer failed, winEr (%d)\n", winEr));
     1185            AssertMsg(winEr == ERROR_IO_PENDING, ("DeleteTimerQueueTimer failed, winEr (%d)\n", winEr));
    11861186        }
    11871187    }
    11881188
    11891189    if (!CreateTimerQueueTimer(&g_VBoxUsbGlobal.hTimer, g_VBoxUsbGlobal.hTimerQueue,
    1190                                         usbLibTimerCallback,
    1191                                         NULL,
    1192                                         500, /* ms*/
    1193                                         0,
    1194                                         WT_EXECUTEONLYONCE))
    1195     {
    1196             DWORD winEr = GetLastError();
    1197             AssertMsgFailed(("CreateTimerQueueTimer failed, winEr (%d)\n", winEr));
    1198 
    1199             /* call it directly */
    1200             usbLibTimerCallback(NULL, FALSE);
    1201     }
    1202 }
    1203 
    1204 static LRESULT CALLBACK usbLibWndProc(HWND hwnd,
    1205     UINT uMsg,
    1206     WPARAM wParam,
    1207     LPARAM lParam
    1208 )
     1190                               usbLibTimerCallback,
     1191                               NULL,
     1192                               500, /* ms*/
     1193                               0,
     1194                               WT_EXECUTEONLYONCE))
     1195    {
     1196        DWORD winEr = GetLastError();
     1197        AssertMsgFailed(("CreateTimerQueueTimer failed, winEr (%d)\n", winEr));
     1198
     1199        /* call it directly */
     1200        usbLibTimerCallback(NULL, FALSE);
     1201    }
     1202}
     1203
     1204static LRESULT CALLBACK usbLibWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    12091205{
    12101206    switch (uMsg)
     
    12311227}
    12321228
    1233 static LPCSTR g_VBoxUsbWndClassName = "VBoxUsbLibClass";
    1234 
    1235 static DWORD WINAPI usbLibMsgThreadProc(__in  LPVOID lpParameter)
    1236 {
    1237      HWND                 hwnd = 0;
    1238      HINSTANCE hInstance = (HINSTANCE)GetModuleHandle (NULL);
    1239      bool bExit = false;
     1229static DWORD WINAPI usbLibMsgThreadProc(__in LPVOID lpParameter)
     1230{
     1231    static LPCSTR   s_szVBoxUsbWndClassName = "VBoxUsbLibClass";
     1232     HWND           hwnd      = 0;
     1233     HINSTANCE      hInstance = (HINSTANCE)GetModuleHandle(NULL);
     1234     bool           bExit     = false;
    12401235
    12411236     /* Register the Window Class. */
     
    12501245     wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
    12511246     wc.lpszMenuName  = NULL;
    1252      wc.lpszClassName = g_VBoxUsbWndClassName;
     1247     wc.lpszClassName = s_szVBoxUsbWndClassName;
    12531248
    12541249     ATOM atomWindowClass = RegisterClass(&wc);
     
    12571252     {
    12581253         /* Create the window. */
    1259          g_VBoxUsbGlobal.hWnd = CreateWindowEx (WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT | WS_EX_TOPMOST,
    1260                  g_VBoxUsbWndClassName, g_VBoxUsbWndClassName,
    1261                                                    WS_POPUPWINDOW,
    1262                                                   -200, -200, 100, 100, NULL, NULL, hInstance, NULL);
     1254         g_VBoxUsbGlobal.hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT | WS_EX_TOPMOST,
     1255                                               s_szVBoxUsbWndClassName, s_szVBoxUsbWndClassName,
     1256                                               WS_POPUPWINDOW,
     1257                                               -200, -200, 100, 100, NULL, NULL, hInstance, NULL);
    12631258         SetEvent(g_VBoxUsbGlobal.hNotifyEvent);
    12641259
     
    12751270             }
    12761271
    1277              DestroyWindow (hwnd);
     1272             DestroyWindow(hwnd);
    12781273
    12791274             bExit = true;
    12801275         }
    12811276
    1282          UnregisterClass (g_VBoxUsbWndClassName, hInstance);
     1277         UnregisterClass(s_szVBoxUsbWndClassName, hInstance);
    12831278     }
    12841279
    1285      if(bExit)
     1280     /** @todo r=bird: Please explain why the USB library needs
     1281      *        this exit(0) hack! */
     1282     if (bExit)
    12861283     {
    12871284         /* no need any accuracy here, in anyway the DHCP server usually gets terminated with TerminateProcess */
     
    13081305    g_VBoxUsbGlobal.hMonitor = INVALID_HANDLE_VALUE;
    13091306
    1310     g_VBoxUsbGlobal.hNotifyEvent = CreateEvent(NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes */
    1311                                         FALSE, /* BOOL bManualReset */
     1307    g_VBoxUsbGlobal.hNotifyEvent = CreateEvent(NULL,  /* LPSECURITY_ATTRIBUTES lpEventAttributes */
     1308                                               FALSE, /* BOOL bManualReset */
    13121309#ifndef VBOX_USB_USE_DEVICE_NOTIFICATION
    1313                                         TRUE,  /* BOOL bInitialState */
     1310                                               TRUE,  /* BOOL bInitialState */
    13141311#else
    1315                                         FALSE, /* set to false since it will be initially used for notification thread startup sync */
    1316 #endif
    1317                                         NULL /* LPCTSTR lpName */);
     1312                                               FALSE, /* set to false since it will be initially used for notification thread startup sync */
     1313#endif
     1314                                               NULL  /* LPCTSTR lpName */);
    13181315    if (g_VBoxUsbGlobal.hNotifyEvent)
    13191316    {
    1320         g_VBoxUsbGlobal.hInterruptEvent = CreateEvent(NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes */
    1321                                                 FALSE, /* BOOL bManualReset */
    1322                                                 FALSE, /* BOOL bInitialState */
    1323                                                 NULL /* LPCTSTR lpName */);
     1317        g_VBoxUsbGlobal.hInterruptEvent = CreateEvent(NULL,  /* LPSECURITY_ATTRIBUTES lpEventAttributes */
     1318                                                      FALSE, /* BOOL bManualReset */
     1319                                                      FALSE, /* BOOL bInitialState */
     1320                                                      NULL  /* LPCTSTR lpName */);
    13241321        if (g_VBoxUsbGlobal.hInterruptEvent)
    13251322        {
     
    13501347                if (DeviceIoControl(g_VBoxUsbGlobal.hMonitor, SUPUSBFLT_IOCTL_GET_VERSION, NULL, 0, &Version, sizeof (Version), &cbReturned, NULL))
    13511348                {
    1352                     if (Version.u32Major == USBMON_MAJOR_VERSION || Version.u32Minor <= USBMON_MINOR_VERSION)
     1349                    /** @todo r=bird: Explain why we accept any mismatching major
     1350                     *        version as long as the minor version is less or equal!
     1351                     *        It does not make sense to me... */
     1352                    if (   Version.u32Major == USBMON_MAJOR_VERSION
     1353                        || Version.u32Minor <= USBMON_MINOR_VERSION)
    13531354                    {
    13541355#ifndef VBOX_USB_USE_DEVICE_NOTIFICATION
     
    13571358                        SetEvent.u.hEvent = g_VBoxUsbGlobal.hNotifyEvent;
    13581359                        if (DeviceIoControl(g_VBoxUsbGlobal.hMonitor, SUPUSBFLT_IOCTL_SET_NOTIFY_EVENT,
    1359                                 &SetEvent, sizeof (SetEvent),
    1360                                 &SetEvent, sizeof (SetEvent),
    1361                                 &cbReturned, NULL))
     1360                                            &SetEvent, sizeof(SetEvent),
     1361                                            &SetEvent, sizeof(SetEvent),
     1362                                            &cbReturned, NULL))
    13621363                        {
    13631364                            rc = SetEvent.u.rc;
    13641365                            AssertRC(rc);
    13651366                            if (RT_SUCCESS(rc))
     1367                            {
     1368                                /*
     1369                                 * We're DONE!
     1370                                 */
    13661371                                return VINF_SUCCESS;
    1367                             else
    1368                                 AssertMsgFailed(("SetEvent failed, rc (%d)\n", rc));
     1372                            }
     1373                            AssertMsgFailed(("SetEvent failed, rc (%d)\n", rc));
    13691374                        }
    13701375                        else
     
    13861391                              NULL /*__out_opt  LPDWORD lpThreadId*/
    13871392                            );
    1388 
    1389                             if(g_VBoxUsbGlobal.hThread)
     1393                            if (g_VBoxUsbGlobal.hThread)
    13901394                            {
    13911395                                DWORD dwResult = WaitForSingleObject(g_VBoxUsbGlobal.hNotifyEvent, INFINITE);
    13921396                                Assert(dwResult == WAIT_OBJECT_0);
    1393 
    13941397                                if (g_VBoxUsbGlobal.hWnd)
    13951398                                {
    1396                                     /* ensure the event is set so the first "wait change" request processes */
     1399                                    /*
     1400                                     * We're DONE!
     1401                                     * 
     1402                                     * Juse ensure that the event is set so the
     1403                                     * first "wait change" request is processed.
     1404                                     */
    13971405                                    SetEvent(g_VBoxUsbGlobal.hNotifyEvent);
    13981406                                    return VINF_SUCCESS;
    13991407                                }
     1408
    14001409                                dwResult = WaitForSingleObject(g_VBoxUsbGlobal.hThread, INFINITE);
    14011410                                Assert(dwResult == WAIT_OBJECT_0);
    14021411                                BOOL bRc = CloseHandle(g_VBoxUsbGlobal.hThread);
    1403                                 if (!bRc)
    1404                                 {
    1405                                     DWORD winEr = GetLastError();
    1406                                     AssertMsgFailed(("CloseHandle for hThread failed winEr(%d)\n", winEr));
    1407                                 }
     1412                                AssertMsg(bRc, ("CloseHandle for hThread failed winEr(%d)\n", GetLastError()));
     1413                                g_VBoxUsbGlobal.hThread = INVALID_HANDLE_VALUE;
    14081414                            }
    14091415                            else
     
    14131419                                rc = VERR_GENERAL_FAILURE;
    14141420                            }
     1421
     1422                            DeleteTimerQueueEx(g_VBoxUsbGlobal.hTimerQueue, INVALID_HANDLE_VALUE /* see term */);
     1423                            g_VBoxUsbGlobal.hTimerQueue = NULL;
    14151424                        }
    14161425                        else
     
    14381447
    14391448                CloseHandle(g_VBoxUsbGlobal.hMonitor);
     1449                g_VBoxUsbGlobal.hMonitor = INVALID_HANDLE_VALUE;
    14401450            }
    14411451            else
     
    14491459
    14501460            CloseHandle(g_VBoxUsbGlobal.hInterruptEvent);
     1461            g_VBoxUsbGlobal.hInterruptEvent = NULL;
    14511462        }
    14521463        else
     
    14581469
    14591470        CloseHandle(g_VBoxUsbGlobal.hNotifyEvent);
     1471        g_VBoxUsbGlobal.hNotifyEvent = NULL;
    14601472    }
    14611473    else
     
    14831495    if (g_VBoxUsbGlobal.hMonitor == INVALID_HANDLE_VALUE)
    14841496    {
    1485 #ifdef VBOX_WITH_ANNOYING_USB_ASSERTIONS
    1486         AssertFailed();
    1487 #endif
    1488         return VINF_ALREADY_INITIALIZED;
     1497        Assert(g_VBoxUsbGlobal.hInterruptEvent == NULL);
     1498        Assert(g_VBoxUsbGlobal.hNotifyEvent == NULL);
     1499        return VINF_SUCCESS;
    14891500    }
    14901501
    14911502    BOOL bRc;
    14921503#ifdef VBOX_USB_USE_DEVICE_NOTIFICATION
    1493     bRc= PostMessage(g_VBoxUsbGlobal.hWnd, WM_QUIT, 0, 0);
     1504    bRc = PostMessage(g_VBoxUsbGlobal.hWnd, WM_QUIT, 0, 0);
    14941505    if (!bRc)
    14951506    {
     
    15031514        Assert(dwResult == WAIT_OBJECT_0);
    15041515        bRc = CloseHandle(g_VBoxUsbGlobal.hThread);
    1505         if (!bRc)
    1506         {
    1507             DWORD winEr = GetLastError();
    1508             AssertMsgFailed(("CloseHandle for hThread failed winEr(%d)\n", winEr));
    1509         }
     1516        AssertMsg(bRc, ("CloseHandle for hThread failed winEr(%d)\n", GetLastError()));
    15101517    }
    15111518
     
    15131520    {
    15141521        bRc = DeleteTimerQueueTimer(g_VBoxUsbGlobal.hTimerQueue, g_VBoxUsbGlobal.hTimer,
    1515                 INVALID_HANDLE_VALUE /* <-- to block until the timer is completed */
    1516                             );
    1517         if (!bRc)
    1518         {
    1519             DWORD winEr = GetLastError();
    1520             AssertMsgFailed(("DeleteTimerQueueEx failed winEr(%d)\n", winEr));
    1521         }
     1522                                    INVALID_HANDLE_VALUE); /* <-- to block until the timer is completed */
     1523        AssertMsg(bRc, ("DeleteTimerQueueTimer failed winEr(%d)\n", GetLastError()));
    15221524    }
    15231525
     
    15251527    {
    15261528        bRc = DeleteTimerQueueEx(g_VBoxUsbGlobal.hTimerQueue,
    1527                 INVALID_HANDLE_VALUE /* <-- to block until all timers are completed */
    1528                 );
    1529         if (!bRc)
    1530         {
    1531             DWORD winEr = GetLastError();
    1532             AssertMsgFailed(("DeleteTimerQueueEx failed winEr(%d)\n", winEr));
    1533         }
    1534     }
    1535 #endif
     1529                                 INVALID_HANDLE_VALUE); /* <-- to block until all timers are completed */
     1530        AssertMsg(bRc, ("DeleteTimerQueueEx failed winEr(%d)\n", GetLastError()));
     1531    }
     1532#endif /* VBOX_USB_USE_DEVICE_NOTIFICATION */
    15361533
    15371534    bRc = CloseHandle(g_VBoxUsbGlobal.hMonitor);
    1538     if (!bRc)
    1539     {
    1540         DWORD winEr = GetLastError();
    1541         AssertMsgFailed(("CloseHandle for hMonitor failed winEr(%d)\n", winEr));
    1542     }
    1543 
     1535    AssertMsg(bRc, ("CloseHandle for hMonitor failed winEr(%d)\n", GetLastError()));
     1536    g_VBoxUsbGlobal.hMonitor = INVALID_HANDLE_VALUE;
     1537         
    15441538    bRc = CloseHandle(g_VBoxUsbGlobal.hInterruptEvent);
    1545     if (!bRc)
    1546     {
    1547         DWORD winEr = GetLastError();
    1548         AssertMsgFailed(("CloseHandle for hInterruptEvent failed winEr(%d)\n", winEr));
    1549     }
     1539    AssertMsg(bRc, ("CloseHandle for hInterruptEvent failed lasterr=%u\n", GetLastError()));
     1540    g_VBoxUsbGlobal.hInterruptEvent = NULL;
    15501541
    15511542    bRc = CloseHandle(g_VBoxUsbGlobal.hNotifyEvent);
    1552     if (!bRc)
    1553     {
    1554         DWORD winEr = GetLastError();
    1555         AssertMsgFailed(("CloseHandle for hNotifyEvent failed winEr(%d)\n", winEr));
    1556     }
     1543    AssertMsg(bRc, ("CloseHandle for hNotifyEvent failed winEr(%d)\n", GetLastError()));
     1544    g_VBoxUsbGlobal.hNotifyEvent = NULL;
    15571545
    15581546    return VINF_SUCCESS;
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