1 /* $Id: handle.c,v 1.8 2001/01/21 00:11:54 phreak Exp $
3 * reactos/subsys/csrss/api/handle.c
5 * Console I/O functions
7 * ReactOS Operating System
10 /* INCLUDES ******************************************************************/
12 #include <ddk/ntddk.h>
14 #include <csrss/csrss.h>
16 #include <ntdll/rtl.h>
18 /* FUNCTIONS *****************************************************************/
20 NTSTATUS
CsrGetObject( PCSRSS_PROCESS_DATA ProcessData
, HANDLE Handle
, Object_t
**Object
)
22 // DbgPrint( "CsrGetObject, Object: %x, %x, %x\n", Object, Handle, ProcessData->HandleTableSize );
23 if( (((ULONG
)Handle
) >> 2) - 1 > ProcessData
->HandleTableSize
)
25 DbgPrint( "CsrGetObject returning invalid handle\n" );
26 return STATUS_INVALID_HANDLE
;
28 *Object
= ProcessData
->HandleTable
[(((ULONG
)Handle
) >> 2) - 1];
29 // DbgPrint( "CsrGetObject returning\n" );
30 return *Object
? STATUS_SUCCESS
: STATUS_INVALID_HANDLE
;
34 NTSTATUS
CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData
,
38 if( (((ULONG
)Handle
) >> 2) - 1 > ProcessData
->HandleTableSize
|| ProcessData
->HandleTable
[(((ULONG
)Handle
) >> 2) - 1] == 0 )
39 return STATUS_INVALID_HANDLE
;
41 Object
= ProcessData
->HandleTable
[(((ULONG
)Handle
) >> 2) - 1];
42 if( InterlockedDecrement( &Object
->ReferenceCount
) == 0 )
43 switch( Object
->Type
)
45 case CSRSS_CONSOLE_MAGIC
: CsrDeleteConsole( (PCSRSS_CONSOLE
) Object
);
47 case CSRSS_SCREEN_BUFFER_MAGIC
: CsrDeleteScreenBuffer( (PCSRSS_SCREEN_BUFFER
) Object
);
49 default: DbgPrint( "CSR: Error: releaseing unknown object type" );
51 ProcessData
->HandleTable
[(((ULONG
)Handle
) >> 2) - 1] = 0;
52 return STATUS_SUCCESS
;
55 NTSTATUS
CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData
, PHANDLE Handle
, Object_t
*Object
)
60 for (i
= 0; i
< ProcessData
->HandleTableSize
; i
++)
62 if (ProcessData
->HandleTable
[i
] == NULL
)
64 ProcessData
->HandleTable
[i
] = Object
;
65 *Handle
= (HANDLE
)(((i
+ 1) << 2) | 0x3);
66 InterlockedIncrement( &Object
->ReferenceCount
);
67 return(STATUS_SUCCESS
);
70 NewBlock
= RtlAllocateHeap(CsrssApiHeap
,
72 (ProcessData
->HandleTableSize
+ 64) *
76 return(STATUS_UNSUCCESSFUL
);
78 RtlCopyMemory(NewBlock
,
79 ProcessData
->HandleTable
,
80 ProcessData
->HandleTableSize
* sizeof(HANDLE
));
81 RtlFreeHeap( CsrssApiHeap
, 0, ProcessData
->HandleTable
);
82 ProcessData
->HandleTable
= (Object_t
**)NewBlock
;
83 ProcessData
->HandleTable
[i
] = Object
;
84 *Handle
= (HANDLE
)(((i
+ 1) << 2) | 0x3);
85 InterlockedIncrement( &Object
->ReferenceCount
);
86 ProcessData
->HandleTableSize
= ProcessData
->HandleTableSize
+ 64;
87 return(STATUS_SUCCESS
);