Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDisplay.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDisplay.cpp	(revision 68436)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDisplay.cpp	(revision 68437)
@@ -529,10 +529,10 @@
 {
     BOOL fDispAlreadyEnabled = false; /* check whether the monitor with ID is already enabled. */
-    BOOL fModeReset = (Width == 0 && Height == 0 && BitsPerPixel == 0 &&
-                       dwNewPosX == 0 && dwNewPosY == 0 && !fChangeOrigin);
+    BOOL fModeReset = (   Width == 0 && Height == 0 && BitsPerPixel == 0
+                       && dwNewPosX == 0 && dwNewPosY == 0 && !fChangeOrigin);
     DWORD dmFields = 0;
 
     LogFlowFunc(("[%d] %dx%d at %d,%d fChangeOrigin %d fEnabled %d fExtDisSup %d\n",
-          Id, Width, Height, dwNewPosX, dwNewPosY, fChangeOrigin, fEnabled, fExtDispSup));
+                 Id, Width, Height, dwNewPosX, dwNewPosY, fChangeOrigin, fEnabled, fExtDispSup));
 
     if (!pCtx->fAnyX)
@@ -566,6 +566,5 @@
         LogFlowFunc(("ResizeDisplayDevice: NumDevices(%d) != DevNum(%d)\n", NumDevices, DevNum));
 
