branch update for HEAD-2003050101
[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 static int LastHandle = MAX_GDI_HANDLES;
18
19 ULONG CreateGDIHandle(ULONG InternalSize, ULONG UserSize)
20 {
21   ULONG size;
22   PENGOBJ pObj;
23   int i;
24
25   //size = sizeof( ENGOBJ ) + InternalSize + UserSize;
26   size = InternalSize;          //internal size includes header and user portions
27   pObj = EngAllocMem( FL_ZERO_MEMORY, size, 0 );
28
29   if( !pObj )
30         return 0;
31
32   pObj->InternalSize = InternalSize;
33   pObj->UserSize = UserSize;
34
35   for( i = (MAX_GDI_HANDLES - 1 <= LastHandle ? 1 : LastHandle + 1); i != LastHandle;
36        i = (MAX_GDI_HANDLES - 1 <= i ? 1 : i + 1) ){
37         if( GDIHandles[ i ].pEngObj == NULL ){
38                 pObj->hObj = i;
39                 GDIHandles[ i ].pEngObj = pObj;
40                 DPRINT("CreateGDIHandle: obj: %x, handle: %d, usersize: %d\n", pObj, i, UserSize );
41                 LastHandle = i;
42                 return i;
43         }
44   }
45   DPRINT1("CreateGDIHandle: Out of available handles!!!\n");
46   EngFreeMem( pObj );
47   return 0;
48 }
49
50 VOID FreeGDIHandle(ULONG Handle)
51 {
52   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
53         DPRINT1("FreeGDIHandle: invalid handle!!!!\n");
54         return;
55   }
56   DPRINT("FreeGDIHandle: handle: %d\n", Handle);
57   EngFreeMem( GDIHandles[Handle].pEngObj );
58   GDIHandles[Handle].pEngObj = NULL;
59 }
60
61 PVOID AccessInternalObject(ULONG Handle)
62 {
63   PENGOBJ pEngObj;
64
65   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
66         DPRINT1("AccessInternalObject: invalid handle: %d!!!!\n", Handle);
67         return NULL;
68   }
69
70   pEngObj = GDIHandles[Handle].pEngObj;
71   return (PVOID)pEngObj;
72 }
73
74 PVOID AccessUserObject(ULONG Handle)
75 {
76   PENGOBJ pEngObj;
77
78   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
79         DPRINT1("AccessUserObject: invalid handle: %d!!!!\n", Handle);
80         return NULL;
81   }
82
83   pEngObj = GDIHandles[Handle].pEngObj;
84   return (PVOID)( (PCHAR)pEngObj + sizeof( ENGOBJ ) );
85 }
86
87 ULONG AccessHandleFromUserObject(PVOID UserObject)
88 {
89   PENGOBJ pEngObj;
90   ULONG Handle;
91
92   if( !UserObject )
93         return INVALID_HANDLE;
94
95   pEngObj = (PENGOBJ)((PCHAR) UserObject - sizeof( ENGOBJ ));
96   Handle = pEngObj->hObj;
97
98   if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
99         DPRINT1("AccessHandleFromUserObject: inv handle: %d, obj: %x!!!!\n", Handle, pEngObj);
100         return INVALID_HANDLE;
101   }
102   return Handle;
103 }
104
105 PVOID AccessInternalObjectFromUserObject(PVOID UserObject)
106 {
107
108   return AccessInternalObject( AccessHandleFromUserObject( UserObject ) );
109 }
110
111 VOID InitEngHandleTable( void )
112 {
113         ULONG i;
114         for( i=1; i < MAX_GDI_HANDLES; i++ ){
115                 GDIHandles[ i ].pEngObj = NULL;
116         }
117 }