mirror of
https://github.com/reactos/reactos.git
synced 2024-07-10 22:55:05 +00:00
Added safe copy from user.
svn path=/trunk/; revision=4302
This commit is contained in:
parent
a8e0023bb0
commit
3cacdf6d55
|
@ -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
|
* 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
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
Polygon(
|
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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -24,9 +24,12 @@
|
||||||
#include <include/msgqueue.h>
|
#include <include/msgqueue.h>
|
||||||
#include <include/rect.h>
|
#include <include/rect.h>
|
||||||
|
|
||||||
#define NDEBUG
|
//#define NDEBUG
|
||||||
|
#include <win32k/debug1.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define TAG_WNAM TAG('W', 'N', 'A', 'M')
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
HWND STDCALL
|
HWND STDCALL
|
||||||
|
@ -156,20 +159,35 @@ W32kReleaseWindowObject(PWINDOW_OBJECT Window)
|
||||||
ObmDereferenceObject(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
|
VOID
|
||||||
W32kGetClientRect(PWINDOW_OBJECT WindowObject, PRECT Rect)
|
W32kGetClientRect(PWINDOW_OBJECT WindowObject, PRECT Rect)
|
||||||
{
|
{
|
||||||
|
ASSERT( WindowObject );
|
||||||
|
ASSERT( Rect );
|
||||||
|
|
||||||
Rect->left = Rect->top = 0;
|
Rect->left = Rect->top = 0;
|
||||||
Rect->right = WindowObject->ClientRect.right - WindowObject->ClientRect.left;
|
Rect->right = WindowObject->ClientRect.right - WindowObject->ClientRect.left;
|
||||||
Rect->bottom =
|
Rect->bottom =
|
||||||
WindowObject->ClientRect.bottom - WindowObject->ClientRect.top;
|
WindowObject->ClientRect.bottom - WindowObject->ClientRect.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Internal Function.
|
||||||
|
* Return the dimension of the window in the screen coordinates.
|
||||||
|
*/
|
||||||
BOOL STDCALL
|
BOOL STDCALL
|
||||||
W32kGetWindowRect(HWND hWnd, LPRECT Rect)
|
W32kGetWindowRect(HWND hWnd, LPRECT Rect)
|
||||||
{
|
{
|
||||||
PWINDOW_OBJECT WindowObject;
|
PWINDOW_OBJECT WindowObject;
|
||||||
|
|
||||||
|
ASSERT( Rect );
|
||||||
|
|
||||||
WindowObject = W32kGetWindowObject(hWnd);
|
WindowObject = W32kGetWindowObject(hWnd);
|
||||||
if (WindowObject == NULL)
|
if (WindowObject == NULL)
|
||||||
{
|
{
|
||||||
|
@ -184,12 +202,31 @@ W32kGetWindowRect(HWND hWnd, LPRECT Rect)
|
||||||
return(TRUE);
|
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
|
BOOL STDCALL
|
||||||
NtUserGetWindowRect(HWND hWnd, LPRECT Rect)
|
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
|
BOOL STDCALL
|
||||||
NtUserGetClientRect(HWND hWnd, LPRECT Rect)
|
NtUserGetClientRect(HWND hWnd, LPRECT Rect)
|
||||||
{
|
{
|
||||||
|
@ -230,15 +267,17 @@ HWND
|
||||||
W32kGetFocusWindow(VOID)
|
W32kGetFocusWindow(VOID)
|
||||||
{
|
{
|
||||||
PUSER_MESSAGE_QUEUE Queue;
|
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)
|
if (Queue == NULL)
|
||||||
{
|
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
return(Queue->FocusWindow);
|
return(Queue->FocusWindow);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -249,6 +288,9 @@ W32kGetWindowProc(HWND Wnd)
|
||||||
WNDPROC WndProc;
|
WNDPROC WndProc;
|
||||||
|
|
||||||
WindowObject = W32kGetWindowObject(Wnd);
|
WindowObject = W32kGetWindowObject(Wnd);
|
||||||
|
if( !WindowObject )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
WndProc = WindowObject->Class->Class.lpfnWndProc;
|
WndProc = WindowObject->Class->Class.lpfnWndProc;
|
||||||
W32kReleaseWindowObject(Wnd);
|
W32kReleaseWindowObject(Wnd);
|
||||||
return(WndProc);
|
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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -13,34 +13,38 @@
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <win32k/coord.h>
|
#include <win32k/coord.h>
|
||||||
#include <win32k/dc.h>
|
#include <win32k/dc.h>
|
||||||
|
|
||||||
//#define NDEBUG
|
//#define NDEBUG
|
||||||
#include <win32k/debug1.h>
|
#include <win32k/debug1.h>
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
BOOL STDCALL W32kCombineTransform(LPXFORM XFormResult,
|
BOOL STDCALL W32kCombineTransform(LPXFORM UnsafeXFormResult,
|
||||||
CONST LPXFORM xform1,
|
CONST LPXFORM Unsafexform1,
|
||||||
CONST LPXFORM xform2)
|
CONST LPXFORM Unsafexform2)
|
||||||
{
|
{
|
||||||
XFORM xformTemp;
|
XFORM xformTemp;
|
||||||
|
XFORM xform1, xform2;
|
||||||
|
|
||||||
/* Check for illegal parameters */
|
/* Check for illegal parameters */
|
||||||
if (!XFormResult || !xform1 || !xform2)
|
if (!UnsafeXFormResult || !Unsafexform1 || !Unsafexform2)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MmCopyFromCaller( &xform1, Unsafexform1, sizeof(XFORM) );
|
||||||
|
MmCopyFromCaller( &xform2, Unsafexform2, sizeof(XFORM) );
|
||||||
|
|
||||||
/* Create the result in a temporary XFORM, since xformResult may be
|
/* Create the result in a temporary XFORM, since xformResult may be
|
||||||
* equal to xform1 or xform2 */
|
* equal to xform1 or xform2 */
|
||||||
xformTemp.eM11 = xform1->eM11 * xform2->eM11 + xform1->eM12 * xform2->eM21;
|
xformTemp.eM11 = xform1.eM11 * xform2.eM11 + xform1.eM12 * xform2.eM21;
|
||||||
xformTemp.eM12 = xform1->eM11 * xform2->eM12 + xform1->eM12 * xform2->eM22;
|
xformTemp.eM12 = xform1.eM11 * xform2.eM12 + xform1.eM12 * xform2.eM22;
|
||||||
xformTemp.eM21 = xform1->eM21 * xform2->eM11 + xform1->eM22 * xform2->eM21;
|
xformTemp.eM21 = xform1.eM21 * xform2.eM11 + xform1.eM22 * xform2.eM21;
|
||||||
xformTemp.eM22 = xform1->eM21 * xform2->eM12 + xform1->eM22 * xform2->eM22;
|
xformTemp.eM22 = xform1.eM21 * xform2.eM12 + xform1.eM22 * xform2.eM22;
|
||||||
xformTemp.eDx = xform1->eDx * xform2->eM11 + xform1->eDy * xform2->eM21 + xform2->eDx;
|
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.eDy = xform1.eDx * xform2.eM12 + xform1.eDy * xform2.eM22 + xform2.eDy;
|
||||||
|
|
||||||
/* Copy the result to xformResult */
|
/* Copy the result to xformResult */
|
||||||
*XFormResult = xformTemp;
|
MmCopyToCaller( UnsafeXFormResult, &xformTemp, sizeof(XFORM) );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -57,13 +61,25 @@ FLOAT x, y;
|
||||||
y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy;
|
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
|
BOOL STDCALL
|
||||||
W32kDPtoLP(HDC hDC,
|
W32kDPtoLP(HDC hDC,
|
||||||
LPPOINT Points,
|
LPPOINT UnsafePoints,
|
||||||
int Count)
|
int Count)
|
||||||
{
|
{
|
||||||
PDC Dc;
|
PDC Dc;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
LPPOINT Points = (LPPOINT) ExAllocatePool( PagedPool, Count*sizeof(POINT));
|
||||||
|
|
||||||
|
ASSERT(Points);
|
||||||
|
MmCopyFromCaller( Points, UnsafePoints, Count*sizeof(POINT) );
|
||||||
|
|
||||||
Dc = DC_HandleToPtr (hDC);
|
Dc = DC_HandleToPtr (hDC);
|
||||||
if (Dc == NULL || !Dc->w.vport2WorldValid)
|
if (Dc == NULL || !Dc->w.vport2WorldValid)
|
||||||
|
@ -76,6 +92,8 @@ W32kDPtoLP(HDC hDC,
|
||||||
CoordDPtoLP(Dc, &Points[i]);
|
CoordDPtoLP(Dc, &Points[i]);
|
||||||
}
|
}
|
||||||
DC_ReleasePtr( hDC );
|
DC_ReleasePtr( hDC );
|
||||||
|
|
||||||
|
MmCopyToCaller( UnsafePoints, Points, Count*sizeof(POINT) );
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,11 +148,23 @@ CoordLPtoDP(PDC Dc, LPPOINT Point)
|
||||||
y * Dc->w.xformWorld2Vport.eM22 + Dc->w.xformWorld2Vport.eDy;
|
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
|
BOOL STDCALL
|
||||||
W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count)
|
W32kLPtoDP(HDC hDC, LPPOINT UnsafePoints, INT Count)
|
||||||
{
|
{
|
||||||
PDC Dc;
|
PDC Dc;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
LPPOINT Points = (LPPOINT) ExAllocatePool( PagedPool, Count*sizeof(POINT));
|
||||||
|
|
||||||
|
ASSERT(Points);
|
||||||
|
MmCopyFromCaller( Points, UnsafePoints, Count*sizeof(POINT) );
|
||||||
|
|
||||||
Dc = DC_HandleToPtr (hDC);
|
Dc = DC_HandleToPtr (hDC);
|
||||||
if (Dc == NULL)
|
if (Dc == NULL)
|
||||||
|
@ -147,16 +177,22 @@ W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count)
|
||||||
CoordLPtoDP(Dc, &Points[i]);
|
CoordLPtoDP(Dc, &Points[i]);
|
||||||
}
|
}
|
||||||
DC_ReleasePtr( hDC );
|
DC_ReleasePtr( hDC );
|
||||||
|
MmCopyToCaller( UnsafePoints, Points, Count*sizeof(POINT) );
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
W32kModifyWorldTransform(HDC hDC,
|
W32kModifyWorldTransform(HDC hDC,
|
||||||
CONST LPXFORM XForm,
|
CONST LPXFORM UnsafeXForm,
|
||||||
DWORD Mode)
|
DWORD Mode)
|
||||||
{
|
{
|
||||||
PDC dc;
|
PDC dc;
|
||||||
|
LPXFORM XForm = (LPXFORM) ExAllocatePool( PagedPool, sizeof( XFORM ) );
|
||||||
|
|
||||||
|
ASSERT( XForm );
|
||||||
|
|
||||||
|
MmCopyFromCaller( XForm, UnsafeXForm, sizeof( XFORM ) );
|
||||||
|
|
||||||
dc = DC_HandleToPtr (hDC);
|
dc = DC_HandleToPtr (hDC);
|
||||||
if (!dc)
|
if (!dc)
|
||||||
|
|
Loading…
Reference in a new issue