-    DWORD i = 0;
-
+    DWORD i;
     for (i = 0; i < DevNum; ++i)
     {
@@ -649,5 +648,6 @@
      * all rect conditions are true. Thus in this case nothing has to be done.
      */
-    if (   !fModeReset && (!fEnabled == !fDispAlreadyEnabled)
+    if (   !fModeReset
+        && (!fEnabled == !fDispAlreadyEnabled)
         && paRects[Id].left                      == dwNewPosX
         && paRects[Id].top                       == dwNewPosY
@@ -770,7 +770,6 @@
     }
 
-    LogFlowFunc(("Enable And Resize Device. Id = %d, Width=%d Height=%d, \
-         dwNewPosX = %d, dwNewPosY = %d fEnabled=%d & fExtDispSupport = %d \n",
-         Id, Width, Height, dwNewPosX, dwNewPosY, fEnabled, fExtDispSup));
+    LogFlowFunc(("Enable And Resize Device. Id = %d, Width=%d Height=%d, dwNewPosX = %d, dwNewPosY = %d fEnabled=%d & fExtDispSupport = %d \n",
+                 Id, Width, Height, dwNewPosX, dwNewPosY, fEnabled, fExtDispSup));
     dwStatus = EnableAndResizeDispDev(paDeviceModes, paDisplayDevices, DevNum, Id, Width, Height, BitsPerPixel,
                                       dwNewPosX, dwNewPosY, fEnabled, fExtDispSup);
@@ -787,11 +786,12 @@
 
 /**
- * Thread function to wait for and process display change
- * requests
+ * Thread function to wait for and process display change requests.
  */
-DECLCALLBACK(int) VBoxDisplayWorker(void *pInstance, bool volatile *pfShutdown)
-{
-    AssertPtr(pInstance);
-    LogFlowFunc(("pInstance=%p\n", pInstance));
+static DECLCALLBACK(int) VBoxDisplayWorker(void *pvInstance, bool volatile *pfShutdown)
+{
+    AssertPtr(pvInstance);
+    PVBOXDISPLAYCONTEXT pCtx = (PVBOXDISPLAYCONTEXT)pvInstance;
+    AssertPtr(pCtx->pEnv);
+    LogFlowFunc(("pvInstance=%p\n", pvInstance));
 
     /*
@@ -801,17 +801,9 @@
     RTThreadUserSignal(RTThreadSelf());
 
-    PVBOXDISPLAYCONTEXT pCtx = (PVBOXDISPLAYCONTEXT)pInstance;
-
-    HANDLE gVBoxDriver = pCtx->pEnv->hDriver;
-    VBoxGuestFilterMaskInfo maskInfo;
-    DWORD cbReturned;
-
-    maskInfo.u32OrMask = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED;
-    maskInfo.u32NotMask = 0;
-    if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
-    {
-        DWORD dwErr = GetLastError();
-        LogFlowFunc(("DeviceIOControl(CtlMask - or) failed with %ld, exiting\n", dwErr));
-        return RTErrConvertFromWin32(dwErr);
+    int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED, 0 /*fNot*/);
+    if (RT_FAILURE(rc))
+    {
+        LogFlowFunc(("VbglR3CtlFilterMask(mask,0): %Rrc\n", rc));
+        return rc;
     }
 
@@ -820,104 +812,61 @@
     VBoxDispIfResizeStarted(&pCtx->pEnv->dispIf);
 
-    int rc = VINF_SUCCESS;
-
-    while (*pfShutdown == false)
-    {
-        BOOL fExtDispSup = TRUE;
-        /* Wait for a display change event. */
-        VBoxGuestWaitEventInfo waitEvent;
-        waitEvent.u32TimeoutIn   = 1000;
-        waitEvent.u32EventMaskIn = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED;
-        if (DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL))
-        {
-            /*LogFlowFunc(("DeviceIOControl succeeded\n"));*/
-
-            if (NULL == pCtx) {
-                LogFlowFunc(("Invalid context detected!\n"));
-                break;
-            }
-
-            if (NULL == pCtx->pEnv) {
-                LogFlowFunc(("Invalid context environment detected!\n"));
-                break;
-            }
-
-            /* are we supposed to stop? */
-            if (*pfShutdown)
-                break;
-
-            /* did we get the right event? */
-            if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST)
+    for (;;)
+    {
+        /*
+         * Wait for a display change event, checking for shutdown both before and after.
+         */
+        if (*pfShutdown)
+        {
+            rc = VINF_SUCCESS;
+            break;
+        }
+
+        uint32_t fEvents = 0;
+        rc = VbglR3WaitEvent(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED, 1000 /*ms*/, &fEvents);
+
+        if (*pfShutdown)
+        {
+            rc = VINF_SUCCESS;
+            break;
+        }
+
+        if (RT_SUCCESS(rc))
+        {
+            if (fEvents & VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST)
             {
                 LogFlowFunc(("going to get display change information\n"));
-                BOOL fDisplayChangeQueried;
-
-
-                /* We got at least one event. Read the requested resolution
-                 * and try to set it until success. New events will not be seen
-                 * but a new resolution will be read in this poll loop.
+
+                /*
+                 * We got at least one event. (bird: What does that mean actually?  The driver wakes us up immediately upon
+                 * receiving the event.  Or are we refering to mouse & display?  In the latter case it's misleading.)
+                 *
+                 * Read the requested resolution and try to set it until success.
+                 * New events will not be seen but a new resolution will be read in
+                 * this poll loop.
+                 *
+                 * Note! The interface we're using here was added in VBox 4.2.4.  As of 2017-08-16, this
+                 *       version has been unsupported for a long time and we therefore don't bother
+                 *       implementing fallbacks using VMMDevDisplayChangeRequest2 and VMMDevDisplayChangeRequest.
                  */
-                /* Try if extended mode display information is available from the host. */
-                VMMDevDisplayChangeRequestEx displayChangeRequest = {0};
-                fExtDispSup                             = TRUE;
-                displayChangeRequest.header.size        = sizeof(VMMDevDisplayChangeRequestEx);
-                displayChangeRequest.header.version     = VMMDEV_REQUEST_HEADER_VERSION;
-                displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequestEx;
-                displayChangeRequest.eventAck           = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
-                fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevDisplayChangeRequestEx)), &displayChangeRequest, sizeof(VMMDevDisplayChangeRequestEx),
-                                                                 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequestEx), &cbReturned, NULL);
-
-               if (!fDisplayChangeQueried)
-               {
-                    LogFlowFunc(("Extended Display Not Supported. Trying VMMDevDisplayChangeRequest2\n"));
-                    fExtDispSup = FALSE; /* Extended display Change request is not supported */
-
-                    displayChangeRequest.header.size        = sizeof(VMMDevDisplayChangeRequest2);
-                    displayChangeRequest.header.version     = VMMDEV_REQUEST_HEADER_VERSION;
-                    displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest2;
-                    displayChangeRequest.eventAck           = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
-                    fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevDisplayChangeRequest2)), &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2),
-                                                             &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2), &cbReturned, NULL);
-                    displayChangeRequest.cxOrigin = 0;
-                    displayChangeRequest.cyOrigin = 0;
-                    displayChangeRequest.fChangeOrigin = 0;
-                    displayChangeRequest.fEnabled = 1; /* Always Enabled for old VMs on Host.*/
-                }
-
-                if (!fDisplayChangeQueried)
-                {
-                    LogFlowFunc(("Extended Display Not Supported. Trying VMMDevDisplayChangeRequest\n"));
-                    fExtDispSup = FALSE; /*Extended display Change request is not supported */
-                    /* Try the old version of the request for old VBox hosts. */
-                    displayChangeRequest.header.size        = sizeof(VMMDevDisplayChangeRequest);
-                    displayChangeRequest.header.version     = VMMDEV_REQUEST_HEADER_VERSION;
-                    displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest;
-                    displayChangeRequest.eventAck           = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
-                    fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevDisplayChangeRequest)), &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest),
-                                                             &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest), &cbReturned, NULL);
-                    displayChangeRequest.display = 0;
-                    displayChangeRequest.cxOrigin = 0;
-                    displayChangeRequest.cyOrigin = 0;
-                    displayChangeRequest.fChangeOrigin = 0;
-                    displayChangeRequest.fEnabled = 1; /* Always Enabled for old VMs on Host.*/
-                }
-
-                if (fDisplayChangeQueried)
+                uint32_t cx             = 0;
+                uint32_t cy             = 0;
+                uint32_t cBits          = 0;
+                uint32_t iDisplay       = 0;
+                uint32_t cxOrigin       = 0;
+                uint32_t cyOrigin       = 0;
+                bool     fChangeOrigin  = false;
+                bool     fEnabled       = false;
+                rc = VbglR3GetDisplayChangeRequest(&cx, &cy, &cBits, &iDisplay, &cxOrigin, &cyOrigin, &fEnabled, &fChangeOrigin,
+                                                   true /*fAck*/);
+                if (RT_SUCCESS(rc))
                 {
                     /* Try to set the requested video mode. Repeat until it is successful or is rejected by the driver. */
-                    LogFlowFunc(("DisplayChangeReqEx parameters  aDisplay=%d x xRes=%d x yRes=%d x bpp=%d x SecondayMonEnb=%d x NewOriginX=%d x NewOriginY=%d x ChangeOrigin=%d\n",
-                        displayChangeRequest.display,
-                        displayChangeRequest.xres,
-                        displayChangeRequest.yres,
-                        displayChangeRequest.bpp,
-                        displayChangeRequest.fEnabled,
-                        displayChangeRequest.cxOrigin,
-                        displayChangeRequest.cyOrigin,
-                        displayChangeRequest.fChangeOrigin));
+                    LogFlowFunc(("DisplayChangeReqEx parameters  iDisplay=%d x cx=%d x cy=%d x cBits=%d x SecondayMonEnb=%d x NewOriginX=%d x NewOriginY=%d x ChangeOrigin=%d\n",
+                                 iDisplay, cx, cy, cBits, fEnabled, cxOrigin, cyOrigin, fChangeOrigin));
 
                     for (;;)
                     {
-                        VBOXDISPLAY_DRIVER_TYPE enmDriverType = getVBoxDisplayDriverType (pCtx);
-
+                        VBOXDISPLAY_DRIVER_TYPE enmDriverType = getVBoxDisplayDriverType(pCtx);
                         if (enmDriverType == VBOXDISPLAY_DRIVER_TYPE_UNKNOWN)
                         {
@@ -930,14 +879,13 @@
                             LogFlowFunc(("Detected W2K or later\n"));
                             if (!ResizeDisplayDevice(pCtx,
-                                                        displayChangeRequest.display,
-                                                        displayChangeRequest.xres,
-                                                        displayChangeRequest.yres,
-                                                        displayChangeRequest.bpp,
-                                                        displayChangeRequest.fEnabled,
-                                                        displayChangeRequest.cxOrigin,
-                                                        displayChangeRequest.cyOrigin,
-                                                        displayChangeRequest.fChangeOrigin,
-                                                        fExtDispSup
-                                                        ))
+                                                     iDisplay,
+                                                     cx,
+                                                     cy,
+                                                     cBits,
+                                                     fEnabled,
+                                                     cxOrigin,
+                                                     cyOrigin,
+                                                     fChangeOrigin,
+                                                     true /*fExtDispSup*/ ))
                             {
                                 LogFlowFunc(("ResizeDipspalyDevice return 0\n"));
@@ -949,8 +897,5 @@
                         {
                             LogFlowFunc(("Detected NT\n"));
-                            ResizeDisplayDeviceNT4(
-                                displayChangeRequest.xres,
-                                displayChangeRequest.yres,
-                                displayChangeRequest.bpp);
+                            ResizeDisplayDeviceNT4(cx, cy, cBits);
                             break;
                         }
@@ -962,5 +907,5 @@
             } // if (fDisplayChangeQueried)
 
-            if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED)
+            if (fEvents & VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED)
                 hlpReloadCursor();
         }
