Index: /trunk/src/VBox/Additions/common/VBoxControl/VBoxControl.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxControl/VBoxControl.cpp	(revision 70210)
+++ /trunk/src/VBox/Additions/common/VBoxControl/VBoxControl.cpp	(revision 70211)
@@ -239,5 +239,7 @@
 #if defined(RT_OS_WINDOWS) && !defined(VBOX_CONTROL_TEST)
 
-LONG (WINAPI * gpfnChangeDisplaySettingsEx)(LPCTSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam);
+decltype(ChangeDisplaySettingsExA) *g_pfnChangeDisplaySettingsExA;
+decltype(ChangeDisplaySettings)    *g_pfnChangeDisplaySettingsA;
+decltype(EnumDisplaySettingsA)     *g_pfnEnumDisplaySettingsA;
 
 static unsigned nextAdjacentRectXP(RECTL const *paRects, unsigned cRects, unsigned iRect)
@@ -487,5 +489,5 @@
             RT_BZERO(&paDeviceModes[DevNum], sizeof(DEVMODE));
             paDeviceModes[DevNum].dmSize = sizeof(DEVMODE);
-            if (!EnumDisplaySettings((LPSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &paDeviceModes[DevNum]))
+            if (!g_pfnEnumDisplaySettingsA((LPSTR)DisplayDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &paDeviceModes[DevNum]))
             {
                 Log(("EnumDisplaySettings err %d\n", GetLastError()));
@@ -542,5 +544,5 @@
     RT_ZERO(tempDevMode);
     tempDevMode.dmSize = sizeof(DEVMODE);
-    EnumDisplaySettings(NULL, 0xffffff, &tempDevMode);
+    g_pfnEnumDisplaySettingsA(NULL, 0xffffff, &tempDevMode);
 
     /* Assign the new rectangles to displays. */
@@ -560,12 +562,12 @@
             paDeviceModes[i].dmBitsPerPel = BitsPerPixel;
         }
-        Log(("calling pfnChangeDisplaySettingsEx %x\n", gpfnChangeDisplaySettingsEx));
-        gpfnChangeDisplaySettingsEx((LPSTR)paDisplayDevices[i].DeviceName,
-                 &paDeviceModes[i], NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
-        Log(("ChangeDisplaySettings position err %d\n", GetLastError()));
+        Log(("calling pfnChangeDisplaySettingsEx %p\n", g_pfnChangeDisplaySettingsExA));
+        g_pfnChangeDisplaySettingsExA((LPSTR)paDisplayDevices[i].DeviceName,
+                                      &paDeviceModes[i], NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
+        Log(("ChangeDisplaySettingsEx position err %d\n", GetLastError()));
     }
 
     /* A second call to ChangeDisplaySettings updates the monitor. */
-    LONG status = ChangeDisplaySettings(NULL, 0);
+    LONG status = g_pfnChangeDisplaySettingsA(NULL, 0);
     Log(("ChangeDisplaySettings update status %d\n", status));
     if (status == DISP_CHANGE_SUCCESSFUL || status == DISP_CHANGE_BADMODE)
@@ -594,11 +596,19 @@
         scr = atoi(argv[3]);
 
-    HMODULE hUser = GetModuleHandle("user32.dll");
-    if (hUser)
-    {
-        *(uintptr_t *)&gpfnChangeDisplaySettingsEx = (uintptr_t)GetProcAddress(hUser, "ChangeDisplaySettingsExA");
-        Log(("VBoxService: pChangeDisplaySettingsEx = %p\n", gpfnChangeDisplaySettingsEx));
-
-        if (gpfnChangeDisplaySettingsEx)
+    HMODULE hmodUser = GetModuleHandle("user32.dll");
+    if (hmodUser)
+    {
+        /* ChangeDisplaySettingsExA was probably added in W2K, whereas ChangeDisplaySettingsA
+           and EnumDisplaySettingsA was added in NT 3.51. */
+        g_pfnChangeDisplaySettingsExA = (decltype(g_pfnChangeDisplaySettingsExA))GetProcAddress(hmodUser, "ChangeDisplaySettingsExA");
+        g_pfnChangeDisplaySettingsA   = (decltype(g_pfnChangeDisplaySettingsA))  GetProcAddress(hmodUser, "ChangeDisplaySettingsA");
+        g_pfnEnumDisplaySettingsA     = (decltype(g_pfnEnumDisplaySettingsA))    GetProcAddress(hmodUser, "EnumDisplaySettingsA");
+
+        Log(("VBoxService: g_pfnChangeDisplaySettingsExA=%p g_pfnChangeDisplaySettingsA=%p g_pfnEnumDisplaySettingsA=%p\n",
+             g_pfnChangeDisplaySettingsExA, g_pfnChangeDisplaySettingsA, g_pfnEnumDisplaySettingsA));
+
+        if (   g_pfnChangeDisplaySettingsExA
+            && g_pfnChangeDisplaySettingsA
+            && g_pfnEnumDisplaySettingsA)
         {
             /* The screen index is 0 based in the ResizeDisplayDevice call. */
