IntChangeDisplaySettings: set last error before leaving the function

NtUserChangeDisplaySettings: copy devmode only if passed, use SEH with buffer probing over CopyFromCaller

svn path=/trunk/; revision=42464
This commit is contained in:
Gregor Schneider 2009-08-07 12:10:59 +00:00
parent 0d14376113
commit 5122d6becf
2 changed files with 29 additions and 19 deletions

View file

@ -121,7 +121,8 @@ NtUserChangeDisplaySettings(
DWORD dwflags,
LPVOID lParam)
{
NTSTATUS Status;
NTSTATUS Status = STATUS_SUCCESS;
LPDEVMODEW lpSafeDevMode = NULL;
DEVMODEW DevMode;
PUNICODE_STRING pSafeDeviceName = NULL;
UNICODE_STRING SafeDeviceName;
@ -147,23 +148,32 @@ NtUserChangeDisplaySettings(
}
/* Copy devmode */
Status = MmCopyFromCaller(&DevMode.dmSize, &lpDevMode->dmSize, sizeof (DevMode.dmSize));
if (!NT_SUCCESS(Status))
if (lpDevMode != NULL)
{
SetLastNtError(Status);
return DISP_CHANGE_BADPARAM;
}
DevMode.dmSize = min(sizeof (DevMode), DevMode.dmSize);
Status = MmCopyFromCaller(&DevMode, lpDevMode, DevMode.dmSize);
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
return DISP_CHANGE_BADPARAM;
}
if (DevMode.dmDriverExtra > 0)
{
DbgPrint("(%s:%i) WIN32K: %s lpDevMode->dmDriverExtra is IGNORED!\n", __FILE__, __LINE__, __FUNCTION__);
DevMode.dmDriverExtra = 0;
_SEH2_TRY
{
ProbeForRead(lpDevMode, sizeof(DevMode.dmSize), 1);
DevMode.dmSize = lpDevMode->dmSize;
DevMode.dmSize = min(sizeof(DevMode), DevMode.dmSize);
ProbeForRead(lpDevMode, DevMode.dmSize, 1);
RtlCopyMemory(&DevMode, lpDevMode, DevMode.dmSize);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
return DISP_CHANGE_BADPARAM;
}
if (DevMode.dmDriverExtra > 0)
{
DPRINT1("lpDevMode->dmDriverExtra is IGNORED!\n");
DevMode.dmDriverExtra = 0;
}
lpSafeDevMode = &DevMode;
}
/* Copy the device name */
@ -179,7 +189,7 @@ NtUserChangeDisplaySettings(
}
/* Call internal function */
Ret = IntChangeDisplaySettings(pSafeDeviceName, &DevMode, dwflags, lParam);
Ret = IntChangeDisplaySettings(pSafeDeviceName, lpSafeDevMode, dwflags, lParam);
if (pSafeDeviceName != NULL)
RtlFreeUnicodeString(pSafeDeviceName);

View file

@ -1229,8 +1229,8 @@ IntChangeDisplaySettings(
{
/* Dynamically change graphics mode */
DPRINT1("flag 0 UNIMPLEMENTED\n");
return DISP_CHANGE_FAILED;
SetLastWin32Error(ERROR_CALL_NOT_IMPLEMENTED);
return DISP_CHANGE_FAILED;
}
if ((dwflags & CDS_TEST) == CDS_TEST)