@@ -980,6 +925,8 @@
                 }
             }
+
             /* sleep a bit to not eat too much CPU in case the above call always fails */
-            RTThreadSleep(10);
+            if (rc != VERR_TIMEOUT)
+                RTThreadSleep(10);
         }
     }
@@ -988,8 +935,7 @@
      * Remove event filter and graphics capability report.
      */
-    maskInfo.u32OrMask = 0;
-    maskInfo.u32NotMask = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED;
-    if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
-        LogFlowFunc(("DeviceIOControl(CtlMask - not) failed\n"));
+    int rc2 = VbglR3CtlFilterMask(0 /*fOr*/, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED /*fNot*/);
+    if (RT_FAILURE(rc2))
+        LogFlowFunc(("VbglR3CtlFilterMask failed: %Rrc\n", rc2));
     PostMessage(g_hwndToolWindow, WM_VBOX_GRAPHICS_UNSUPPORTED, 0, 0);
 
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxSeamless.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxSeamless.cpp	(revision 68436)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxSeamless.cpp	(revision 68437)
@@ -371,49 +371,49 @@
  * requests
  */
-static DECLCALLBACK(int) VBoxSeamlessWorker(void *pInstance, bool volatile *pfShutdown)
-{
-    AssertPtrReturn(pInstance, VERR_INVALID_POINTER);
-    LogFlowFunc(("pInstance=%p\n", pInstance));
+static DECLCALLBACK(int) VBoxSeamlessWorker(void *pvInstance, bool volatile *pfShutdown)
+{
+    AssertPtrReturn(pvInstance, VERR_INVALID_POINTER);
+    LogFlowFunc(("pvInstance=%p\n", pvInstance));
 
     /*
-     * Tell the control thread that it can continue
-     * spawning services.
+     * Tell the control thread that it can continue spawning services.
      */
     RTThreadUserSignal(RTThreadSelf());
 
-    PVBOXSEAMLESSCONTEXT pCtx = (PVBOXSEAMLESSCONTEXT)pInstance;
-
-    HANDLE gVBoxDriver = pCtx->pEnv->hDriver;
-    VBoxGuestFilterMaskInfo maskInfo;
-    DWORD cbReturned;
-    BOOL fWasScreenSaverActive = FALSE, fRet;
-
-    maskInfo.u32OrMask = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
-    maskInfo.u32NotMask = 0;
-    if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
-    {
-        DWORD dwErr = GetLastError();
-        LogRel(("Seamless: DeviceIOControl(CtlMask) failed with %ld, exiting ...\n", dwErr));
-        return RTErrConvertFromWin32(dwErr);
-    }
-
-    int rc = VINF_SUCCESS;
-
+    int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST, 0 /*fNot*/);
+    if (RT_FAILURE(rc))
+    {
+        LogRel(("Seamless: VbglR3CtlFilterMask(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST,0) failed with %Rrc, exiting ...\n", rc));
+        return rc;
+    }
+
+    BOOL fWasScreenSaverActive = FALSE;
     for (;;)
     {
-        /* wait for a seamless change event */
-        VBoxGuestWaitEventInfo waitEvent;
-        waitEvent.u32TimeoutIn = 5000;
-        waitEvent.u32EventMaskIn = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
-        if (DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL))
-        {
-            /* are we supposed to stop? */
-            if (*pfShutdown)
-                break;
-
+        /*
+         * Wait for a seamless change event, check for shutdown both before and after.
+         */
+        if (*pfShutdown)
+        {
+            rc = VINF_SUCCESS;
+            break;
+        }
+
+        uint32_t fEvent = 0;
+        rc = VbglR3WaitEvent(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST, 5000 /*ms*/, &fEvent);
+
+        if (*pfShutdown)
+        {
+            rc = VINF_SUCCESS;
+            break;
+        }
+
+        if (RT_SUCCESS(rc))
+        {
             /* did we get the right event? */
-            if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST)
+            if (fEvent & VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST)
             {
-                /* We got at least one event. Read the requested resolution
+                /*
+                 * We got at least one event. Read the requested resolution
                  * and try to set it until success. New events will not be seen
                  * but a new resolution will be read in this poll loop.
@@ -422,52 +422,49 @@
                 {
                     /* get the seamless change request */
-                    VMMDevSeamlessChangeRequest seamlessChangeRequest = {0};
-                    vmmdevInitRequest((VMMDevRequestHeader*)&seamlessChangeRequest, VMMDevReq_GetSeamlessChangeRequest);
-                    seamlessChangeRequest.eventAck = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
-
-                    BOOL fSeamlessChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(seamlessChangeRequest)), &seamlessChangeRequest, sizeof(seamlessChangeRequest),
-                                                                 &seamlessChangeRequest, sizeof(seamlessChangeRequest), &cbReturned, NULL);
-                    if (fSeamlessChangeQueried)
+                    VMMDevSeamlessMode enmMode = (VMMDevSeamlessMode)-1;
+                    rc = VbglR3SeamlessGetLastEvent(&enmMode);
+                    if (RT_SUCCESS(rc))
                     {
-                        LogFlowFunc(("Mode changed to %d\n", seamlessChangeRequest.mode));
-
-                        switch(seamlessChangeRequest.mode)
+                        LogFlowFunc(("Mode changed to %d\n", enmMode));
+
+                        BOOL fRet;
+                        switch (enmMode)
                         {
-                        case VMMDev_Seamless_Disabled:
-                            if (fWasScreenSaverActive)
-                            {
-                                LogRel(("Seamless: Re-enabling the screensaver\n"));
-                                fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
+                            case VMMDev_Seamless_Disabled:
+                                if (fWasScreenSaverActive)
+                                {
+                                    LogRel(("Seamless: Re-enabling the screensaver\n"));
+                                    fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
+                                    if (!fRet)
+                                        LogRel(("Seamless: SystemParametersInfo SPI_SETSCREENSAVEACTIVE failed with %ld\n", GetLastError()));
+                                }
+                                PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_DISABLE, 0, 0);
+                                break;
+
+                            case VMMDev_Seamless_Visible_Region:
+                                fRet = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &fWasScreenSaverActive, 0);
+                                if (!fRet)
+                                    LogRel(("Seamless: SystemParametersInfo SPI_GETSCREENSAVEACTIVE failed with %ld\n", GetLastError()));
+
+                                if (fWasScreenSaverActive)
+                                    LogRel(("Seamless: Disabling the screensaver\n"));
+
+                                fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
                                 if (!fRet)
                                     LogRel(("Seamless: SystemParametersInfo SPI_SETSCREENSAVEACTIVE failed with %ld\n", GetLastError()));
-                            }
-                            PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_DISABLE, 0, 0);
-                            break;
-
-                        case VMMDev_Seamless_Visible_Region:
-                            fRet = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &fWasScreenSaverActive, 0);
-                            if (!fRet)
-                                LogRel(("Seamless: SystemParametersInfo SPI_GETSCREENSAVEACTIVE failed with %ld\n", GetLastError()));
-
-                            if (fWasScreenSaverActive)
-                                LogRel(("Seamless: Disabling the screensaver\n"));
-
-                            fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
-                            if (!fRet)
-                                LogRel(("Seamless: SystemParametersInfo SPI_SETSCREENSAVEACTIVE failed with %ld\n", GetLastError()));
-                            PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_ENABLE, 0, 0);
-                            break;
-
-                        case VMMDev_Seamless_Host_Window:
-                            break;
-
-                        default:
-                            AssertFailed();
-                            break;
+                                PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_ENABLE, 0, 0);
+                                break;
+
+                            case VMMDev_Seamless_Host_Window:
+                                break;
+
+                            default:
+                                AssertFailed();
+                                break;
                         }
                         break;
                     }
