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
11 #include <ddk/winddi.h>
15 #include <win32k/debug1.h>
17 static int LastHandle = MAX_GDI_HANDLES;
19 ULONG CreateGDIHandle(ULONG InternalSize, ULONG UserSize)
25 //size = sizeof( ENGOBJ ) + InternalSize + UserSize;
26 size = InternalSize; //internal size includes header and user portions
27 pObj = EngAllocMem( FL_ZERO_MEMORY, size, 0 );
32 pObj->InternalSize = InternalSize;
33 pObj->UserSize = UserSize;
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 ){
39 GDIHandles[ i ].pEngObj = pObj;
40 DPRINT("CreateGDIHandle: obj: %x, handle: %d, usersize: %d\n", pObj, i, UserSize );
45 DPRINT1("CreateGDIHandle: Out of available handles!!!\n");
50 VOID FreeGDIHandle(ULONG Handle)
52 if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
53 DPRINT1("FreeGDIHandle: invalid handle!!!!\n");
56 DPRINT("FreeGDIHandle: handle: %d\n", Handle);
57 EngFreeMem( GDIHandles[Handle].pEngObj );
58 GDIHandles[Handle].pEngObj = NULL;
61 PVOID AccessInternalObject(ULONG Handle)
65 if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
66 DPRINT1("AccessInternalObject: invalid handle: %d!!!!\n", Handle);
70 pEngObj = GDIHandles[Handle].pEngObj;
71 return (PVOID)pEngObj;
74 PVOID AccessUserObject(ULONG Handle)
78 if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
79 DPRINT1("AccessUserObject: invalid handle: %d!!!!\n", Handle);
83 pEngObj = GDIHandles[Handle].pEngObj;
84 return (PVOID)( (PCHAR)pEngObj + sizeof( ENGOBJ ) );
87 ULONG AccessHandleFromUserObject(PVOID UserObject)
93 return INVALID_HANDLE;
95 pEngObj = (PENGOBJ)((PCHAR) UserObject - sizeof( ENGOBJ ));
96 Handle = pEngObj->hObj;
98 if( Handle == 0 || Handle >= MAX_GDI_HANDLES ){
99 DPRINT1("AccessHandleFromUserObject: inv handle: %d, obj: %x!!!!\n", Handle, pEngObj);
100 return INVALID_HANDLE;
105 PVOID AccessInternalObjectFromUserObject(PVOID UserObject)
108 return AccessInternalObject( AccessHandleFromUserObject( UserObject ) );
111 VOID InitEngHandleTable( void )
114 for( i=1; i < MAX_GDI_HANDLES; i++ ){
115 GDIHandles[ i ].pEngObj = NULL;