mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Added safe copy from user.
svn path=/trunk/; revision=4302
This commit is contained in:
parent
a8e0023bb0
commit
3cacdf6d55
4 changed files with 113 additions and 40 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: stubs.c,v 1.13 2003/01/25 23:09:40 ei Exp $
|
||||
/* $Id: stubs.c,v 1.14 2003/03/14 22:48:32 ei Exp $
|
||||
*
|
||||
* reactos/lib/gdi32/misc/stubs.c
|
||||
*
|
||||
|
@ -2089,20 +2089,6 @@ DPtoLP(
|
|||
|
||||
|
||||
|
||||
BOOL
|
||||
STDCALL
|
||||
LPtoDP(
|
||||
HDC a0,
|
||||
LPPOINT a1,
|
||||
int a2
|
||||
)
|
||||
{
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL
|
||||
STDCALL
|
||||
Polygon(
|
||||
|
|
|
@ -197,4 +197,13 @@ RealizePalette(
|
|||
}
|
||||
|
||||
|
||||
|
||||
BOOL
|
||||
STDCALL
|
||||
LPtoDP(
|
||||
HDC a0,
|
||||
LPPOINT a1,
|
||||
int a2
|
||||
)
|
||||
{
|
||||
return W32kLPtoDP(a0, a1, a2);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: window.c,v 1.30 2003/03/12 08:26:54 rcampbell Exp $
|
||||
/* $Id: window.c,v 1.31 2003/03/14 22:48:32 ei Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -24,9 +24,12 @@
|
|||
#include <include/msgqueue.h>
|
||||
#include <include/rect.h>
|
||||
|
||||
#define NDEBUG
|
||||
//#define NDEBUG
|
||||
#include <win32k/debug1.h>
|
||||
#include <debug.h>
|
||||
|
||||
#define TAG_WNAM TAG('W', 'N', 'A', 'M')
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
HWND STDCALL
|
||||
|
@ -156,20 +159,35 @@ W32kReleaseWindowObject(PWINDOW_OBJECT Window)
|
|||
ObmDereferenceObject(Window);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Internal function.
|
||||
* Returns client window rectangle relative to the upper-left corner of client area.
|
||||
*
|
||||
* \note Does not check the validity of the parameters
|
||||
*/
|
||||
VOID
|
||||
W32kGetClientRect(PWINDOW_OBJECT WindowObject, PRECT Rect)
|
||||
{
|
||||
ASSERT( WindowObject );
|
||||
ASSERT( Rect );
|
||||
|
||||
Rect->left = Rect->top = 0;
|
||||
Rect->right = WindowObject->ClientRect.right - WindowObject->ClientRect.left;
|
||||
Rect->bottom =
|
||||
WindowObject->ClientRect.bottom - WindowObject->ClientRect.top;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Internal Function.
|
||||
* Return the dimension of the window in the screen coordinates.
|
||||
*/
|
||||
BOOL STDCALL
|
||||
W32kGetWindowRect(HWND hWnd, LPRECT Rect)
|
||||
{
|
||||
PWINDOW_OBJECT WindowObject;
|
||||
|
||||
ASSERT( Rect );
|
||||
|
||||
WindowObject = W32kGetWindowObject(hWnd);
|
||||
if (WindowObject == NULL)
|
||||
{
|
||||
|
@ -184,12 +202,31 @@ W32kGetWindowRect(HWND hWnd, LPRECT Rect)
|
|||
return(TRUE);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Return the dimension of the window in the screen coordinates.
|
||||
* \param hWnd window handle.
|
||||
* \param Rect pointer to the buffer where the coordinates are returned.
|
||||
*/
|
||||
BOOL STDCALL
|
||||
NtUserGetWindowRect(HWND hWnd, LPRECT Rect)
|
||||
{
|
||||
return(W32kGetWindowRect(hWnd, Rect));
|
||||
RECT SafeRect;
|
||||
BOOL bRet;
|
||||
|
||||
bRet = W32kGetWindowRect(hWnd, &SafeRect);
|
||||
if (! NT_SUCCESS(MmCopyToCaller(Rect, &SafeRect, sizeof(RECT)))){
|
||||
return(FALSE);
|
||||
}
|
||||
return( bRet );
|
||||
}
|
||||
|
||||
/*!
|
||||
* Returns client window rectangle relative to the upper-left corner of client area.
|
||||
*
|
||||
* \param hWnd window handle.
|
||||
* \param Rect pointer to the buffer where the coordinates are returned.
|
||||
*
|
||||
*/
|
||||
BOOL STDCALL
|
||||
NtUserGetClientRect(HWND hWnd, LPRECT Rect)
|
||||
{
|
||||
|
@ -230,15 +267,17 @@ HWND
|
|||
W32kGetFocusWindow(VOID)
|
||||
{
|
||||
PUSER_MESSAGE_QUEUE Queue;
|
||||
Queue = (PUSER_MESSAGE_QUEUE)W32kGetActiveDesktop()->ActiveMessageQueue;
|
||||
PDESKTOP_OBJECT pdo = W32kGetActiveDesktop();
|
||||
|
||||
if( !pdo )
|
||||
return NULL;
|
||||
|
||||
Queue = (PUSER_MESSAGE_QUEUE)pdo->ActiveMessageQueue;
|
||||
|
||||
if (Queue == NULL)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(Queue->FocusWindow);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -249,6 +288,9 @@ W32kGetWindowProc(HWND Wnd)
|
|||
WNDPROC WndProc;
|
||||
|
||||
WindowObject = W32kGetWindowObject(Wnd);
|
||||
if( !WindowObject )
|
||||
return NULL;
|
||||
|
||||
WndProc = WindowObject->Class->Class.lpfnWndProc;
|
||||
W32kReleaseWindowObject(Wnd);
|
||||
return(WndProc);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: coord.c,v 1.8 2002/07/13 21:37:26 ei Exp $
|
||||
/* $Id: coord.c,v 1.9 2003/03/14 22:48:31 ei Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -13,34 +13,38 @@
|
|||
#include <ddk/ntddk.h>
|
||||
#include <win32k/coord.h>
|
||||
#include <win32k/dc.h>
|
||||
|
||||
//#define NDEBUG
|
||||
#include <win32k/debug1.h>
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
BOOL STDCALL W32kCombineTransform(LPXFORM XFormResult,
|
||||
CONST LPXFORM xform1,
|
||||
CONST LPXFORM xform2)
|
||||
BOOL STDCALL W32kCombineTransform(LPXFORM UnsafeXFormResult,
|
||||
CONST LPXFORM Unsafexform1,
|
||||
CONST LPXFORM Unsafexform2)
|
||||
{
|
||||
XFORM xformTemp;
|
||||
XFORM xform1, xform2;
|
||||
|
||||
/* Check for illegal parameters */
|
||||
if (!XFormResult || !xform1 || !xform2)
|
||||
if (!UnsafeXFormResult || !Unsafexform1 || !Unsafexform2)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MmCopyFromCaller( &xform1, Unsafexform1, sizeof(XFORM) );
|
||||
MmCopyFromCaller( &xform2, Unsafexform2, sizeof(XFORM) );
|
||||
|
||||
/* Create the result in a temporary XFORM, since xformResult may be
|
||||
* equal to xform1 or xform2 */
|
||||
xformTemp.eM11 = xform1->eM11 * xform2->eM11 + xform1->eM12 * xform2->eM21;
|
||||
xformTemp.eM12 = xform1->eM11 * xform2->eM12 + xform1->eM12 * xform2->eM22;
|
||||
xformTemp.eM21 = xform1->eM21 * xform2->eM11 + xform1->eM22 * xform2->eM21;
|
||||
xformTemp.eM22 = xform1->eM21 * xform2->eM12 + xform1->eM22 * xform2->eM22;
|
||||
xformTemp.eDx = xform1->eDx * xform2->eM11 + xform1->eDy * xform2->eM21 + xform2->eDx;
|
||||
xformTemp.eDy = xform1->eDx * xform2->eM12 + xform1->eDy * xform2->eM22 + xform2->eDy;
|
||||
xformTemp.eM11 = xform1.eM11 * xform2.eM11 + xform1.eM12 * xform2.eM21;
|
||||
xformTemp.eM12 = xform1.eM11 * xform2.eM12 + xform1.eM12 * xform2.eM22;
|
||||
xformTemp.eM21 = xform1.eM21 * xform2.eM11 + xform1.eM22 * xform2.eM21;
|
||||
xformTemp.eM22 = xform1.eM21 * xform2.eM12 + xform1.eM22 * xform2.eM22;
|
||||
xformTemp.eDx = xform1.eDx * xform2.eM11 + xform1.eDy * xform2.eM21 + xform2.eDx;
|
||||
xformTemp.eDy = xform1.eDx * xform2.eM12 + xform1.eDy * xform2.eM22 + xform2.eDy;
|
||||
|
||||
/* Copy the result to xformResult */
|
||||
*XFormResult = xformTemp;
|
||||
MmCopyToCaller( UnsafeXFormResult, &xformTemp, sizeof(XFORM) );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -57,13 +61,25 @@ FLOAT x, y;
|
|||
y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Converts points from device coordinates into logical coordinates. Conversion depends on the mapping mode,
|
||||
* world transfrom, viewport origin settings for the given device context.
|
||||
* \param hDC device context.
|
||||
* \param Points an array of POINT structures (in/out).
|
||||
* \param Count number of elements in the array of POINT structures.
|
||||
* \return TRUE if success.
|
||||
*/
|
||||
BOOL STDCALL
|
||||
W32kDPtoLP(HDC hDC,
|
||||
LPPOINT Points,
|
||||
LPPOINT UnsafePoints,
|
||||
int Count)
|
||||
{
|
||||
PDC Dc;
|
||||
ULONG i;
|
||||
LPPOINT Points = (LPPOINT) ExAllocatePool( PagedPool, Count*sizeof(POINT));
|
||||
|
||||
ASSERT(Points);
|
||||
MmCopyFromCaller( Points, UnsafePoints, Count*sizeof(POINT) );
|
||||
|
||||
Dc = DC_HandleToPtr (hDC);
|
||||
if (Dc == NULL || !Dc->w.vport2WorldValid)
|
||||
|
@ -76,6 +92,8 @@ W32kDPtoLP(HDC hDC,
|
|||
CoordDPtoLP(Dc, &Points[i]);
|
||||
}
|
||||
DC_ReleasePtr( hDC );
|
||||
|
||||
MmCopyToCaller( UnsafePoints, Points, Count*sizeof(POINT) );
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
@ -130,11 +148,23 @@ CoordLPtoDP(PDC Dc, LPPOINT Point)
|
|||
y * Dc->w.xformWorld2Vport.eM22 + Dc->w.xformWorld2Vport.eDy;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Converts points from logical coordinates into device coordinates. Conversion depends on the mapping mode,
|
||||
* world transfrom, viewport origin settings for the given device context.
|
||||
* \param hDC device context.
|
||||
* \param Points an array of POINT structures (in/out).
|
||||
* \param Count number of elements in the array of POINT structures.
|
||||
* \return TRUE if success.
|
||||
*/
|
||||
BOOL STDCALL
|
||||
W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count)
|
||||
W32kLPtoDP(HDC hDC, LPPOINT UnsafePoints, INT Count)
|
||||
{
|
||||
PDC Dc;
|
||||
ULONG i;
|
||||
LPPOINT Points = (LPPOINT) ExAllocatePool( PagedPool, Count*sizeof(POINT));
|
||||
|
||||
ASSERT(Points);
|
||||
MmCopyFromCaller( Points, UnsafePoints, Count*sizeof(POINT) );
|
||||
|
||||
Dc = DC_HandleToPtr (hDC);
|
||||
if (Dc == NULL)
|
||||
|
@ -147,16 +177,22 @@ W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count)
|
|||
CoordLPtoDP(Dc, &Points[i]);
|
||||
}
|
||||
DC_ReleasePtr( hDC );
|
||||
MmCopyToCaller( UnsafePoints, Points, Count*sizeof(POINT) );
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
BOOL
|
||||
STDCALL
|
||||
W32kModifyWorldTransform(HDC hDC,
|
||||
CONST LPXFORM XForm,
|
||||
CONST LPXFORM UnsafeXForm,
|
||||
DWORD Mode)
|
||||
{
|
||||
PDC dc;
|
||||
LPXFORM XForm = (LPXFORM) ExAllocatePool( PagedPool, sizeof( XFORM ) );
|
||||
|
||||
ASSERT( XForm );
|
||||
|
||||
MmCopyFromCaller( XForm, UnsafeXForm, sizeof( XFORM ) );
|
||||
|
||||
dc = DC_HandleToPtr (hDC);
|
||||
if (!dc)
|
||||
|
|
Loading…
Reference in a new issue