-                    else
-                        LogRel(("Seamless: DeviceIoControl(ChangeReq) failed with %ld\n", GetLastError()));
+
+                    LogRel(("Seamless: VbglR3SeamlessGetLastEvent() failed with %Rrc\n", rc));
 
                     if (*pfShutdown)
@@ -479,18 +476,12 @@
             }
         }
-        else
-        {
-            /* sleep a bit to not eat too much CPU in case the above call always fails */
+        /* sleep a bit to not eat too much CPU in case the above call always fails */
+        else if (rc != VERR_TIMEOUT)
             RTThreadSleep(10);
-        }
-
-        if (*pfShutdown)
-            break;
-    }
-
-    maskInfo.u32OrMask = 0;
-    maskInfo.u32NotMask = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
-    if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
-        LogRel(("Seamless: DeviceIOControl(CtlMask) failed with %ld\n", GetLastError()));
+    }
+
+    int rc2 = VbglR3CtlFilterMask(0 /*fOk*/, VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST);
+    if (RT_FAILURE(rc2))
+        LogRel(("Seamless: VbglR3CtlFilterMask(0, VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST) failed with %Rrc\n", rc));
 
     LogFlowFuncLeaveRC(rc);
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.cpp	(revision 68436)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.cpp	(revision 68437)
@@ -136,5 +136,4 @@
 *   Global Variables                                                                                                             *
 *********************************************************************************************************************************/
-HANDLE                g_hVBoxDriver;
 HANDLE                g_hStopSem;
 HANDLE                g_hSeamlessWtNotifyEvent = 0;
@@ -469,32 +468,4 @@
     }
     return false;
-}
-
-static int vboxTrayOpenBaseDriver(void)
-{
-    /* Open VBox guest driver. */
-    DWORD dwErr = ERROR_SUCCESS;
-    g_hVBoxDriver = CreateFile(VBOXGUEST_DEVICE_NAME,
-                             GENERIC_READ | GENERIC_WRITE,
-                             FILE_SHARE_READ | FILE_SHARE_WRITE,
-                             NULL,
-                             OPEN_EXISTING,
-                             FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
-                             NULL);
-    if (g_hVBoxDriver == INVALID_HANDLE_VALUE)
-    {
-        dwErr = GetLastError();
-        LogRel(("Could not open VirtualBox Guest Additions driver! Please install / start it first! Error = %08X\n", dwErr));
-    }
-    return RTErrConvertFromWin32(dwErr);
-}
-
-static void vboxTrayCloseBaseDriver(void)
-{
-    if (g_hVBoxDriver)
-    {
-        CloseHandle(g_hVBoxDriver);
-        g_hVBoxDriver = NULL;
-    }
 }
 
