Changeset 68437 in vbox
- Timestamp:
- Aug 17, 2017 10:18:32 AM (7 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/VBoxTray
- Files:
-
- 5 edited
-
VBoxDisplay.cpp (modified) (12 diffs)
-
VBoxSeamless.cpp (modified) (3 diffs)
-
VBoxTray.cpp (modified) (6 diffs)
-
VBoxTray.h (modified) (1 diff)
-
VBoxVRDP.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDisplay.cpp
r68375 r68437 529 529 { 530 530 BOOL fDispAlreadyEnabled = false; /* check whether the monitor with ID is already enabled. */ 531 BOOL fModeReset = ( Width == 0 && Height == 0 && BitsPerPixel == 0 &&532 dwNewPosX == 0 && dwNewPosY == 0 && !fChangeOrigin);531 BOOL fModeReset = ( Width == 0 && Height == 0 && BitsPerPixel == 0 532 && dwNewPosX == 0 && dwNewPosY == 0 && !fChangeOrigin); 533 533 DWORD dmFields = 0; 534 534 535 535 LogFlowFunc(("[%d] %dx%d at %d,%d fChangeOrigin %d fEnabled %d fExtDisSup %d\n", 536 Id, Width, Height, dwNewPosX, dwNewPosY, fChangeOrigin, fEnabled, fExtDispSup));536 Id, Width, Height, dwNewPosX, dwNewPosY, fChangeOrigin, fEnabled, fExtDispSup)); 537 537 538 538 if (!pCtx->fAnyX) … … 566 566 LogFlowFunc(("ResizeDisplayDevice: NumDevices(%d) != DevNum(%d)\n", NumDevices, DevNum)); 567 567 568 DWORD i = 0; 569 568 DWORD i; 570 569 for (i = 0; i < DevNum; ++i) 571 570 { … … 649 648 * all rect conditions are true. Thus in this case nothing has to be done. 650 649 */ 651 if ( !fModeReset && (!fEnabled == !fDispAlreadyEnabled) 650 if ( !fModeReset 651 && (!fEnabled == !fDispAlreadyEnabled) 652 652 && paRects[Id].left == dwNewPosX 653 653 && paRects[Id].top == dwNewPosY … … 770 770 } 771 771 772 LogFlowFunc(("Enable And Resize Device. Id = %d, Width=%d Height=%d, \ 773 dwNewPosX = %d, dwNewPosY = %d fEnabled=%d & fExtDispSupport = %d \n", 774 Id, Width, Height, dwNewPosX, dwNewPosY, fEnabled, fExtDispSup)); 772 LogFlowFunc(("Enable And Resize Device. Id = %d, Width=%d Height=%d, dwNewPosX = %d, dwNewPosY = %d fEnabled=%d & fExtDispSupport = %d \n", 773 Id, Width, Height, dwNewPosX, dwNewPosY, fEnabled, fExtDispSup)); 775 774 dwStatus = EnableAndResizeDispDev(paDeviceModes, paDisplayDevices, DevNum, Id, Width, Height, BitsPerPixel, 776 775 dwNewPosX, dwNewPosY, fEnabled, fExtDispSup); … … 787 786 788 787 /** 789 * Thread function to wait for and process display change 790 * requests 788 * Thread function to wait for and process display change requests. 791 789 */ 792 DECLCALLBACK(int) VBoxDisplayWorker(void *pInstance, bool volatile *pfShutdown) 793 { 794 AssertPtr(pInstance); 795 LogFlowFunc(("pInstance=%p\n", pInstance)); 790 static DECLCALLBACK(int) VBoxDisplayWorker(void *pvInstance, bool volatile *pfShutdown) 791 { 792 AssertPtr(pvInstance); 793 PVBOXDISPLAYCONTEXT pCtx = (PVBOXDISPLAYCONTEXT)pvInstance; 794 AssertPtr(pCtx->pEnv); 795 LogFlowFunc(("pvInstance=%p\n", pvInstance)); 796 796 797 797 /* … … 801 801 RTThreadUserSignal(RTThreadSelf()); 802 802 803 PVBOXDISPLAYCONTEXT pCtx = (PVBOXDISPLAYCONTEXT)pInstance; 804 805 HANDLE gVBoxDriver = pCtx->pEnv->hDriver; 806 VBoxGuestFilterMaskInfo maskInfo; 807 DWORD cbReturned; 808 809 maskInfo.u32OrMask = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED; 810 maskInfo.u32NotMask = 0; 811 if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 812 { 813 DWORD dwErr = GetLastError(); 814 LogFlowFunc(("DeviceIOControl(CtlMask - or) failed with %ld, exiting\n", dwErr)); 815 return RTErrConvertFromWin32(dwErr); 803 int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED, 0 /*fNot*/); 804 if (RT_FAILURE(rc)) 805 { 806 LogFlowFunc(("VbglR3CtlFilterMask(mask,0): %Rrc\n", rc)); 807 return rc; 816 808 } 817 809 … … 820 812 VBoxDispIfResizeStarted(&pCtx->pEnv->dispIf); 821 813 822 int rc = VINF_SUCCESS; 823 824 while (*pfShutdown == false) 825 { 826 BOOL fExtDispSup = TRUE; 827 /* Wait for a display change event. */ 828 VBoxGuestWaitEventInfo waitEvent; 829 waitEvent.u32TimeoutIn = 1000; 830 waitEvent.u32EventMaskIn = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED; 831 if (DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL)) 832 { 833 /*LogFlowFunc(("DeviceIOControl succeeded\n"));*/ 834 835 if (NULL == pCtx) { 836 LogFlowFunc(("Invalid context detected!\n")); 837 break; 838 } 839 840 if (NULL == pCtx->pEnv) { 841 LogFlowFunc(("Invalid context environment detected!\n")); 842 break; 843 } 844 845 /* are we supposed to stop? */ 846 if (*pfShutdown) 847 break; 848 849 /* did we get the right event? */ 850 if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST) 814 for (;;) 815 { 816 /* 817 * Wait for a display change event, checking for shutdown both before and after. 818 */ 819 if (*pfShutdown) 820 { 821 rc = VINF_SUCCESS; 822 break; 823 } 824 825 uint32_t fEvents = 0; 826 rc = VbglR3WaitEvent(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED, 1000 /*ms*/, &fEvents); 827 828 if (*pfShutdown) 829 { 830 rc = VINF_SUCCESS; 831 break; 832 } 833 834 if (RT_SUCCESS(rc)) 835 { 836 if (fEvents & VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST) 851 837 { 852 838 LogFlowFunc(("going to get display change information\n")); 853 BOOL fDisplayChangeQueried; 854 855 856 /* We got at least one event. Read the requested resolution 857 * and try to set it until success. New events will not be seen 858 * but a new resolution will be read in this poll loop. 839 840 /* 841 * We got at least one event. (bird: What does that mean actually? The driver wakes us up immediately upon 842 * receiving the event. Or are we refering to mouse & display? In the latter case it's misleading.) 843 * 844 * Read the requested resolution and try to set it until success. 845 * New events will not be seen but a new resolution will be read in 846 * this poll loop. 847 * 848 * Note! The interface we're using here was added in VBox 4.2.4. As of 2017-08-16, this 849 * version has been unsupported for a long time and we therefore don't bother 850 * implementing fallbacks using VMMDevDisplayChangeRequest2 and VMMDevDisplayChangeRequest. 859 851 */ 860 /* Try if extended mode display information is available from the host. */ 861 VMMDevDisplayChangeRequestEx displayChangeRequest = {0}; 862 fExtDispSup = TRUE; 863 displayChangeRequest.header.size = sizeof(VMMDevDisplayChangeRequestEx); 864 displayChangeRequest.header.version = VMMDEV_REQUEST_HEADER_VERSION; 865 displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequestEx; 866 displayChangeRequest.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; 867 fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevDisplayChangeRequestEx)), &displayChangeRequest, sizeof(VMMDevDisplayChangeRequestEx), 868 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequestEx), &cbReturned, NULL); 869 870 if (!fDisplayChangeQueried) 871 { 872 LogFlowFunc(("Extended Display Not Supported. Trying VMMDevDisplayChangeRequest2\n")); 873 fExtDispSup = FALSE; /* Extended display Change request is not supported */ 874 875 displayChangeRequest.header.size = sizeof(VMMDevDisplayChangeRequest2); 876 displayChangeRequest.header.version = VMMDEV_REQUEST_HEADER_VERSION; 877 displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest2; 878 displayChangeRequest.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; 879 fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevDisplayChangeRequest2)), &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2), 880 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2), &cbReturned, NULL); 881 displayChangeRequest.cxOrigin = 0; 882 displayChangeRequest.cyOrigin = 0; 883 displayChangeRequest.fChangeOrigin = 0; 884 displayChangeRequest.fEnabled = 1; /* Always Enabled for old VMs on Host.*/ 885 } 886 887 if (!fDisplayChangeQueried) 888 { 889 LogFlowFunc(("Extended Display Not Supported. Trying VMMDevDisplayChangeRequest\n")); 890 fExtDispSup = FALSE; /*Extended display Change request is not supported */ 891 /* Try the old version of the request for old VBox hosts. */ 892 displayChangeRequest.header.size = sizeof(VMMDevDisplayChangeRequest); 893 displayChangeRequest.header.version = VMMDEV_REQUEST_HEADER_VERSION; 894 displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest; 895 displayChangeRequest.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; 896 fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevDisplayChangeRequest)), &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest), 897 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest), &cbReturned, NULL); 898 displayChangeRequest.display = 0; 899 displayChangeRequest.cxOrigin = 0; 900 displayChangeRequest.cyOrigin = 0; 901 displayChangeRequest.fChangeOrigin = 0; 902 displayChangeRequest.fEnabled = 1; /* Always Enabled for old VMs on Host.*/ 903 } 904 905 if (fDisplayChangeQueried) 852 uint32_t cx = 0; 853 uint32_t cy = 0; 854 uint32_t cBits = 0; 855 uint32_t iDisplay = 0; 856 uint32_t cxOrigin = 0; 857 uint32_t cyOrigin = 0; 858 bool fChangeOrigin = false; 859 bool fEnabled = false; 860 rc = VbglR3GetDisplayChangeRequest(&cx, &cy, &cBits, &iDisplay, &cxOrigin, &cyOrigin, &fEnabled, &fChangeOrigin, 861 true /*fAck*/); 862 if (RT_SUCCESS(rc)) 906 863 { 907 864 /* Try to set the requested video mode. Repeat until it is successful or is rejected by the driver. */ 908 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", 909 displayChangeRequest.display, 910 displayChangeRequest.xres, 911 displayChangeRequest.yres, 912 displayChangeRequest.bpp, 913 displayChangeRequest.fEnabled, 914 displayChangeRequest.cxOrigin, 915 displayChangeRequest.cyOrigin, 916 displayChangeRequest.fChangeOrigin)); 865 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", 866 iDisplay, cx, cy, cBits, fEnabled, cxOrigin, cyOrigin, fChangeOrigin)); 917 867 918 868 for (;;) 919 869 { 920 VBOXDISPLAY_DRIVER_TYPE enmDriverType = getVBoxDisplayDriverType (pCtx); 921 870 VBOXDISPLAY_DRIVER_TYPE enmDriverType = getVBoxDisplayDriverType(pCtx); 922 871 if (enmDriverType == VBOXDISPLAY_DRIVER_TYPE_UNKNOWN) 923 872 { … … 930 879 LogFlowFunc(("Detected W2K or later\n")); 931 880 if (!ResizeDisplayDevice(pCtx, 932 displayChangeRequest.display, 933 displayChangeRequest.xres, 934 displayChangeRequest.yres, 935 displayChangeRequest.bpp, 936 displayChangeRequest.fEnabled, 937 displayChangeRequest.cxOrigin, 938 displayChangeRequest.cyOrigin, 939 displayChangeRequest.fChangeOrigin, 940 fExtDispSup 941 )) 881 iDisplay, 882 cx, 883 cy, 884 cBits, 885 fEnabled, 886 cxOrigin, 887 cyOrigin, 888 fChangeOrigin, 889 true /*fExtDispSup*/ )) 942 890 { 943 891 LogFlowFunc(("ResizeDipspalyDevice return 0\n")); … … 949 897 { 950 898 LogFlowFunc(("Detected NT\n")); 951 ResizeDisplayDeviceNT4( 952 displayChangeRequest.xres, 953 displayChangeRequest.yres, 954 displayChangeRequest.bpp); 899 ResizeDisplayDeviceNT4(cx, cy, cBits); 955 900 break; 956 901 } … … 962 907 } // if (fDisplayChangeQueried) 963 908 964 if ( waitEvent.u32EventFlagsOut& VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED)909 if (fEvents & VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED) 965 910 hlpReloadCursor(); 966 911 } … … 980 925 } 981 926 } 927 982 928 /* sleep a bit to not eat too much CPU in case the above call always fails */ 983 RTThreadSleep(10); 929 if (rc != VERR_TIMEOUT) 930 RTThreadSleep(10); 984 931 } 985 932 } … … 988 935 * Remove event filter and graphics capability report. 989 936 */ 990 maskInfo.u32OrMask = 0; 991 maskInfo.u32NotMask = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED; 992 if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 993 LogFlowFunc(("DeviceIOControl(CtlMask - not) failed\n")); 937 int rc2 = VbglR3CtlFilterMask(0 /*fOr*/, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED /*fNot*/); 938 if (RT_FAILURE(rc2)) 939 LogFlowFunc(("VbglR3CtlFilterMask failed: %Rrc\n", rc2)); 994 940 PostMessage(g_hwndToolWindow, WM_VBOX_GRAPHICS_UNSUPPORTED, 0, 0); 995 941 -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxSeamless.cpp
r63100 r68437 371 371 * requests 372 372 */ 373 static DECLCALLBACK(int) VBoxSeamlessWorker(void *p Instance, bool volatile *pfShutdown)374 { 375 AssertPtrReturn(p Instance, VERR_INVALID_POINTER);376 LogFlowFunc(("p Instance=%p\n", pInstance));373 static DECLCALLBACK(int) VBoxSeamlessWorker(void *pvInstance, bool volatile *pfShutdown) 374 { 375 AssertPtrReturn(pvInstance, VERR_INVALID_POINTER); 376 LogFlowFunc(("pvInstance=%p\n", pvInstance)); 377 377 378 378 /* 379 * Tell the control thread that it can continue 380 * spawning services. 379 * Tell the control thread that it can continue spawning services. 381 380 */ 382 381 RTThreadUserSignal(RTThreadSelf()); 383 382 384 PVBOXSEAMLESSCONTEXT pCtx = (PVBOXSEAMLESSCONTEXT)pInstance; 385 386 HANDLE gVBoxDriver = pCtx->pEnv->hDriver; 387 VBoxGuestFilterMaskInfo maskInfo; 388 DWORD cbReturned; 389 BOOL fWasScreenSaverActive = FALSE, fRet; 390 391 maskInfo.u32OrMask = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST; 392 maskInfo.u32NotMask = 0; 393 if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 394 { 395 DWORD dwErr = GetLastError(); 396 LogRel(("Seamless: DeviceIOControl(CtlMask) failed with %ld, exiting ...\n", dwErr)); 397 return RTErrConvertFromWin32(dwErr); 398 } 399 400 int rc = VINF_SUCCESS; 401 383 int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST, 0 /*fNot*/); 384 if (RT_FAILURE(rc)) 385 { 386 LogRel(("Seamless: VbglR3CtlFilterMask(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST,0) failed with %Rrc, exiting ...\n", rc)); 387 return rc; 388 } 389 390 BOOL fWasScreenSaverActive = FALSE; 402 391 for (;;) 403 392 { 404 /* wait for a seamless change event */ 405 VBoxGuestWaitEventInfo waitEvent; 406 waitEvent.u32TimeoutIn = 5000; 407 waitEvent.u32EventMaskIn = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST; 408 if (DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL)) 409 { 410 /* are we supposed to stop? */ 411 if (*pfShutdown) 412 break; 413 393 /* 394 * Wait for a seamless change event, check for shutdown both before and after. 395 */ 396 if (*pfShutdown) 397 { 398 rc = VINF_SUCCESS; 399 break; 400 } 401 402 uint32_t fEvent = 0; 403 rc = VbglR3WaitEvent(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST, 5000 /*ms*/, &fEvent); 404 405 if (*pfShutdown) 406 { 407 rc = VINF_SUCCESS; 408 break; 409 } 410 411 if (RT_SUCCESS(rc)) 412 { 414 413 /* did we get the right event? */ 415 if ( waitEvent.u32EventFlagsOut & VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST)414 if (fEvent & VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST) 416 415 { 417 /* We got at least one event. Read the requested resolution 416 /* 417 * We got at least one event. Read the requested resolution 418 418 * and try to set it until success. New events will not be seen 419 419 * but a new resolution will be read in this poll loop. … … 422 422 { 423 423 /* get the seamless change request */ 424 VMMDevSeamlessChangeRequest seamlessChangeRequest = {0}; 425 vmmdevInitRequest((VMMDevRequestHeader*)&seamlessChangeRequest, VMMDevReq_GetSeamlessChangeRequest); 426 seamlessChangeRequest.eventAck = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST; 427 428 BOOL fSeamlessChangeQueried = DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(seamlessChangeRequest)), &seamlessChangeRequest, sizeof(seamlessChangeRequest), 429 &seamlessChangeRequest, sizeof(seamlessChangeRequest), &cbReturned, NULL); 430 if (fSeamlessChangeQueried) 424 VMMDevSeamlessMode enmMode = (VMMDevSeamlessMode)-1; 425 rc = VbglR3SeamlessGetLastEvent(&enmMode); 426 if (RT_SUCCESS(rc)) 431 427 { 432 LogFlowFunc(("Mode changed to %d\n", seamlessChangeRequest.mode)); 433 434 switch(seamlessChangeRequest.mode) 428 LogFlowFunc(("Mode changed to %d\n", enmMode)); 429 430 BOOL fRet; 431 switch (enmMode) 435 432 { 436 case VMMDev_Seamless_Disabled: 437 if (fWasScreenSaverActive) 438 { 439 LogRel(("Seamless: Re-enabling the screensaver\n")); 440 fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); 433 case VMMDev_Seamless_Disabled: 434 if (fWasScreenSaverActive) 435 { 436 LogRel(("Seamless: Re-enabling the screensaver\n")); 437 fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); 438 if (!fRet) 439 LogRel(("Seamless: SystemParametersInfo SPI_SETSCREENSAVEACTIVE failed with %ld\n", GetLastError())); 440 } 441 PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_DISABLE, 0, 0); 442 break; 443 444 case VMMDev_Seamless_Visible_Region: 445 fRet = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &fWasScreenSaverActive, 0); 446 if (!fRet) 447 LogRel(("Seamless: SystemParametersInfo SPI_GETSCREENSAVEACTIVE failed with %ld\n", GetLastError())); 448 449 if (fWasScreenSaverActive) 450 LogRel(("Seamless: Disabling the screensaver\n")); 451 452 fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); 441 453 if (!fRet) 442 454 LogRel(("Seamless: SystemParametersInfo SPI_SETSCREENSAVEACTIVE failed with %ld\n", GetLastError())); 443 } 444 PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_DISABLE, 0, 0); 445 break; 446 447 case VMMDev_Seamless_Visible_Region: 448 fRet = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &fWasScreenSaverActive, 0); 449 if (!fRet) 450 LogRel(("Seamless: SystemParametersInfo SPI_GETSCREENSAVEACTIVE failed with %ld\n", GetLastError())); 451 452 if (fWasScreenSaverActive) 453 LogRel(("Seamless: Disabling the screensaver\n")); 454 455 fRet = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); 456 if (!fRet) 457 LogRel(("Seamless: SystemParametersInfo SPI_SETSCREENSAVEACTIVE failed with %ld\n", GetLastError())); 458 PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_ENABLE, 0, 0); 459 break; 460 461 case VMMDev_Seamless_Host_Window: 462 break; 463 464 default: 465 AssertFailed(); 466 break; 455 PostMessage(g_hwndToolWindow, WM_VBOX_SEAMLESS_ENABLE, 0, 0); 456 break; 457 458 case VMMDev_Seamless_Host_Window: 459 break; 460 461 default: 462 AssertFailed(); 463 break; 467 464 } 468 465 break; 469 466 } 470 else 471 LogRel(("Seamless: DeviceIoControl(ChangeReq) failed with %ld\n", GetLastError()));467 468 LogRel(("Seamless: VbglR3SeamlessGetLastEvent() failed with %Rrc\n", rc)); 472 469 473 470 if (*pfShutdown) … … 479 476 } 480 477 } 481 else 482 { 483 /* sleep a bit to not eat too much CPU in case the above call always fails */ 478 /* sleep a bit to not eat too much CPU in case the above call always fails */ 479 else if (rc != VERR_TIMEOUT) 484 480 RTThreadSleep(10); 485 } 486 487 if (*pfShutdown) 488 break; 489 } 490 491 maskInfo.u32OrMask = 0; 492 maskInfo.u32NotMask = VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST; 493 if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 494 LogRel(("Seamless: DeviceIOControl(CtlMask) failed with %ld\n", GetLastError())); 481 } 482 483 int rc2 = VbglR3CtlFilterMask(0 /*fOk*/, VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST); 484 if (RT_FAILURE(rc2)) 485 LogRel(("Seamless: VbglR3CtlFilterMask(0, VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST) failed with %Rrc\n", rc)); 495 486 496 487 LogFlowFuncLeaveRC(rc); -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.cpp
r65442 r68437 136 136 * Global Variables * 137 137 *********************************************************************************************************************************/ 138 HANDLE g_hVBoxDriver;139 138 HANDLE g_hStopSem; 140 139 HANDLE g_hSeamlessWtNotifyEvent = 0; … … 469 468 } 470 469 return false; 471 }472 473 static int vboxTrayOpenBaseDriver(void)474 {475 /* Open VBox guest driver. */476 DWORD dwErr = ERROR_SUCCESS;477 g_hVBoxDriver = CreateFile(VBOXGUEST_DEVICE_NAME,478 GENERIC_READ | GENERIC_WRITE,479 FILE_SHARE_READ | FILE_SHARE_WRITE,480 NULL,481 OPEN_EXISTING,482 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,483 NULL);484 if (g_hVBoxDriver == INVALID_HANDLE_VALUE)485 {486 dwErr = GetLastError();487 LogRel(("Could not open VirtualBox Guest Additions driver! Please install / start it first! Error = %08X\n", dwErr));488 }489 return RTErrConvertFromWin32(dwErr);490 }491 492 static void vboxTrayCloseBaseDriver(void)493 {494 if (g_hVBoxDriver)495 {496 CloseHandle(g_hVBoxDriver);497 g_hVBoxDriver = NULL;498 }499 470 } 500 471 … … 821 792 VBOXSERVICEENV svcEnv; 822 793 svcEnv.hInstance = g_hInstance; 823 svcEnv.hDriver = g_hVBoxDriver;824 794 825 795 /* Initializes disp-if to default (XPDM) mode. */ … … 1003 973 1004 974 if (RT_SUCCESS(rc)) 1005 {1006 975 rc = VbglR3Init(); 1007 if (RT_SUCCESS(rc))1008 rc = vboxTrayOpenBaseDriver();1009 }1010 1011 976 if (RT_SUCCESS(rc)) 1012 977 { … … 1073 1038 } 1074 1039 LogRel(("Ended\n")); 1075 vboxTrayCloseBaseDriver();1076 1040 1077 1041 /* Release instance mutex. */ … … 1624 1588 static int VBoxAcquireGuestCaps(uint32_t fOr, uint32_t fNot, bool fCfg) 1625 1589 { 1626 DWORD cbReturned = 0;1627 VBoxGuestCapsAquire Info;1628 1590 Log(("VBoxAcquireGuestCaps or(0x%x), not(0x%x), cfx(%d)\n", fOr, fNot, fCfg)); 1629 Info.enmFlags = fCfg ? VBOXGUESTCAPSACQUIRE_FLAGS_CONFIG_ACQUIRE_MODE : VBOXGUESTCAPSACQUIRE_FLAGS_NONE; 1630 Info.rc = VERR_NOT_IMPLEMENTED; 1631 Info.u32OrMask = fOr; 1632 Info.u32NotMask = fNot; 1633 if (!DeviceIoControl(g_hVBoxDriver, VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE, &Info, sizeof(Info), &Info, sizeof(Info), &cbReturned, NULL)) 1634 { 1635 DWORD LastErr = GetLastError(); 1636 LogFlowFunc(("DeviceIoControl VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE failed LastErr %d\n", LastErr)); 1637 return RTErrConvertFromWin32(LastErr); 1638 } 1639 1640 int rc = Info.rc; 1641 if (!RT_SUCCESS(rc)) 1642 { 1643 LogFlowFunc(("VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE failed rc %d\n", rc)); 1644 return rc; 1645 } 1646 1591 int rc = VbglR3AcquireGuestCaps(fOr, fNot, fCfg); 1592 if (RT_FAILURE(rc)) 1593 LogFlowFunc(("VBOXGUEST_IOCTL_GUEST_CAPS_ACQUIRE failed: %Rrc\n", rc)); 1647 1594 return rc; 1648 1595 } -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTray.h
r62865 r68437 82 82 /** hInstance of VBoxTray. */ 83 83 HINSTANCE hInstance; 84 /** Handle of guest driver. */85 HANDLE hDriver;86 84 /* Display driver interface, XPDM - WDDM abstraction see VBOXDISPIF** definitions above */ 87 85 /** @todo r=andy Argh. Needed by the "display" + "seamless" services (which in turn get called -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxVRDP.cpp
r63100 r68437 330 330 * Thread function to wait for and process mode change requests 331 331 */ 332 static DECLCALLBACK(int) VBoxVRDPWorker(void *pInstance, bool volatile *pfShutdown) 333 { 334 AssertPtrReturn(pInstance, VERR_INVALID_POINTER); 332 static DECLCALLBACK(int) VBoxVRDPWorker(void *pvInstance, bool volatile *pfShutdown) 333 { 334 AssertPtrReturn(pvInstance, VERR_INVALID_POINTER); 335 PVBOXVRDPCONTEXT pCtx = (PVBOXVRDPCONTEXT)pvInstance; 335 336 336 337 LogFlowFuncEnter(); 337 338 338 339 /* 339 * Tell the control thread that it can continue 340 * spawning services. 340 * Tell the control thread that it can continue spawning services. 341 341 */ 342 342 RTThreadUserSignal(RTThreadSelf()); 343 343 344 PVBOXVRDPCONTEXT pCtx = (PVBOXVRDPCONTEXT)pInstance; 345 AssertPtr(pCtx); 346 347 HANDLE gVBoxDriver = pCtx->pEnv->hDriver; 348 VBoxGuestFilterMaskInfo maskInfo; 349 DWORD cbReturned; 350 351 maskInfo.u32OrMask = VMMDEV_EVENT_VRDP; 352 maskInfo.u32NotMask = 0; 353 if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 354 { 355 DWORD dwErr = GetLastError(); 356 LogFlowFunc(("DeviceIOControl(CtlMask) failed with %ld, exiting\n", dwErr)); 357 return RTErrConvertFromWin32(dwErr); 358 } 359 360 int rc = VINF_SUCCESS; 344 int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_VRDP, 0 /*fNot*/); 345 if (RT_FAILURE(rc)) 346 { 347 LogRel(("VbglR3CtlFilterMask(VMMDEV_EVENT_VRDP, 0) failed with %Rrc, exiting...\n")); 348 return rc; 349 } 361 350 362 351 for (;;) 363 352 { 364 /* wait for the event */ 365 VBoxGuestWaitEventInfo waitEvent; 366 waitEvent.u32TimeoutIn = 5000; 367 waitEvent.u32EventMaskIn = VMMDEV_EVENT_VRDP; 368 if (DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL)) 353 /* 354 * Wait for the event, checking the shutdown flag both before and after the call. 355 */ 356 if (*pfShutdown) 369 357 { 370 /* are we supposed to stop? */ 371 if (*pfShutdown) 372 break; 373 358 rc = VINF_SUCCESS; 359 break; 360 } 361 362 uint32_t fEvent = 0; 363 rc = VbglR3WaitEvent(VMMDEV_EVENT_VRDP, 5000 /*ms*/, &fEvent); 364 365 if (*pfShutdown) 366 { 367 rc = VINF_SUCCESS; 368 break; 369 } 370 371 if (RT_SUCCESS(rc)) 372 { 374 373 /* did we get the right event? */ 375 if ( waitEvent.u32EventFlagsOut & VMMDEV_EVENT_VRDP)374 if (fEvent & VMMDEV_EVENT_VRDP) 376 375 { 377 /* Call the host to get VRDP status and the experience level. */ 378 VMMDevVRDPChangeRequest vrdpChangeRequest = {0}; 379 380 vrdpChangeRequest.header.size = sizeof(VMMDevVRDPChangeRequest); 381 vrdpChangeRequest.header.version = VMMDEV_REQUEST_HEADER_VERSION; 382 vrdpChangeRequest.header.requestType = VMMDevReq_GetVRDPChangeRequest; 383 vrdpChangeRequest.u8VRDPActive = 0; 384 vrdpChangeRequest.u32VRDPExperienceLevel = 0; 385 386 if (DeviceIoControl (gVBoxDriver, 387 VBOXGUEST_IOCTL_VMMREQUEST(sizeof(VMMDevVRDPChangeRequest)), 388 &vrdpChangeRequest, 389 sizeof(VMMDevVRDPChangeRequest), 390 &vrdpChangeRequest, 391 sizeof(VMMDevVRDPChangeRequest), 392 &cbReturned, NULL)) 393 { 394 LogFlowFunc(("u8VRDPActive = %d, level %d\n", vrdpChangeRequest.u8VRDPActive, vrdpChangeRequest.u32VRDPExperienceLevel)); 395 396 if (vrdpChangeRequest.u8VRDPActive) 376 bool fActive = false; 377 uint32_t uExperienceLevel = 0; 378 rc = VbglR3VrdpGetChangeRequest(&fActive, &uExperienceLevel); 379 if (RT_SUCCESS(rc)) 380 { 381 LogFlowFunc(("u8VRDPActive = %d, level %d\n", fActive, uExperienceLevel)); 382 383 if (fActive) 397 384 { 398 pCtx->level = vrdpChangeRequest.u32VRDPExperienceLevel;385 pCtx->level = uExperienceLevel; 399 386 vboxExperienceSet (pCtx->level); 400 387 … … 437 424 /* sleep a bit to not eat too much CPU in case the above call always fails */ 438 425 RTThreadSleep(10); 439 440 if (*pfShutdown)441 break;442 426 } 443 427 } 444 428 } 429 /* sleep a bit to not eat too much CPU in case the above call always fails */ 445 430 else 446 {447 /* sleep a bit to not eat too much CPU in case the above call always fails */448 431 RTThreadSleep(50); 449 450 if (*pfShutdown) 451 break; 452 } 453 } 454 455 maskInfo.u32OrMask = 0; 456 maskInfo.u32NotMask = VMMDEV_EVENT_VRDP; 457 if (!DeviceIoControl(gVBoxDriver, VBOXGUEST_IOCTL_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 458 LogFlowFunc(("DeviceIOControl(CtlMask) failed\n")); 432 } 433 434 int rc2 = VbglR3CtlFilterMask(0 /*fOr*/, VMMDEV_EVENT_VRDP); 435 if (RT_FAILURE(rc2)) 436 LogRel(("VbglR3CtlFilterMask(0 /*fOr*/, VMMDEV_EVENT_VRDP) failed with %Rrc\n", rc)); 459 437 460 438 LogFlowFuncLeaveRC(rc);
Note:
See TracChangeset
for help on using the changeset viewer.

