2 * ReactOS W32 Subsystem
3 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 NtGdiAbortDoc(HDC hDC
)
58 if (Escape
== QUERYESCSUPPORT
)
79 SetLastWin32Error(ERROR_INVALID_HANDLE
);
83 /* TODO FIXME - don't pass umode buffer to an Int function */
84 ret
= IntGdiEscape(dc
, Escape
, InSize
, InData
, OutData
);
100 if (Escape
== QUERYESCSUPPORT
)
103 DPRINT1("IntEngExtEscape is unimplemented. - Keep going and have a nice day\n");
117 SURFACE
*psurf
= SURFACE_LockSurface(dc
->rosdc
.hBitmap
);
120 /* FIXME - Handle psurf == NULL !!!!!! */
122 if ( NULL
== ((GDIDEVICE
*)dc
->ppdev
)->DriverFunctions
.Escape
)
124 Result
= IntEngExtEscape(
128 (PVOID
)((ULONG_PTR
)InData
),
134 Result
= ((GDIDEVICE
*)dc
->ppdev
)->DriverFunctions
.Escape(
142 SURFACE_UnlockSurface(psurf
);
151 IN OPTIONAL PWCHAR pDriver
,
155 OPTIONAL LPSTR UnsafeInData
,
157 OPTIONAL LPSTR UnsafeOutData
)
160 LPVOID SafeInData
= NULL
;
161 LPVOID SafeOutData
= NULL
;
162 NTSTATUS Status
= STATUS_SUCCESS
;
167 hDC
= UserGetWindowDC(NULL
);
170 pDC
= DC_LockDc(hDC
);
173 SetLastWin32Error(ERROR_INVALID_HANDLE
);
176 if ( pDC
->dctype
== DC_TYPE_INFO
)
182 if ( InSize
&& UnsafeInData
)
186 ProbeForRead(UnsafeInData
,
190 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
192 Status
= _SEH2_GetExceptionCode();
196 if (!NT_SUCCESS(Status
))
199 SetLastNtError(Status
);
203 SafeInData
= ExAllocatePoolWithTag ( PagedPool
, InSize
, TAG_PRINT
);
207 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
213 /* pointers were already probed! */
214 RtlCopyMemory(SafeInData
,
218 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
220 Status
= _SEH2_GetExceptionCode();
224 if ( !NT_SUCCESS(Status
) )
226 ExFreePoolWithTag ( SafeInData
, TAG_PRINT
);
228 SetLastNtError(Status
);
233 if ( OutSize
&& UnsafeOutData
)
237 ProbeForWrite(UnsafeOutData
,
241 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
243 Status
= _SEH2_GetExceptionCode();
247 if (!NT_SUCCESS(Status
))
249 SetLastNtError(Status
);
253 SafeOutData
= ExAllocatePoolWithTag ( PagedPool
, OutSize
, TAG_PRINT
);
256 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
259 ExFreePoolWithTag ( SafeInData
, TAG_PRINT
);
265 Result
= IntGdiExtEscape ( pDC
, Escape
, InSize
, SafeInData
, OutSize
, SafeOutData
);
270 ExFreePoolWithTag ( SafeInData
,TAG_PRINT
);
276 /* pointers were already probed! */
277 RtlCopyMemory(UnsafeOutData
,
281 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
283 Status
= _SEH2_GetExceptionCode();
287 ExFreePoolWithTag ( SafeOutData
, TAG_PRINT
);
288 if ( !NT_SUCCESS(Status
) )
290 SetLastNtError(Status
);
312 NtGdiStartPage(HDC hDC
)