@@ -821,5 +792,4 @@
         VBOXSERVICEENV svcEnv;
         svcEnv.hInstance = g_hInstance;
-        svcEnv.hDriver   = g_hVBoxDriver;
 
         /* Initializes disp-if to default (XPDM) mode. */
@@ -1003,10 +973,5 @@
 
     if (RT_SUCCESS(rc))
-    {
         rc = VbglR3Init();
-        if (RT_SUCCESS(rc))
-            rc = vboxTrayOpenBaseDriver();
-    }
-
     if (RT_SUCCESS(rc))
     {
@@ -1073,5 +1038,4 @@
     }
     LogRel(("Ended\n"));
-    vboxTrayCloseBaseDriver();
 
     /* Release instance mutex. */
@@ -1624,25 +1588,8 @@
 static int VBoxAcquireGuestCaps(uint32_t fOr, uint32_t fNot, bool fCfg)
 {
-    DWORD cbReturned = 0;
-    VBoxGuestCapsAquire Info;
     Log(("VBoxAcquireGuestCaps or(0x%x), not(0x%x), cfx(%d)\n", fOr, fNot, fCfg));
-    Info.enmFlags = fCfg ? VBOXGUESTCAPSACQUIRE_FLAGS_CONFIG_ACQUIRE_MODE : VBOXGUESTCAPSACQUIRE_FLAGS_NONE;
-    Info.rc = VERR_NOT_IMPLEMENTED;
-    Info.u32OrMask = fOr;
-    Info.u32NotMask = fNot;
-    if (!DeviceIoControl(g_hVBoxDriver, VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE, &Info, sizeof(Info), &Info, sizeof(Info), &cbReturned, NULL))
-    {
-        DWORD LastErr = GetLastError();
-        LogFlowFunc(("DeviceIoControl VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE failed LastErr %d\n", LastErr));
-        return RTErrConvertFromWin32(LastErr);
-    }
-
-    int rc = Info.rc;
-    if (!RT_SUCCESS(rc))
-    {
-        LogFlowFunc(("VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE failed rc %d\n", rc));
-        return rc;
-    }
-
+    int rc = VbglR3AcquireGuestCaps(fOr, fNot, fCfg);
+    if (RT_FAILURE(rc))
+        LogFlowFunc(("VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE failed: %Rrc\n", rc));
     return rc;
 }
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.h	(revision 68436)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.h	(revision 68437)
@@ -82,6 +82,4 @@
     /** hInstance of VBoxTray. */
     HINSTANCE hInstance;
