65716481df4cba80931726783872c547e39b9dc3
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
;