5139eaa8ad0fb217b1814036993d98e932c33a96
[reactos.git] / win32ss / gdi / ntgdi / print.c
1 /*
2 * PROJECT: ReactOS win32 kernel mode subsystem
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: win32ss/gdi/ntgdi/print.c
5 * PURPOSE: Print functions
6 * PROGRAMMER:
7 */
8
9 #include <win32k.h>
10
11 #define NDEBUG
12 #include <debug.h>
13
14 INT
15 APIENTRY
16 NtGdiAbortDoc(HDC hDC)
17 {
18 UNIMPLEMENTED;
19 return 0;
20 }
21
22 INT
23 APIENTRY
24 NtGdiEndDoc(HDC hDC)
25 {
26 UNIMPLEMENTED;
27 return 0;
28 }
29
30 INT
31 APIENTRY
32 NtGdiEndPage(HDC hDC)
33 {
34 UNIMPLEMENTED;
35 return 0;
36 }
37
38 INT
39 FASTCALL
40 IntGdiEscape(PDC dc,
41 INT Escape,
42 INT InSize,
43 LPCSTR InData,
44 LPVOID OutData)
45 {
46 if (Escape == QUERYESCSUPPORT)
47 return FALSE;
48
49 UNIMPLEMENTED;
50 return SP_ERROR;
51 }
52
53 INT
54 APIENTRY
55 NtGdiEscape(HDC hDC,
56 INT Escape,
57 INT InSize,
58 LPCSTR InData,
59 LPVOID OutData)
60 {
61 PDC dc;
62 INT ret;
63
64 dc = DC_LockDc(hDC);
65 if (dc == NULL)
66 {
67 EngSetLastError(ERROR_INVALID_HANDLE);
68 return SP_ERROR;
69 }
70
71 /* TODO: FIXME: Don't pass umode buffer to an Int function */
72 ret = IntGdiEscape(dc, Escape, InSize, InData, OutData);
73
74 DC_UnlockDc( dc );
75 return ret;
76 }
77
78 INT
79 APIENTRY
80 IntGdiExtEscape(
81 PDC dc,
82 INT Escape,
83 INT InSize,
84 LPCSTR InData,
85 INT OutSize,
86 LPSTR OutData)
87 {
88 SURFACE *psurf;
89 INT Result;
90
91 if ((dc->ppdev->DriverFunctions.Escape == NULL) ||
92 (dc->dclevel.pSurface == NULL))
93 {
94 Result = 0;
95 }
96 else
97 {
98 DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
99 psurf = dc->dclevel.pSurface;
100
101 Result = dc->ppdev->DriverFunctions.Escape(
102 &psurf->SurfObj,
103 Escape,
104 InSize,
105 (PVOID)InData,
106 OutSize,
107 (PVOID)OutData );
108
109 DC_vFinishBlit(dc, NULL);
110 }
111
112 return Result;
113 }
114
115 INT
116 APIENTRY
117 NtGdiExtEscape(
118 HDC hDC,
119 IN OPTIONAL PWCHAR pDriver,
120 IN INT nDriver,
121 INT Escape,
122 INT InSize,
123 OPTIONAL LPSTR UnsafeInData,
124 INT OutSize,
125 OPTIONAL LPSTR UnsafeOutData)
126 {
127 PDC pDC;
128 LPVOID SafeInData = NULL;
129 LPVOID SafeOutData = NULL;
130 NTSTATUS Status = STATUS_SUCCESS;
131 INT Result;
132
133 if (hDC == 0)
134 {
135 hDC = UserGetWindowDC(NULL);
136 }
137
138 pDC = DC_LockDc(hDC);
139 if ( pDC == NULL )
140 {
141 EngSetLastError(ERROR_INVALID_HANDLE);
142 return -1;
143 }
144
145 if ( InSize && UnsafeInData )
146 {
147 _SEH2_TRY
148 {
149 ProbeForRead(UnsafeInData,
150 InSize,
151 1);
152 }
153 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
154 {
155 Status = _SEH2_GetExceptionCode();
156 }
157 _SEH2_END;
158
159 if (!NT_SUCCESS(Status))
160 {
161 DC_UnlockDc(pDC);
162 SetLastNtError(Status);
163 return -1;
164 }
165
166 SafeInData = ExAllocatePoolWithTag ( PagedPool, InSize, GDITAG_TEMP );
167 if ( !SafeInData )
168 {
169 DC_UnlockDc(pDC);
170 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
171 return -1;
172 }
173
174 _SEH2_TRY
175 {
176 /* Pointers were already probed! */
177 RtlCopyMemory(SafeInData,
178 UnsafeInData,
179 InSize);
180 }
181 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
182 {
183 Status = _SEH2_GetExceptionCode();
184 }
185 _SEH2_END;
186
187 if ( !NT_SUCCESS(Status) )
188 {
189 ExFreePoolWithTag ( SafeInData, GDITAG_TEMP );
190 DC_UnlockDc(pDC);
191 SetLastNtError(Status);
192 return -1;
193 }
194 }
195
196 if ( OutSize && UnsafeOutData )
197 {
198 _SEH2_TRY
199 {
200 ProbeForWrite(UnsafeOutData,
201 OutSize,
202 1);
203 }
204 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
205 {
206 Status = _SEH2_GetExceptionCode();
207 }
208 _SEH2_END;
209
210 if (!NT_SUCCESS(Status))
211 {
212 SetLastNtError(Status);
213 goto freeout;
214 }
215
216 SafeOutData = ExAllocatePoolWithTag ( PagedPool, OutSize, GDITAG_TEMP );
217 if ( !SafeOutData )
218 {
219 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
220 freeout:
221 if ( SafeInData )
222 ExFreePoolWithTag ( SafeInData, GDITAG_TEMP );
223 DC_UnlockDc(pDC);
224 return -1;
225 }
226 }
227
228 Result = IntGdiExtEscape ( pDC, Escape, InSize, SafeInData, OutSize, SafeOutData );
229
230 DC_UnlockDc(pDC);
231
232 if ( SafeInData )
233 ExFreePoolWithTag ( SafeInData ,GDITAG_TEMP );
234
235 if ( SafeOutData )
236 {
237 _SEH2_TRY
238 {
239 /* Pointers were already probed! */
240 RtlCopyMemory(UnsafeOutData,
241 SafeOutData,
242 OutSize);
243 }
244 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
245 {
246 Status = _SEH2_GetExceptionCode();
247 }
248 _SEH2_END;
249
250 ExFreePoolWithTag ( SafeOutData, GDITAG_TEMP );
251 if ( !NT_SUCCESS(Status) )
252 {
253 SetLastNtError(Status);
254 return -1;
255 }
256 }
257
258 return Result;
259 }
260
261 INT
262 APIENTRY
263 NtGdiStartDoc(
264 IN HDC hdc,
265 IN DOCINFOW *pdi,
266 OUT BOOL *pbBanding,
267 IN INT iJob)
268 {
269 UNIMPLEMENTED;
270 return 0;
271 }
272
273 INT
274 APIENTRY
275 NtGdiStartPage(HDC hDC)
276 {
277 UNIMPLEMENTED;
278 return 0;
279 }
280 /* EOF */