2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: subsystems/win32/win32k/ntuser/display.c
5 * PURPOSE: display settings
6 * COPYRIGHT: Copyright 2007 ReactOS
10 /* INCLUDES ******************************************************************/
17 #define SIZEOF_DEVMODEW_300 188
18 #define SIZEOF_DEVMODEW_400 212
19 #define SIZEOF_DEVMODEW_500 220
21 /* PUBLIC FUNCTIONS ***********************************************************/
25 NtUserEnumDisplaySettings(
26 PUNICODE_STRING pusDeviceName
,
28 LPDEVMODEW lpDevMode
, /* FIXME is this correct? */
32 LPDEVMODEW pSafeDevMode
;
33 PUNICODE_STRING pusSafeDeviceName
= NULL
;
34 UNICODE_STRING usSafeDeviceName
;
35 USHORT Size
= 0, ExtraSize
= 0;
37 /* Copy the devmode */
40 ProbeForRead(lpDevMode
, sizeof(DEVMODEW
), 1);
41 Size
= lpDevMode
->dmSize
;
42 ExtraSize
= lpDevMode
->dmDriverExtra
;
46 DPRINT("FIXME ? : Out of range of DEVMODEW size \n");
47 _SEH_YIELD(return _SEH_GetExceptionCode());
51 if (Size
!= sizeof(DEVMODEW
))
53 return STATUS_BUFFER_TOO_SMALL
;
56 pSafeDevMode
= ExAllocatePool(PagedPool
, Size
+ ExtraSize
);
57 if (pSafeDevMode
== NULL
)
59 return STATUS_NO_MEMORY
;
61 pSafeDevMode
->dmSize
= Size
;
62 pSafeDevMode
->dmDriverExtra
= ExtraSize
;
64 /* Copy the device name */
65 if (pusDeviceName
!= NULL
)
67 Status
= IntSafeCopyUnicodeString(&usSafeDeviceName
, pusDeviceName
);
68 if (!NT_SUCCESS(Status
))
70 ExFreePool(pSafeDevMode
);
73 pusSafeDeviceName
= &usSafeDeviceName
;
76 /* Call internal function */
77 Status
= IntEnumDisplaySettings(pusSafeDeviceName
, iModeNum
, pSafeDevMode
, dwFlags
);
79 if (pusSafeDeviceName
!= NULL
)
80 RtlFreeUnicodeString(pusSafeDeviceName
);
82 if (!NT_SUCCESS(Status
))
84 ExFreePool(pSafeDevMode
);
88 /* Copy some information back */
91 ProbeForWrite(lpDevMode
,Size
+ ExtraSize
, 1);
92 lpDevMode
->dmPelsWidth
= pSafeDevMode
->dmPelsWidth
;
93 lpDevMode
->dmPelsHeight
= pSafeDevMode
->dmPelsHeight
;
94 lpDevMode
->dmBitsPerPel
= pSafeDevMode
->dmBitsPerPel
;
95 lpDevMode
->dmDisplayFrequency
= pSafeDevMode
->dmDisplayFrequency
;
96 lpDevMode
->dmDisplayFlags
= pSafeDevMode
->dmDisplayFlags
;
98 /* output private/extra driver data */
101 memcpy((PCHAR
)lpDevMode
+ Size
, (PCHAR
)pSafeDevMode
+ Size
, ExtraSize
);
106 Status
= _SEH_GetExceptionCode();
110 ExFreePool(pSafeDevMode
);
117 NtUserChangeDisplaySettings(
118 PUNICODE_STRING lpszDeviceName
,
119 LPDEVMODEW lpDevMode
,
126 PUNICODE_STRING pSafeDeviceName
= NULL
;
127 UNICODE_STRING SafeDeviceName
;
130 /* Check arguments */
131 #ifdef CDS_VIDEOPARAMETERS
133 if (dwflags
!= CDS_VIDEOPARAMETERS
&& lParam
!= NULL
)
140 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
141 return DISP_CHANGE_BADPARAM
;
145 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
146 return DISP_CHANGE_BADPARAM
;
150 Status
= MmCopyFromCaller(&DevMode
.dmSize
, &lpDevMode
->dmSize
, sizeof (DevMode
.dmSize
));
151 if (!NT_SUCCESS(Status
))
153 SetLastNtError(Status
);
154 return DISP_CHANGE_BADPARAM
;
156 DevMode
.dmSize
= min(sizeof (DevMode
), DevMode
.dmSize
);
157 Status
= MmCopyFromCaller(&DevMode
, lpDevMode
, DevMode
.dmSize
);
158 if (!NT_SUCCESS(Status
))
160 SetLastNtError(Status
);
161 return DISP_CHANGE_BADPARAM
;
163 if (DevMode
.dmDriverExtra
> 0)
165 DbgPrint("(%s:%i) WIN32K: %s lpDevMode->dmDriverExtra is IGNORED!\n", __FILE__
, __LINE__
, __FUNCTION__
);
166 DevMode
.dmDriverExtra
= 0;
169 /* Copy the device name */
170 if (lpszDeviceName
!= NULL
)
172 Status
= IntSafeCopyUnicodeString(&SafeDeviceName
, lpszDeviceName
);
173 if (!NT_SUCCESS(Status
))
175 SetLastNtError(Status
);
176 return DISP_CHANGE_BADPARAM
;
178 pSafeDeviceName
= &SafeDeviceName
;
181 /* Call internal function */
182 Ret
= IntChangeDisplaySettings(pSafeDeviceName
, &DevMode
, dwflags
, lParam
);
184 if (pSafeDeviceName
!= NULL
)
185 RtlFreeUnicodeString(pSafeDeviceName
);