VirtualBox

Changeset 70211 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Dec 19, 2017 2:52:38 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119795
Message:

VBoxControl: Made it work on NT 3.50 (just for fun).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxControl/VBoxControl.cpp

    r70061 r70211  
    239239#if defined(RT_OS_WINDOWS) && !defined(VBOX_CONTROL_TEST)
    240240
    241 LONG (WINAPI * gpfnChangeDisplaySettingsEx)(LPCTSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam);
     241decltype(ChangeDisplaySettingsExA) *g_pfnChangeDisplaySettingsExA;
     242decltype(ChangeDisplaySettings)    *g_pfnChangeDisplaySettingsA;
     243decltype(EnumDisplaySettingsA)     *g_pfnEnumDisplaySettingsA;
    242244
    243245static unsigned nextAdjacentRectXP(RECTL const *paRects, unsigned cRects, unsigned iRect)
     
    487489            RT_BZERO(&paDeviceModes[DevNum], sizeof(DEVMODE));
    488490            paDeviceModes[DevNum].dmSize = sizeof(DEVMODE);
    489             if (!EnumDisplaySettings((LPSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &paDeviceModes[DevNum]))
     491            if (!g_pfnEnumDisplaySettingsA((LPSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &paDeviceModes[DevNum]))
    490492            {
    491493                Log(("EnumDisplaySettings err %d\n", GetLastError()));
     
    542544    RT_ZERO(tempDevMode);
    543545    tempDevMode.dmSize = sizeof(DEVMODE);
    544     EnumDisplaySettings(NULL, 0xffffff, &tempDevMode);
     546    g_pfnEnumDisplaySettingsA(NULL, 0xffffff, &tempDevMode);
    545547
    546548    /* Assign the new rectangles to displays. */
     
    560562            paDeviceModes[i].dmBitsPerPel = BitsPerPixel;
    561563        }
    562         Log(("calling pfnChangeDisplaySettingsEx %x\n", gpfnChangeDisplaySettingsEx));
    563         gpfnChangeDisplaySettingsEx((LPSTR)paDisplayDevices[i].DeviceName,
    564                  &paDeviceModes[i], NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
    565         Log(("ChangeDisplaySettings position err %d\n", GetLastError()));
     564        Log(("calling pfnChangeDisplaySettingsEx %p\n", g_pfnChangeDisplaySettingsExA));
     565        g_pfnChangeDisplaySettingsExA((LPSTR)paDisplayDevices[i].DeviceName,
     566                                      &paDeviceModes[i], NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
     567        Log(("ChangeDisplaySettingsEx position err %d\n", GetLastError()));
    566568    }
    567569
    568570    /* A second call to ChangeDisplaySettings updates the monitor. */
    569     LONG status = ChangeDisplaySettings(NULL, 0);
     571    LONG status = g_pfnChangeDisplaySettingsA(NULL, 0);
    570572    Log(("ChangeDisplaySettings update status %d\n", status));
    571573    if (status == DISP_CHANGE_SUCCESSFUL || status == DISP_CHANGE_BADMODE)
     
    594596        scr = atoi(argv[3]);
    595597
    596     HMODULE hUser = GetModuleHandle("user32.dll");
    597     if (hUser)
    598     {
    599         *(uintptr_t *)&gpfnChangeDisplaySettingsEx = (uintptr_t)GetProcAddress(hUser, "ChangeDisplaySettingsExA");
    600         Log(("VBoxService: pChangeDisplaySettingsEx = %p\n", gpfnChangeDisplaySettingsEx));
    601 
    602         if (gpfnChangeDisplaySettingsEx)
     598    HMODULE hmodUser = GetModuleHandle("user32.dll");
     599    if (hmodUser)
     600    {
     601        /* ChangeDisplaySettingsExA was probably added in W2K, whereas ChangeDisplaySettingsA
     602           and EnumDisplaySettingsA was added in NT 3.51. */
     603        g_pfnChangeDisplaySettingsExA = (decltype(g_pfnChangeDisplaySettingsExA))GetProcAddress(hmodUser, "ChangeDisplaySettingsExA");
     604        g_pfnChangeDisplaySettingsA   = (decltype(g_pfnChangeDisplaySettingsA))  GetProcAddress(hmodUser, "ChangeDisplaySettingsA");
     605        g_pfnEnumDisplaySettingsA     = (decltype(g_pfnEnumDisplaySettingsA))    GetProcAddress(hmodUser, "EnumDisplaySettingsA");
     606
     607        Log(("VBoxService: g_pfnChangeDisplaySettingsExA=%p g_pfnChangeDisplaySettingsA=%p g_pfnEnumDisplaySettingsA=%p\n",
     608             g_pfnChangeDisplaySettingsExA, g_pfnChangeDisplaySettingsA, g_pfnEnumDisplaySettingsA));
     609
     610        if (   g_pfnChangeDisplaySettingsExA
     611            && g_pfnChangeDisplaySettingsA
     612            && g_pfnEnumDisplaySettingsA)
    603613        {
    604614            /* The screen index is 0 based in the ResizeDisplayDevice call. */
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