VirtualBox

Ignore:
Timestamp:
Jun 14, 2007 4:18:18 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
21993
Message:

Added the display index parameter to the SetVideoModeHint (in the guest all hints are still processed only for the primary monitor).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxService/VBoxService.cpp

    r3109 r3110  
    420420}
    421421
    422 static bool isVBoxDisplayDriverActive (void)
     422static bool isVBoxDisplayDriverActive (TCHAR *paszDeviceName)
    423423{
    424424    bool result = false;
     
    452452            {
    453453                DDCLOG(("VBox display driver is active.\n"));
     454                strcpy (paszDeviceName, dispDevice.DeviceName);
    454455                result = true;
    455456            }
     
    463464
    464465        devNum++;
     466    }
     467
     468    return result;
     469}
     470
     471static LPCTSTR vboxQueryMonitorName (TCHAR *DeviceName, TCHAR *MonitorName, INT idx)
     472{
     473    LPCTSTR result = NULL;
     474
     475    DISPLAY_DEVICE dispDevice;
     476#ifdef DEBUG_DISPLAY_CHANGE
     477    FillMemory(&dispDevice, sizeof(DISPLAY_DEVICE), 0);
     478
     479    dispDevice.cb = sizeof(DISPLAY_DEVICE);
     480   
     481    INT devNum = 0;
     482
     483    while (EnumDisplayDevices(DeviceName,
     484                              devNum,
     485                              &dispDevice,
     486                              0))
     487    {
     488        DDCLOG(("DevNum:%d\nName:%s\nString:%s\nID:%s\nKey:%s\nFlags=%08X\n\n",
     489                      devNum,
     490                      &dispDevice.DeviceName[0],
     491                      &dispDevice.DeviceString[0],
     492                      &dispDevice.DeviceID[0],
     493                      &dispDevice.DeviceKey[0],
     494                      dispDevice.StateFlags));
     495
     496        FillMemory(&dispDevice, sizeof(DISPLAY_DEVICE), 0);
     497
     498        dispDevice.cb = sizeof(DISPLAY_DEVICE);
     499
     500        devNum++;
     501    }
     502#endif /* DEBUG_DISPLAY_CHANGE */
     503
     504    FillMemory(&dispDevice, sizeof(DISPLAY_DEVICE), 0);
     505
     506    dispDevice.cb = sizeof(DISPLAY_DEVICE);
     507
     508    DDCLOG(("VBoxService: vboxQueryMonitorName: DeviceName: %s, idx %d (sizeof (TCHAR) %d)\n", DeviceName, idx, sizeof (TCHAR)));
     509
     510    if (EnumDisplayDevices(DeviceName,
     511                           idx,
     512                           &dispDevice,
     513                           0))
     514    {
     515        DDCLOG(("DevNum:%d\nName:%s\nString:%s\nID:%s\nKey:%s\nFlags=%08X\n\n",
     516                      devNum,
     517                      &dispDevice.DeviceName[0],
     518                      &dispDevice.DeviceString[0],
     519                      &dispDevice.DeviceID[0],
     520                      &dispDevice.DeviceKey[0],
     521                      dispDevice.StateFlags));
     522
     523        strcpy (MonitorName, dispDevice.DeviceName);
     524        result = &MonitorName[0];
    465525    }
    466526
     
    477537    VBoxGuestFilterMaskInfo maskInfo;
    478538    DWORD cbReturned;
     539   
     540    typedef LONG WINAPI defChangeDisplaySettingsEx(LPCTSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam);
     541    typedef BOOL WINAPI defEnumDisplaySettingsEx(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode, DWORD dwFlags);
     542   
     543    defChangeDisplaySettingsEx *pChangeDisplaySettingsEx = NULL;
     544    defEnumDisplaySettingsEx *pEnumDisplaySettingsEx = NULL;
     545
     546    HMODULE hUser = GetModuleHandle("USER32");
     547
     548    if (hUser)
     549    {
     550        pChangeDisplaySettingsEx = (defChangeDisplaySettingsEx *)GetProcAddress(hUser, "ChangeDisplaySettingsExA");
     551        pEnumDisplaySettingsEx = (defEnumDisplaySettingsEx *)GetProcAddress(hUser, "EnumDisplaySettingsExA");
     552        DDCLOG(("VBoxService: pChangeDisplaySettingsEx = %p, pEnumDisplaySettingsEx = %p\n", pChangeDisplaySettingsEx, pEnumDisplaySettingsEx));
     553    }
    479554
    480555    maskInfo.u32OrMask = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
     
    518593                {
    519594                    /* get the display change request */
    520                     VMMDevDisplayChangeRequest displayChangeRequest = {0};
    521                     displayChangeRequest.header.size        = sizeof(VMMDevDisplayChangeRequest);
     595                    VMMDevDisplayChangeRequest2 displayChangeRequest = {0};
     596                    displayChangeRequest.header.size        = sizeof(VMMDevDisplayChangeRequest2);
    522597                    displayChangeRequest.header.version     = VMMDEV_REQUEST_HEADER_VERSION;
    523                     displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest;
     598                    displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest2;
    524599                    displayChangeRequest.eventAck           = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
    525                     if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &displayChangeRequest, sizeof(displayChangeRequest),
    526                                         &displayChangeRequest, sizeof(displayChangeRequest), &cbReturned, NULL))
     600                    BOOL fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2),
     601                                                                 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2), &cbReturned, NULL);
     602                    if (!fDisplayChangeQueried)
    527603                    {
    528                         DDCLOG(("VBoxService: VMMDevReq_GetDisplayChangeRequest: %dx%dx%d\n", displayChangeRequest.xres, displayChangeRequest.yres, displayChangeRequest.bpp));
     604                        /* Try the old version of the request for old VBox hosts. */
     605                        displayChangeRequest.header.size        = sizeof(VMMDevDisplayChangeRequest);
     606                        displayChangeRequest.header.version     = VMMDEV_REQUEST_HEADER_VERSION;
     607                        displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest;
     608                        displayChangeRequest.eventAck           = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
     609                        fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest),
     610                                                                 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest), &cbReturned, NULL);
     611                        displayChangeRequest.display = 0;
     612                    }
     613                    if (fDisplayChangeQueried)
     614                    {
     615                        DDCLOG(("VBoxService: VMMDevReq_GetDisplayChangeRequest2: %dx%dx%d at %d\n", displayChangeRequest.xres, displayChangeRequest.yres, displayChangeRequest.bpp, displayChangeRequest.display));
    529616
    530617                        /*
    531618                         * Only try to change video mode if the active display driver is VBox additions.
    532619                         */
    533                         if (isVBoxDisplayDriverActive ())
     620                        TCHAR DeviceName[32];
     621                        if (isVBoxDisplayDriverActive (DeviceName))
    534622                        {
     623                            TCHAR MonitorName[32];
     624                            LPCTSTR lpszDeviceName = NULL;
     625                            if (displayChangeRequest.display > 0 && pChangeDisplaySettingsEx != NULL)
     626                            {
     627                                lpszDeviceName = vboxQueryMonitorName (DeviceName, MonitorName, displayChangeRequest.display);
     628                            }
     629
     630                            DDCLOG(("VBoxService: lpszDeviceName: %s\n", lpszDeviceName? lpszDeviceName: "(empty)"));
     631
    535632                            DEVMODE devMode;
    536 
    537                             /* get the current screen setup */
    538                             if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode))
     633                            memset (&devMode, 0, sizeof (devMode));
     634                            devMode.dmSize = sizeof(DEVMODE);
     635
     636                            /* get the current screen setup, using Ex to get dmPosition if available. */
     637                            if (pEnumDisplaySettingsEx?
     638                                    pEnumDisplaySettingsEx(lpszDeviceName, ENUM_CURRENT_SETTINGS, &devMode, 0):
     639                                    EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode))
    539640                            {
    540                                 SvcDebugOut2("VBoxService: Current mode: %dx%dx%d\n", devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel);
     641                                SvcDebugOut2("VBoxService: Current mode: %dx%dx%d at %d,%d\n", devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel, devMode.dmPosition.x, devMode.dmPosition.y);
    541642
    542643                                /* Horizontal resolution must be a multiple of 8, round down. */
     
    584685                                    devMode.dmBitsPerPel = displayChangeRequest.bpp;
    585686
     687                                if (lpszDeviceName) devMode.dmFields |= DM_POSITION;
     688
    586689                                DDCLOG(("VBoxService: setting the new mode %dx%dx%d\n", devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel));
    587690
    588691                                /* set the new mode */
    589692                                LONG status;
    590                                 status = ChangeDisplaySettings(&devMode, CDS_UPDATEREGISTRY);
     693                                status = pChangeDisplaySettingsEx?
     694                                             pChangeDisplaySettingsEx(lpszDeviceName, &devMode, NULL, CDS_UPDATEREGISTRY, NULL):
     695                                             ChangeDisplaySettings(&devMode, CDS_UPDATEREGISTRY);
    591696                                if (status != DISP_CHANGE_SUCCESSFUL)
    592697                                {
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