- 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
This commit is contained in:
Jérôme Gardou 2010-05-28 21:58:33 +00:00
parent de271b9b4f
commit 5e6e009cd6
2 changed files with 13 additions and 10 deletions

View file

@ -457,7 +457,6 @@ ChangeDisplaySettingsExA(
LONG rc; LONG rc;
UNICODE_STRING DeviceName; UNICODE_STRING DeviceName;
PUNICODE_STRING pDeviceName = &DeviceName; PUNICODE_STRING pDeviceName = &DeviceName;
LPDEVMODEW pDevModeW;
if (lpszDeviceName != NULL) if (lpszDeviceName != NULL)
{ {
@ -471,14 +470,19 @@ ChangeDisplaySettingsExA(
pDeviceName = NULL; pDeviceName = NULL;
if (lpDevMode != NULL) if (lpDevMode != NULL)
{
LPDEVMODEW pDevModeW;
pDevModeW = GdiConvertToDevmodeW(lpDevMode); pDevModeW = GdiConvertToDevmodeW(lpDevMode);
if(pDevModeW)
{
rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
}
else
rc = DISP_CHANGE_SUCCESSFUL;
}
else else
pDevModeW = NULL; rc = NtUserChangeDisplaySettings ( pDeviceName, NULL, hwnd, dwflags, lParam );
rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
if (pDevModeW != NULL)
RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
if (lpszDeviceName != NULL) if (lpszDeviceName != NULL)
RtlFreeUnicodeString ( &DeviceName ); RtlFreeUnicodeString ( &DeviceName );
@ -539,6 +543,6 @@ ChangeDisplaySettingsW(
DWORD dwflags) DWORD dwflags)
{ {
if(lpDevMode) if(lpDevMode)
lpDevMode->dmDriverExtra = 0; lpDevMode->dmDriverExtra = 0;
return ChangeDisplaySettingsExW ( NULL, lpDevMode, NULL, dwflags, 0 ); return ChangeDisplaySettingsExW ( NULL, lpDevMode, NULL, dwflags, 0 );
} }

View file

@ -708,7 +708,7 @@ UserChangeDisplaySettings(
} }
} }
else if (pdm->dmSize < FIELD_OFFSET(DEVMODEW, dmFields)) else if (pdm->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
return DISP_CHANGE_FAILED; return DISP_CHANGE_BADMODE; /* This is what winXP SP3 returns */
else else
dm = *pdm; dm = *pdm;
@ -899,7 +899,6 @@ NtUserChangeDisplaySettings(
/* Probe and copy the full DEVMODE */ /* Probe and copy the full DEVMODE */
ProbeForRead(lpDevMode, dmLocal.dmSize, 1); ProbeForRead(lpDevMode, dmLocal.dmSize, 1);
RtlCopyMemory(&dmLocal, lpDevMode, dmLocal.dmSize); RtlCopyMemory(&dmLocal, lpDevMode, dmLocal.dmSize);
dmLocal.dmSize = sizeof(dmLocal);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {