[USER32]
authorJérôme Gardou <jerome.gardou@reactos.org>
Fri, 28 May 2010 21:58:33 +0000 (21:58 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Fri, 28 May 2010 21:58:33 +0000 (21:58 +0000)
  - Change ChangeDisplaySettingsExA to look more like wine's one
[WIN32K]
  - Return correct value if buffer is to small in UserChangeDisplaySettings (wine tests)
  - Do not set an invalid size to the devmode we're passing ti UserChangeDisplaySettings, we might access garbage
Now all ChangeDisplaySettings related wine tests pass.

svn path=/branches/reactos-yarotows/; revision=47386

dll/win32/user32/misc/display.c
subsystems/win32/win32k/ntuser/display.c

index 9090454..e9de23e 100644 (file)
@@ -457,7 +457,6 @@ ChangeDisplaySettingsExA(
   LONG rc;
   UNICODE_STRING DeviceName;
   PUNICODE_STRING pDeviceName = &DeviceName;
-  LPDEVMODEW pDevModeW;
 
   if (lpszDeviceName != NULL)
     {
@@ -471,14 +470,19 @@ ChangeDisplaySettingsExA(
     pDeviceName = NULL;
 
   if (lpDevMode != NULL)
+  {
+    LPDEVMODEW pDevModeW;
     pDevModeW = GdiConvertToDevmodeW(lpDevMode);
+    if(pDevModeW)
+    {
+      rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
+      RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
+    }
+    else
+      rc = DISP_CHANGE_SUCCESSFUL;
+  }
   else
-    pDevModeW = NULL;
-
-  rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
-
-  if (pDevModeW != NULL)
-    RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
+    rc = NtUserChangeDisplaySettings ( pDeviceName, NULL, hwnd, dwflags, lParam );
 
   if (lpszDeviceName != NULL)
     RtlFreeUnicodeString ( &DeviceName );
@@ -539,6 +543,6 @@ ChangeDisplaySettingsW(
   DWORD dwflags)
 {
   if(lpDevMode)
-    lpDevMode->dmDriverExtra = 0; 
+    lpDevMode->dmDriverExtra = 0;
   return ChangeDisplaySettingsExW ( NULL, lpDevMode, NULL, dwflags, 0 );
 }
index 7616abe..c9159ea 100644 (file)
@@ -708,7 +708,7 @@ UserChangeDisplaySettings(
         }
     }
     else if (pdm->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
-        return DISP_CHANGE_FAILED;
+        return DISP_CHANGE_BADMODE; /* This is what winXP SP3 returns */
     else
         dm = *pdm;
 
@@ -899,7 +899,6 @@ NtUserChangeDisplaySettings(
             /* Probe and copy the full DEVMODE */
             ProbeForRead(lpDevMode, dmLocal.dmSize, 1);
             RtlCopyMemory(&dmLocal, lpDevMode, dmLocal.dmSize);
-            dmLocal.dmSize = sizeof(dmLocal);
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {