2003-05-18 17:16:18 +00:00
|
|
|
/*
|
2011-09-20 19:41:33 +00:00
|
|
|
* PROJECT: ReactOS win32 kernel mode subsystem
|
|
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
2015-11-10 17:41:55 +00:00
|
|
|
* FILE: win32ss/gdi/ntgdi/print.c
|
2011-09-20 19:41:33 +00:00
|
|
|
* PURPOSE: Print functions
|
2012-07-31 18:40:52 +00:00
|
|
|
* PROGRAMMER:
|
2003-05-18 17:16:18 +00:00
|
|
|
*/
|
2012-07-31 18:40:52 +00:00
|
|
|
|
2010-04-26 13:58:46 +00:00
|
|
|
#include <win32k.h>
|
1999-07-23 19:57:18 +00:00
|
|
|
|
2005-06-29 07:09:25 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiAbortDoc(HDC hDC)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
2004-07-14 20:48:58 +00:00
|
|
|
return 0;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiEndDoc(HDC hDC)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
2004-07-14 20:48:58 +00:00
|
|
|
return 0;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiEndPage(HDC hDC)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
2004-07-14 20:48:58 +00:00
|
|
|
return 0;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
|
|
|
|
2004-12-12 21:58:42 +00:00
|
|
|
INT
|
|
|
|
FASTCALL
|
|
|
|
IntGdiEscape(PDC dc,
|
|
|
|
INT Escape,
|
|
|
|
INT InSize,
|
|
|
|
LPCSTR InData,
|
|
|
|
LPVOID OutData)
|
|
|
|
{
|
2005-09-13 14:46:48 +00:00
|
|
|
if (Escape == QUERYESCSUPPORT)
|
|
|
|
return FALSE;
|
|
|
|
|
2004-12-12 21:58:42 +00:00
|
|
|
UNIMPLEMENTED;
|
2005-09-13 14:46:48 +00:00
|
|
|
return SP_ERROR;
|
2004-12-12 21:58:42 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiEscape(HDC hDC,
|
2005-09-13 14:46:48 +00:00
|
|
|
INT Escape,
|
|
|
|
INT InSize,
|
|
|
|
LPCSTR InData,
|
|
|
|
LPVOID OutData)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
2004-12-12 21:58:42 +00:00
|
|
|
PDC dc;
|
|
|
|
INT ret;
|
|
|
|
|
|
|
|
dc = DC_LockDc(hDC);
|
|
|
|
if (dc == NULL)
|
|
|
|
{
|
2010-12-25 11:01:14 +00:00
|
|
|
EngSetLastError(ERROR_INVALID_HANDLE);
|
2005-09-13 14:46:48 +00:00
|
|
|
return SP_ERROR;
|
2004-12-12 21:58:42 +00:00
|
|
|
}
|
|
|
|
|
2011-12-14 04:07:06 +00:00
|
|
|
/* TODO: FIXME: Don't pass umode buffer to an Int function */
|
2004-12-12 21:58:42 +00:00
|
|
|
ret = IntGdiEscape(dc, Escape, InSize, InData, OutData);
|
|
|
|
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc( dc );
|
2004-12-12 21:58:42 +00:00
|
|
|
return ret;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
|
|
|
|
2004-02-18 02:37:18 +00:00
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2004-02-18 02:37:18 +00:00
|
|
|
IntGdiExtEscape(
|
|
|
|
PDC dc,
|
|
|
|
INT Escape,
|
|
|
|
INT InSize,
|
2004-02-08 16:16:24 +00:00
|
|
|
LPCSTR InData,
|
2004-02-18 02:37:18 +00:00
|
|
|
INT OutSize,
|
|
|
|
LPSTR OutData)
|
|
|
|
{
|
2014-12-30 19:38:41 +00:00
|
|
|
SURFACE *psurf;
|
2004-07-03 13:55:37 +00:00
|
|
|
INT Result;
|
2004-03-01 19:25:33 +00:00
|
|
|
|
2014-12-30 19:38:41 +00:00
|
|
|
if ((dc->ppdev->DriverFunctions.Escape == NULL) ||
|
|
|
|
(dc->dclevel.pSurface == NULL))
|
2004-02-18 02:37:18 +00:00
|
|
|
{
|
2010-08-16 01:29:13 +00:00
|
|
|
Result = 0;
|
2004-02-18 02:37:18 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-12-30 19:38:41 +00:00
|
|
|
DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
|
|
|
|
psurf = dc->dclevel.pSurface;
|
|
|
|
|
2009-03-20 18:02:55 +00:00
|
|
|
Result = dc->ppdev->DriverFunctions.Escape(
|
2012-07-31 18:40:52 +00:00
|
|
|
&psurf->SurfObj,
|
2004-02-18 02:37:18 +00:00
|
|
|
Escape,
|
|
|
|
InSize,
|
|
|
|
(PVOID)InData,
|
|
|
|
OutSize,
|
|
|
|
(PVOID)OutData );
|
2014-12-30 19:38:41 +00:00
|
|
|
|
|
|
|
DC_vFinishBlit(dc, NULL);
|
2004-02-18 02:37:18 +00:00
|
|
|
}
|
2004-07-03 13:55:37 +00:00
|
|
|
|
|
|
|
return Result;
|
2004-02-18 02:37:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2004-02-18 02:37:18 +00:00
|
|
|
NtGdiExtEscape(
|
|
|
|
HDC hDC,
|
2005-12-28 20:31:44 +00:00
|
|
|
IN OPTIONAL PWCHAR pDriver,
|
|
|
|
IN INT nDriver,
|
2004-02-18 02:37:18 +00:00
|
|
|
INT Escape,
|
|
|
|
INT InSize,
|
2005-12-28 20:31:44 +00:00
|
|
|
OPTIONAL LPSTR UnsafeInData,
|
2004-02-18 02:37:18 +00:00
|
|
|
INT OutSize,
|
2005-12-28 20:31:44 +00:00
|
|
|
OPTIONAL LPSTR UnsafeOutData)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
2007-09-01 13:05:33 +00:00
|
|
|
PDC pDC;
|
2004-02-18 02:37:18 +00:00
|
|
|
LPVOID SafeInData = NULL;
|
|
|
|
LPVOID SafeOutData = NULL;
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-04-02 15:08:54 +00:00
|
|
|
INT Result;
|
2004-02-08 16:16:24 +00:00
|
|
|
|
2007-09-01 13:05:33 +00:00
|
|
|
if (hDC == 0)
|
|
|
|
{
|
2008-05-07 14:11:01 +00:00
|
|
|
hDC = UserGetWindowDC(NULL);
|
2007-09-01 13:05:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pDC = DC_LockDc(hDC);
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( pDC == NULL )
|
2004-02-08 16:16:24 +00:00
|
|
|
{
|
2010-12-25 11:01:14 +00:00
|
|
|
EngSetLastError(ERROR_INVALID_HANDLE);
|
2004-02-08 16:16:24 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( InSize && UnsafeInData )
|
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_TRY
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
|
|
|
ProbeForRead(UnsafeInData,
|
|
|
|
InSize,
|
|
|
|
1);
|
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
Status = _SEH2_GetExceptionCode();
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_END;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DC_UnlockDc(pDC);
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return -1;
|
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2011-01-09 19:51:06 +00:00
|
|
|
SafeInData = ExAllocatePoolWithTag ( PagedPool, InSize, GDITAG_TEMP );
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( !SafeInData )
|
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(pDC);
|
2010-12-25 11:01:14 +00:00
|
|
|
EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
2004-02-18 02:37:18 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_TRY
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
2011-12-14 04:07:06 +00:00
|
|
|
/* Pointers were already probed! */
|
2005-07-26 12:22:55 +00:00
|
|
|
RtlCopyMemory(SafeInData,
|
|
|
|
UnsafeInData,
|
|
|
|
InSize);
|
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
Status = _SEH2_GetExceptionCode();
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_END;
|
2005-07-26 12:22:55 +00:00
|
|
|
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( !NT_SUCCESS(Status) )
|
|
|
|
{
|
2011-01-09 19:51:06 +00:00
|
|
|
ExFreePoolWithTag ( SafeInData, GDITAG_TEMP );
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(pDC);
|
2004-02-18 02:37:18 +00:00
|
|
|
SetLastNtError(Status);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( OutSize && UnsafeOutData )
|
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_TRY
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
|
|
|
ProbeForWrite(UnsafeOutData,
|
|
|
|
OutSize,
|
|
|
|
1);
|
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
Status = _SEH2_GetExceptionCode();
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_END;
|
2005-07-26 12:22:55 +00:00
|
|
|
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
goto freeout;
|
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2011-01-09 19:51:06 +00:00
|
|
|
SafeOutData = ExAllocatePoolWithTag ( PagedPool, OutSize, GDITAG_TEMP );
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( !SafeOutData )
|
|
|
|
{
|
2010-12-25 11:01:14 +00:00
|
|
|
EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
2005-07-26 12:22:55 +00:00
|
|
|
freeout:
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( SafeInData )
|
2011-01-09 19:51:06 +00:00
|
|
|
ExFreePoolWithTag ( SafeInData, GDITAG_TEMP );
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(pDC);
|
2004-02-18 02:37:18 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Result = IntGdiExtEscape ( pDC, Escape, InSize, SafeInData, OutSize, SafeOutData );
|
2004-02-08 16:16:24 +00:00
|
|
|
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(pDC);
|
2004-02-08 16:16:24 +00:00
|
|
|
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( SafeInData )
|
2011-01-09 19:51:06 +00:00
|
|
|
ExFreePoolWithTag ( SafeInData ,GDITAG_TEMP );
|
2004-02-18 02:37:18 +00:00
|
|
|
|
|
|
|
if ( SafeOutData )
|
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_TRY
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
2011-12-14 04:07:06 +00:00
|
|
|
/* Pointers were already probed! */
|
2005-07-26 12:22:55 +00:00
|
|
|
RtlCopyMemory(UnsafeOutData,
|
|
|
|
SafeOutData,
|
|
|
|
OutSize);
|
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
2005-07-26 12:22:55 +00:00
|
|
|
{
|
2008-11-30 19:28:11 +00:00
|
|
|
Status = _SEH2_GetExceptionCode();
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
2008-11-30 19:28:11 +00:00
|
|
|
_SEH2_END;
|
2005-07-26 12:22:55 +00:00
|
|
|
|
2011-01-09 19:51:06 +00:00
|
|
|
ExFreePoolWithTag ( SafeOutData, GDITAG_TEMP );
|
2004-02-18 02:37:18 +00:00
|
|
|
if ( !NT_SUCCESS(Status) )
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-02-08 16:16:24 +00:00
|
|
|
return Result;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
INT
|
2005-12-28 20:31:44 +00:00
|
|
|
APIENTRY
|
|
|
|
NtGdiStartDoc(
|
|
|
|
IN HDC hdc,
|
|
|
|
IN DOCINFOW *pdi,
|
|
|
|
OUT BOOL *pbBanding,
|
|
|
|
IN INT iJob)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
2004-07-14 20:48:58 +00:00
|
|
|
return 0;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
INT
|
2008-11-29 22:48:58 +00:00
|
|
|
APIENTRY
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiStartPage(HDC hDC)
|
1999-07-23 19:57:18 +00:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
2004-07-14 20:48:58 +00:00
|
|
|
return 0;
|
1999-07-23 19:57:18 +00:00
|
|
|
}
|
2003-05-18 17:16:18 +00:00
|
|
|
/* EOF */
|