-    /** Handle of guest driver. */
-    HANDLE    hDriver;
     /* Display driver interface, XPDM - WDDM abstraction see VBOXDISPIF** definitions above */
     /** @todo r=andy Argh. Needed by the "display" + "seamless" services (which in turn get called
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxVRDP.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxVRDP.cpp	(revision 68436)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxVRDP.cpp	(revision 68437)
@@ -330,71 +330,58 @@
  * Thread function to wait for and process mode change requests
  */
-static DECLCALLBACK(int) VBoxVRDPWorker(void *pInstance, bool volatile *pfShutdown)
-{
-    AssertPtrReturn(pInstance, VERR_INVALID_POINTER);
+static DECLCALLBACK(int) VBoxVRDPWorker(void *pvInstance, bool volatile *pfShutdown)
+{
+    AssertPtrReturn(pvInstance, VERR_INVALID_POINTER);
+    PVBOXVRDPCONTEXT pCtx = (PVBOXVRDPCONTEXT)pvInstance;
 
     LogFlowFuncEnter();
 
     /*
-     * Tell the control thread that it can continue
-     * spawning services.
+     * Tell the control thread that it can continue spawning services.
      */
     RTThreadUserSignal(RTThreadSelf());
 
-    PVBOXVRDPCONTEXT pCtx = (PVBOXVRDPCONTEXT)pInstance;
-    AssertPtr(pCtx);
-
-    HANDLE gVBoxDriver = pCtx->pEnv->hDriver;
-    VBoxGuestFilterMaskInfo maskInfo;
-    DWORD cbReturned;
-
-    maskInfo.u32OrMask = VMMDEV_EVENT_VRDP;
-    maskInfo.u32NotMask = 0;
-    if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
-    {
-        DWORD dwErr = GetLastError();
-        LogFlowFunc(("DeviceIOControl(CtlMask) failed with %ld, exiting\n", dwErr));
-        return RTErrConvertFromWin32(dwErr);
-    }
-
-    int rc = VINF_SUCCESS;
+    int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_VRDP, 0 /*fNot*/);
+    if (RT_FAILURE(rc))
+    {
+        LogRel(("VbglR3CtlFilterMask(VMMDEV_EVENT_VRDP, 0) failed with %Rrc, exiting...\n"));
+        return rc;
+    }
 
     for (;;)
     {
-        /* wait for the event */
-        VBoxGuestWaitEventInfo waitEvent;
-        waitEvent.u32TimeoutIn   = 5000;
-        waitEvent.u32EventMaskIn = VMMDEV_EVENT_VRDP;
-        if (DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL))
+        /*
+         * Wait for the event, checking the shutdown flag both before and after the call.
+         */
+        if (*pfShutdown)
         {
-            /* are we supposed to stop? */
-            if (*pfShutdown)
-                break;
-
+            rc = VINF_SUCCESS;
+            break;
+        }
+
+        uint32_t fEvent = 0;
+        rc = VbglR3WaitEvent(VMMDEV_EVENT_VRDP, 5000 /*ms*/, &fEvent);
+
+        if (*pfShutdown)
+        {
+            rc = VINF_SUCCESS;
+            break;
+        }
+
+        if (RT_SUCCESS(rc))
+        {
             /* did we get the right event? */
-            if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_VRDP)
+            if (fEvent & VMMDEV_EVENT_VRDP)
             {
-                /* Call the host to get VRDP status and the experience level. */
-                VMMDevVRDPChangeRequest vrdpChangeRequest = {0};
-
-                vrdpChangeRequest.header.size            = sizeof(VMMDevVRDPChangeRequest);
-                vrdpChangeRequest.header.version         = VMMDEV_REQUEST_HEADER_VERSION;
-                vrdpChangeRequest.header.requestType     = VMMDevReq_GetVRDPChangeRequest;
-                vrdpChangeRequest.u8VRDPActive           = 0;
-                vrdpChangeRequest.u32VRDPExperienceLevel = 0;
-
-                if (DeviceIoControl (gVBoxDriver,
-                                     VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevVRDPChangeRequest)),
-                                     &vrdpChangeRequest,
-                                     sizeof(VMMDevVRDPChangeRequest),
-                                     &vrdpChangeRequest,
-                                     sizeof(VMMDevVRDPChangeRequest),
-                                     &cbReturned, NULL))
-                {
-                    LogFlowFunc(("u8VRDPActive = %d, level %d\n", vrdpChangeRequest.u8VRDPActive, vrdpChangeRequest.u32VRDPExperienceLevel));
-
-                    if (vrdpChangeRequest.u8VRDPActive)
+                bool     fActive = false;
+                uint32_t uExperienceLevel = 0;
+                rc = VbglR3VrdpGetChangeRequest(&fActive, &uExperienceLevel);
+                if (RT_SUCCESS(rc))
+                {
+                    LogFlowFunc(("u8VRDPActive = %d, level %d\n", fActive, uExperienceLevel));
+
+                    if (fActive)
                     {
-                        pCtx->level = vrdpChangeRequest.u32VRDPExperienceLevel;
+                        pCtx->level = uExperienceLevel;
                         vboxExperienceSet (pCtx->level);
 
@@ -437,24 +424,15 @@
                     /* sleep a bit to not eat too much CPU in case the above call always fails */
                     RTThreadSleep(10);
-
-                    if (*pfShutdown)
-                        break;
                 }
             }
         }
+        /* sleep a bit to not eat too much CPU in case the above call always fails */
         else
-        {
-            /* sleep a bit to not eat too much CPU in case the above call always fails */
             RTThreadSleep(50);
-
-            if (*pfShutdown)
-                break;
-        }
-    }
-
-    maskInfo.u32OrMask  = 0;
-    maskInfo.u32NotMask = VMMDEV_EVENT_VRDP;
-    if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
-        LogFlowFunc(("DeviceIOControl(CtlMask) failed\n"));
+    }
+
+    int rc2 = VbglR3CtlFilterMask(0 /*fOr*/, VMMDEV_EVENT_VRDP);
+    if (RT_FAILURE(rc2))
+        LogRel(("VbglR3CtlFilterMask(0 /*fOr*/, VMMDEV_EVENT_VRDP) failed with %Rrc\n", rc));
 
     LogFlowFuncLeaveRC(rc);
