:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / subsys / win32k / eng / handle.c
1 /*
2  * COPYRIGHT:         See COPYING in the top level directory
3  * PROJECT:           ReactOS kernel
4  * PURPOSE:           Manage GDI Handles
5  * FILE:              subsys/win32k/eng/handle.c
6  * PROGRAMER:         Jason Filby
7  * REVISION HISTORY:
8  *                 29/8/1999: Created
9  */
10
11 #include <ddk/winddi.h>
12 #include "handle.h"
13
14 #define NDEBUG
15 #include <win32k/debug1.h>
16
17
18 ULONG CreateGDIHandle(ULONG InternalSize, ULONG UserSize)
19 {
20   ULONG size;
21   PENGOBJ pObj;
22   int i;
23
24   //size = sizeof( ENGOBJ ) + InternalSize + UserSize;
25   size = InternalSize;          //internal size includes header and user portions
26   pObj = EngAllocMem( FL_ZERO_MEMORY, size, 0 );
27
28   if( !pObj )
29         return 0;
30
31   pObj->InternalSize = InternalSize;
32   pObj->UserSize = UserSize;
33
34   for( i=1; i < MAX_GDI_HANDLES; i++ ){
35         if( GDIHandles[ i ].pEngObj == NULL ){
36                 pObj->hObj = i;
37                 GDIHandles[ i ].pEngObj = pObj;
38                 DPRINT("CreateGDIHandle: obj: %x, handle: %d, usersize: %d\n", pObj, i, UserSize );
39                 return i;
40         }
41   }
42   DPRINT("CreateGDIHandle: Out of available handles!!!\n");
43   EngFreeMem( pObj );
44   return 0;
45 }
46
47 VOID FreeGDIHandle(ULONG Handle)
48 {
49   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
50         DPRINT("FreeGDIHandle: invalid handle!!!!\n");
51         return;
52   }
53   DPRINT("FreeGDIHandle: handle: %d\n", Handle);
54   EngFreeMem( GDIHandles[Handle].pEngObj );
55   GDIHandles[Handle].pEngObj = NULL;
56 }
57
58 PVOID AccessInternalObject(ULONG Handle)
59 {
60   PENGOBJ pEngObj;
61
62   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
63         DPRINT("AccessInternalObject: invalid handle: %d!!!!\n", Handle);
64         return NULL;
65   }
66
67   pEngObj = GDIHandles[Handle].pEngObj;
68   return (PVOID)pEngObj;
69 }
70
71 PVOID AccessUserObject(ULONG Handle)
72 {
73   PENGOBJ pEngObj;
74
75   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
76         DPRINT("AccessUserObject: invalid handle: %d!!!!\n", Handle);
77         return NULL;
78   }
79
80   pEngObj = GDIHandles[Handle].pEngObj;
81   return (PVOID)( (PCHAR)pEngObj + sizeof( ENGOBJ ) );
82 }
83
84 ULONG AccessHandleFromUserObject(PVOID UserObject)
85 {
86   PENGOBJ pEngObj;
87   ULONG Handle;
88
89   if( !UserObject )
90         return INVALID_HANDLE;
91
92   pEngObj = (PENGOBJ)((PCHAR) UserObject - sizeof( ENGOBJ ));
93   Handle = pEngObj->hObj;
94
95   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
96         DPRINT("AccessHandleFromUserObject: inv handle: %d, obj: %x!!!!\n", Handle, pEngObj);
97         return INVALID_HANDLE;
98   }
99   return Handle;
100 }
101
102 PVOID AccessInternalObjectFromUserObject(PVOID UserObject)
103 {
104
105   return AccessInternalObject( AccessHandleFromUserObject( UserObject ) );
106 }
107
108 VOID InitEngHandleTable( void )
109 {
110         ULONG i;
111         for( i=1; i < MAX_GDI_HANDLES; i++ ){
112                 GDIHandles[ i ].pEngObj == NULL;
113         }
114 }