Index: /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp	(revision 57909)
+++ /trunk/src/VBox/Devices/Serial/DrvHostSerial.cpp	(revision 57910)
@@ -474,6 +474,5 @@
     {
         int rc = RTSemEventWait(pThis->SendSem, RT_INDEFINITE_WAIT);
-        if (RT_FAILURE(rc))
-            break;
+        AssertRCBreak(rc);
 
         /*
@@ -770,7 +769,18 @@
                 if (!ReadFile(pThis->hDeviceFile, abBuffer, sizeof(abBuffer), &dwNumberOfBytesTransferred, &pThis->overlappedRecv))
                 {
-                    rcThread = RTErrConvertFromWin32(GetLastError());
-                    LogRel(("HostSerial#%d: Read failed with error %Rrc; terminating the worker thread.\n", pDrvIns->iInstance, rcThread));
-                    break;
+                    dwRet = GetLastError();
+                    if (dwRet == ERROR_IO_PENDING)
+                    {
+                        if (GetOverlappedResult(pThis->hDeviceFile, &pThis->overlappedRecv, &dwNumberOfBytesTransferred, TRUE))
+                            dwRet = NO_ERROR;
+                        else
+                            dwRet = GetLastError();
+                    }
+                    if (dwRet != NO_ERROR)
+                    {
+                        rcThread = RTErrConvertFromWin32(dwRet);
+                        LogRel(("HostSerial#%d: Read failed with error %Rrc; terminating the worker thread.\n", pDrvIns->iInstance, rcThread));
+                        break;
+                    }
                 }
                 cbRemaining = dwNumberOfBytesTransferred;
