65716481df4cba80931726783872c547e39b9dc3
[reactos.git] / reactos / 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 }