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
;
44 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
46 DPRINT("FIXME ? : Out of range of DEVMODEW size \n");
47 _SEH2_YIELD(return _SEH2_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
);
104 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
106 Status
= _SEH2_GetExceptionCode();
110 ExFreePool(pSafeDevMode
);
117 NtUserChangeDisplaySettings(
118 PUNICODE_STRING lpszDeviceName
,
119 LPDEVMODEW lpDevMode
,
124 NTSTATUS Status
= STATUS_SUCCESS
;
125 LPDEVMODEW lpSafeDevMode
= NULL
;
127 PUNICODE_STRING pSafeDeviceName
= NULL
;
128 UNICODE_STRING SafeDeviceName
;
131 /* Check arguments */
132 #ifdef CDS_VIDEOPARAMETERS
134 if (dwflags
!= CDS_VIDEOPARAMETERS
&& lParam
!= NULL
)
141 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
142 return DISP_CHANGE_BADPARAM
;
146 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
147 return DISP_CHANGE_BADPARAM
;
151 if (lpDevMode
!= NULL
)
155 ProbeForRead(lpDevMode
, sizeof(DevMode
.dmSize
), 1);
156 DevMode
.dmSize
= lpDevMode
->dmSize
;
157 DevMode
.dmSize
= min(sizeof(DevMode
), DevMode
.dmSize
);
158 ProbeForRead(lpDevMode
, DevMode
.dmSize
, 1);
159 RtlCopyMemory(&DevMode
, lpDevMode
, DevMode
.dmSize
);
161 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
163 Status
= _SEH2_GetExceptionCode();
166 if (!NT_SUCCESS(Status
))
168 SetLastNtError(Status
);
169 return DISP_CHANGE_BADPARAM
;
171 if (DevMode
.dmDriverExtra
> 0)
173 DPRINT1("lpDevMode->dmDriverExtra is IGNORED!\n");
174 DevMode
.dmDriverExtra
= 0;
176 lpSafeDevMode
= &DevMode
;
179 /* Copy the device name */
180 if (lpszDeviceName
!= NULL
)
182 Status
= IntSafeCopyUnicodeString(&SafeDeviceName
, lpszDeviceName
);
183 if (!NT_SUCCESS(Status
))
185 SetLastNtError(Status
);
186 return DISP_CHANGE_BADPARAM
;
188 pSafeDeviceName
= &SafeDeviceName
;
191 /* Call internal function */
192 Ret
= IntChangeDisplaySettings(pSafeDeviceName
, lpSafeDevMode
, dwflags
, lParam
);
194 if (pSafeDeviceName
!= NULL
)
195 RtlFreeUnicodeString(pSafeDeviceName
);