- Less STDCALL, more WINAPI/NTAPI/APIENTRY
[reactos.git] / reactos / subsystems / win32 / win32k / ntuser / display.c
1 /*
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
7 *
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <w32k.h>
13
14 #define NDEBUG
15 #include <debug.h>
16
17 #define SIZEOF_DEVMODEW_300 188
18 #define SIZEOF_DEVMODEW_400 212
19 #define SIZEOF_DEVMODEW_500 220
20
21 /* PUBLIC FUNCTIONS ***********************************************************/
22
23 NTSTATUS
24 APIENTRY
25 NtUserEnumDisplaySettings(
26 PUNICODE_STRING pusDeviceName,
27 DWORD iModeNum,
28 LPDEVMODEW lpDevMode, /* FIXME is this correct? */
29 DWORD dwFlags )
30 {
31 NTSTATUS Status;
32 LPDEVMODEW pSafeDevMode;
33 PUNICODE_STRING pusSafeDeviceName = NULL;
34 UNICODE_STRING usSafeDeviceName;
35 USHORT Size = 0, ExtraSize = 0;
36
37 /* Copy the devmode */
38 _SEH_TRY
39 {
40 ProbeForRead(lpDevMode, sizeof(DEVMODEW), 1);
41 Size = lpDevMode->dmSize;
42 ExtraSize = lpDevMode->dmDriverExtra;
43 }
44 _SEH_HANDLE
45 {
46 DPRINT("FIXME ? : Out of range of DEVMODEW size \n");
47 _SEH_YIELD(return _SEH_GetExceptionCode());
48 }
49 _SEH_END;
50
51 if (Size != sizeof(DEVMODEW))
52 {
53 return STATUS_BUFFER_TOO_SMALL;
54 }
55
56 pSafeDevMode = ExAllocatePool(PagedPool, Size + ExtraSize);
57 if (pSafeDevMode == NULL)
58 {
59 return STATUS_NO_MEMORY;
60 }
61 pSafeDevMode->dmSize = Size;
62 pSafeDevMode->dmDriverExtra = ExtraSize;
63
64 /* Copy the device name */
65 if (pusDeviceName != NULL)
66 {
67 Status = IntSafeCopyUnicodeString(&usSafeDeviceName, pusDeviceName);
68 if (!NT_SUCCESS(Status))
69 {
70 ExFreePool(pSafeDevMode);
71 return Status;
72 }
73 pusSafeDeviceName = &usSafeDeviceName;
74 }
75
76 /* Call internal function */
77 Status = IntEnumDisplaySettings(pusSafeDeviceName, iModeNum, pSafeDevMode, dwFlags);
78
79 if (pusSafeDeviceName != NULL)
80 RtlFreeUnicodeString(pusSafeDeviceName);
81
82 if (!NT_SUCCESS(Status))
83 {
84 ExFreePool(pSafeDevMode);
85 return Status;
86 }
87
88 /* Copy some information back */
89 _SEH_TRY
90 {
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;
97
98 /* output private/extra driver data */
99 if (ExtraSize > 0)
100 {
101 memcpy((PCHAR)lpDevMode + Size, (PCHAR)pSafeDevMode + Size, ExtraSize);
102 }
103 }
104 _SEH_HANDLE
105 {
106 Status = _SEH_GetExceptionCode();
107 }
108 _SEH_END;
109
110 ExFreePool(pSafeDevMode);
111 return Status;
112 }
113
114
115 LONG
116 APIENTRY
117 NtUserChangeDisplaySettings(
118 PUNICODE_STRING lpszDeviceName,
119 LPDEVMODEW lpDevMode,
120 HWND hwnd,
121 DWORD dwflags,
122 LPVOID lParam)
123 {
124 NTSTATUS Status;
125 DEVMODEW DevMode;
126 PUNICODE_STRING pSafeDeviceName = NULL;
127 UNICODE_STRING SafeDeviceName;
128 LONG Ret;
129
130 /* Check arguments */
131 #ifdef CDS_VIDEOPARAMETERS
132
133 if (dwflags != CDS_VIDEOPARAMETERS && lParam != NULL)
134 #else
135
136 if (lParam != NULL)
137 #endif
138
139 {
140 SetLastWin32Error(ERROR_INVALID_PARAMETER);
141 return DISP_CHANGE_BADPARAM;
142 }
143 if (hwnd != NULL)
144 {
145 SetLastWin32Error(ERROR_INVALID_PARAMETER);
146 return DISP_CHANGE_BADPARAM;
147 }
148
149 /* Copy devmode */
150 Status = MmCopyFromCaller(&DevMode.dmSize, &lpDevMode->dmSize, sizeof (DevMode.dmSize));
151 if (!NT_SUCCESS(Status))
152 {
153 SetLastNtError(Status);
154 return DISP_CHANGE_BADPARAM;
155 }
156 DevMode.dmSize = min(sizeof (DevMode), DevMode.dmSize);
157 Status = MmCopyFromCaller(&DevMode, lpDevMode, DevMode.dmSize);
158 if (!NT_SUCCESS(Status))
159 {
160 SetLastNtError(Status);
161 return DISP_CHANGE_BADPARAM;
162 }
163 if (DevMode.dmDriverExtra > 0)
164 {
165 DbgPrint("(%s:%i) WIN32K: %s lpDevMode->dmDriverExtra is IGNORED!\n", __FILE__, __LINE__, __FUNCTION__);
166 DevMode.dmDriverExtra = 0;
167 }
168
169 /* Copy the device name */
170 if (lpszDeviceName != NULL)
171 {
172 Status = IntSafeCopyUnicodeString(&SafeDeviceName, lpszDeviceName);
173 if (!NT_SUCCESS(Status))
174 {
175 SetLastNtError(Status);
176 return DISP_CHANGE_BADPARAM;
177 }
178 pSafeDeviceName = &SafeDeviceName;
179 }
180
181 /* Call internal function */
182 Ret = IntChangeDisplaySettings(pSafeDeviceName, &DevMode, dwflags, lParam);
183
184 if (pSafeDeviceName != NULL)
185 RtlFreeUnicodeString(pSafeDeviceName);
186
187 return Ret;
188 }
189